node-red/node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8....

16
1 2.Node-RED/Node.js プログラミング 本章では Node.js 上での動作を想定した JavaScript プログラミングと、Node.js をベースにした簡易プログラミン グツールの Node-RED について紹介します。 2.0 環境の準備 (1)PC へのインストール 前章でもふれたように、Node.jsはある程度のハードウェア規模があれば実現できますが、一般にPC、あるいは、Linux 上で構成します。PC へのインストールについて紹介します。PC へのインストールの場合、図 2.1 の Node.js の公式サ イトから案内に従って進んでいけば簡単にインストールできます。 図 2.1 Node.js 公式サイト (2) Raspberry Pi0W へのインストール~Rasbian-liteのインストールから 電子工作でよく使用される RaspberryPI Linux が搭載され Node.js Node-RED が利用できますす。 RaspberryPI の入門的な利用ではディスプレイとキーボードを接続して PC のように操作する方法が中心に紹介されていますが、 Node.jsNode-RED での利用と考えた場合、伝統的な Linux の操作方法であるターミナル接続を利用する方がボード 以外のリソースが不要でコンパクトになり、特に組み込み機器としての利用には適当です。 ターミナル接続をメインに利用するなら通常の Noobs 版もある標準パッケージよりも GUI 機能が省略された lite バ ージョンを使用する方がシステム全体がコンパクトに実現できます。2018 年7月時点での最新版は「RASPBIAN STRETCH lite、リリース 2018.06.27、カーネルバーション 4.14」 です。ダウンロードする圧縮ファイルの大きさは約 350M バ イトでフルバージョン・Noobs 版の約 1/4 です。ダウンロードサイトを図 2.2 に示します。その分、SD カードへの書き 込み、システムのインストール、起動時間も短くなります。起動した様子を写真 2.1 に示します。ただ、フルバージョ ンでは Node.js、Node-RED ともインストール済みですが、lite バージョンは省略されているので PC 版と同様にインス

Upload: others

Post on 01-Jan-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

1

2.Node-RED/Node.jsプログラミング

本章では Node.js上での動作を想定した JavaScriptプログラミングと、Node.jsをベースにした簡易プログラミン

グツールの Node-REDについて紹介します。

2.0 環境の準備

(1)PCへのインストール

前章でもふれたように、Node.jsはある程度のハードウェア規模があれば実現できますが、一般に PC、あるいは、Linux

上で構成します。PCへのインストールについて紹介します。PCへのインストールの場合、図 2.1の Node.jsの公式サ

イトから案内に従って進んでいけば簡単にインストールできます。

図 2.1 Node.js公式サイト

(2) Raspberry Pi0W へのインストール~Rasbian-liteのインストールから

電子工作でよく使用されるRaspberryPIはLinux が搭載されNode.js、Node-REDが利用できますす。RaspberryPI

の入門的な利用ではディスプレイとキーボードを接続して PC のように操作する方法が中心に紹介されていますが、

Node.js、Node-RED での利用と考えた場合、伝統的なLinux の操作方法であるターミナル接続を利用する方がボード

以外のリソースが不要でコンパクトになり、特に組み込み機器としての利用には適当です。

ターミナル接続をメインに利用するなら通常の Noobs版もある標準パッケージよりも GUI機能が省略された liteバ

ージョンを使用する方がシステム全体がコンパクトに実現できます。2018年7月時点での最新版は「RASPBIAN STRETCH

lite、リリース 2018.06.27、カーネルバーション 4.14」 です。ダウンロードする圧縮ファイルの大きさは約 350Mバ

イトでフルバージョン・Noobs版の約 1/4です。ダウンロードサイトを図 2.2に示します。その分、SDカードへの書き

込み、システムのインストール、起動時間も短くなります。起動した様子を写真 2.1に示します。ただ、フルバージョ

ンでは Node.js、Node-REDともインストール済みですが、liteバージョンは省略されているので PC版と同様にインス

Page 2: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

2

トールの作業が必要になります。もしフルバージョンがインストール済みの RaspberryPiをお持ちでしたら以下は読み

飛ばしてください。

図 2.3に示すように RaspberryPiには大きくわけて4つのアクセス方法があります。Node-REDを使う場合、webブラ

ウザ経由の Node-REDエディタが中心になります。通常の GUI画面を直接接続することが不要になり組み込みコンピュ

ータのように利用することができます。ただ、RaspberryPiZeroW の場合はこの SSH 接続とシリアル接続は開通してい

ませんので、少しだけ設定をしないといけません。ここでは通常の USB キーボード、HDMI ディスプレイの利用できる

場合とない場合の2つについて方法を紹介します。

図 2.2 RaspberryPiのダウンロードサイト

図 2.3 4つのアクセス方法

Page 3: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

3

写真 2.1 ディスプレイとキーボードを使用した起動の様子

○USBキーボード、HDMIディスプレイの利用できる場合

まず raspi-configコマンドを使って Wifiをアクティブにします。アクティブにするには「5 Interfacing Options」

「P2 SSH」と進みます。そのあとエディタを使って

/etc/ wpa_supplicant/wpa_supplicant.conf

というファイルの

update_config=1

のあとにリスト1のように使用するWiFi環境の IDとパスワードを追記します。

atermxxxx と passxxxx はご使用になる環境に合わせて変更ください。

リスト 2.1 /etc/wpa_supplicant/wpa_supplicant.conf Wifi設定

country=JP

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

update_config=1

network={

ssid="atermxxxx"

psk="passxxxx"

}

このあと再起動すれば RaspberryPiとアクセスポイントの間で Wifi接続が行われます。そのあと TeraTerm等の SSH接

続可能なターミナルソフトで接続します。DHCP接続ですので取得した IPアドレスはルータから調べるか、もう一度 USB

キーボード・HDMI接続ディスプレイを使って ifconfigコマンドで確かめます。そのあとその IPアドレスにアクセス

すると図 2.4のようにログインできます。

Page 4: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

4

図 2.4 Wifi経由の SSH接続

○キーボード、ディスプレイを使わない SSH開設方法 その1

Win32DiskImagerなど SDカード書き込みソフトで作成される RaspberryPiの SDカードはそれぞれ FATと Ext4にフ

ォーマットされた2つのパーティションからなります。このうち FAT側は PCからもアクセスできるで、ここに「おま

じない」をして RaspberryPiで起動させると、いろんなオプションが可能になります。そのうちの1つに SSHの設定を

アクティブにし Wifiの設定も併せて行うことができます。

SSH 開通のための「おまじない」は2つです。1つは FAT 領域に「ssh」という名前の空のファイルを置いてやりま

す。もう1つは、キーボード、ディスプレイを使った場合と同様の wpa_supplicant.conf を同じく FAT パーティショ

ンに置きます。そのあと、RaspberryPi に SD カードをセットして起動します。こちらの方法では取得した IP アドレ

スをこの時点でRaspberryPiから知ることはできませんので、ルータの接続ステータスを見るか PCで Bonjourなどの

名前解決ツールを動かすかして取得します。そのあと、PCと同様に Node.js、Node-REDをインストールします。Node.js

は公式サイトからのリンクではなく以下のコマンドを使います。

> sudo apt-get install nodejs

あるいは、以下のサイトにある Node-REDアップグレードスクリプトを実行するのも便利です。

https://nodered.jp/docs/hardware/raspberrypi

○キーボード、ディスプレイを使わない SSH開設方法 その2

内側の USBポートを利用して PC側に仮想ネットワークアダプタを用意すれば、仮想ネットワーク経由で接続するこ

とができます。

○固定 IPアドレスの設定方法

固定 IPアドレスを利用する場合は、/etc/dhcpcd.conf に以下の記述を行います。

interface wlan0 // 有線の場合は eth0

static ip_address=192.168.0.100/24

static routers=192.168.0.1

static domain_name_servers=xxx.xxx.xxx.xxx // 接続するネットワーク環境に合わせる

Page 5: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

5

2.1 Node.jsの概要

○パッケージ(ライブラリ)の使い方 ~npm~

Node.js では npm と呼ぶ管理ツールを使ってパッケージ(ライブラリ)を管理します。いくつかのオプションがあ

りますが、よくつかうのは install コマンドです。

> npm install [-g] [パッケージ名]

パッケージ名でインストールするパッケージを指定します。 パッケージは最新版がインストールされますが パッケ

ージ名@バージョン([email protected]) とするとバージョンを指定することができます。

-g (--global) はグローバルインストールのオプションです。共通に利用するもの、コマンドライン上で起動させ

るものはグローバルインストールにします。

-g を付けない場合、カレントのプロジェクトに node_modules のフォルダーを作って、インストールされます。

また、 パッケージ名を省略するとカレントのプロジェクトにあるpackage.jsonに従ってパッケージをまとめてイ

ンストールします。

2.2 Node.js プログラミング

インストールが完成すれば、Node.js環境での JavaScriptを試すことができます。メモ帳を使ってプログラムを記

述し

>node xxx.js

とタイプし実行します。

(1)ループ

ループを試してみます。これは従来の JavaScript と同じで C 言語ともよく似ています。その様子を図 2.5 に

示します。

リスト202 list202.js

var n;

for (n = 0; n < 10; n++ ){

console.log('n=' + n);

}

図 2.5 実行の様子

Page 6: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

6

(2)非同期動作を試す

Node.js で特徴的なコールバック関数の例を試してみます。コールバックとは図 2.6に示すように処理が済むまで

関数内でまたされることなく、デッドロックが起こりにくいといわれています。リスト3ではコールバックされる関数

を別途名前を付けて用意していますが、javaでよくやるように関数の引数の中に無名関数として書くこともよく行わ

れます。少し複雑なプログラムだと無名関数の中に無名関数といったことがおこり読み辛くなります。

実行結果を図 2.7に示します。注目したいところは、「return」の文字が先に出力されている点です。つまり、実際

ファイル読み出しの処理はその準備が整ったあとから処理されているということです。

図 2.6 同期と非同期(コールバック)

リスト3 list3.js

var fs = require('fs');

fs.readFile('./TextFile.txt', 'utf8', fs_func);

console.log('return');

function fs_func(err, text) {

console.log('read TextFile.txt');

console.log(text);

console.log('error');

console.log(err);

}

リスト4 データファイル TextFile.txt

abcd

1234

図 2.7 実行の様子

Page 7: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

7

(3)タイマを試す

コールバックが基本であることはより時間的な動作、例えばタイマ割込みや受信信号待ちのプログラムなども同様な

書き方で記述することができます。

インターバルタイマを試します。リスト 5は user_timer()関数を用意して、setInterval() 関数で 1秒毎に呼び出

すようタイマを作成しています。実行の様子を図 2.8に示します。さらに、このプログラムは PCやシングルボードコ

ンピュータ上の Linux、クラウド上のサービスなど異なるハードウェアであっても変更なしに実現できるということも

重要です。

リスト 5 list5.js

var count = 0;

var id = setInterval(user_timer, 1000);

function user_timer() {

console.log('interval ' + count);

count++;

if (count >= 10) clearInterval(id);

}

図 2.8 実行の様子

Page 8: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

8

2.3 Node-REDを試す ~多様なツールの使いこなしが重要~

(1)Node-RED とは

Node-RED は、ハードウェアデバイス、API、インラインサービスを連携させて、ロジックを作成できるフローエ

ディターです。図2.9にNode-REDのポータルサイトを示します。

図 2.9 Node-RED のサイト

○インストール

・PCへのインストール

・RaspberryPiへのインストール

PC、RaspberryPi とも node.js がインストールされている環境であれば、ライブラリと同様に npmを使ってインス

トールします。

npm install -g --unsafe-perm node-red

RaspberryPiの場合以下のWebページのスクリプトを利用すると便利です。

https://nodered.jp/docs/hardware/raspberrypi.html

○特徴

・Webブラウザベースのユーザインターフェース

・Node.jsで駆動・軽量

・機能をノードという単位でカプセル化して利用

・独自ノードの作成・追加可能

・BluemixやAzureなどクラウドサービスを簡単に利用できる。

・多くの専用ノードがコミュニティベースも含め開発されている。

Page 9: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

9

○Node-REDのユーザ・インターフェース

図 2.10 Node-RED エディタの各部の名称

○Node-REDの操作方法

※削除は削除したいノードあるいは接続を選択して ctrl-x か Delete キーを押します。

図 2.11 Node-REDの操作方法

Page 10: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

10

○Node-RED の各ノード

図 2.12

○その他の Node-REDの操作

Node-Redのそのほかの設定等について紹介します。

・Node-RED 全体の設定ファイル

PCの場合

C:¥Users¥ユーザー名¥AppData¥Roaming¥npm¥node_modules¥node-red¥settings.js

RaspberryPi の場合

/root/.node-red/settings.js

・フローの削除、以下の json ファイルを削除します。

PCの場合

C:¥Users¥ユーザー名¥.node-red¥flows_コンピュータ名.json

RaspberryPiの場合

/home/pi/.node-red/flows_raspberrypi.json

Page 11: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

11

(2)試してみる~ インジェクトノードとデバッグノード

まずは PCで使ってみます。コマンドプロンプトから

>node-red

とタイプして Node-RED を起動します。そのあとブラウザで

localhost:1880

をアクセスします。

図 2.13 Node-REDを起動する

まず、図 2.14のように、2つのノードをドラッグしてキャンバスに置いてみましょう。injectノードのキャプション

が timestamp に変わっています。debugノードもmsg.payload に変わっています。情報タグにはアクティブになって

いるノードの情報が示されます。この状態で配線しデプロイしてみましょう。そのままでは何もおこりませんが、情報

タグをデバッグタグに切り替え injectノードの左側のボタンを押してみてください。すると図 2.15に示すように inject

ノードから現在の時間が出力されデバッグタグに表示されます。

各ノードをクリックするとそれぞれのノードの動作を設定するプロパティタグが現れます。図2.16、図 2.17は inject

ノードのプロパティです。多くの設定項目がありますがたとえば「繰り返し」を設定することで連続してデータを送り

だすことができます。図2.18は1秒毎に送りだすよう変更したフローです。デバックノードの出力をみると3桁目の

数値が1づつ、つまり1秒づつ増えていることが分かります。

これらのフローはPC上のNode-RED、RaspberryPi上のNode-REDとも同様に動作します。

Page 12: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

12

図 2.14 もっとも簡単なフロー

図 2.15 フローを動かす

Page 13: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

13

Payloadの設定

図 2.16 インジェクトノードのプロパティ

繰り返しの設定、5秒毎に設定

図 2.17インジェクトノードのプロパティ

Page 14: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

14

図 2.18 繰り返しの動作

Page 15: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

15

(3)function node を試す

function node にはNode.jsのコードを書くことができます。繰り返しの for文など、一般的な構文はほとんど記

述できます。また別パッケージを呼び出す require()もNode-RED全体の設定として取り込み、functionノードで利用

することができます。つまりNode.jsでできたことはほぼNode-RED にもポーティングできるということです。

図 2.19 はループの例です。フローだけをみると出力が無いよう見えますが、function ノードの中で console.log()を

使用してコマンドプロンプトに出力しています。

図 2.19 ループの例

Page 16: Node-RED/Node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8. 31. · グツールのNode-REDについて紹介します。 2.0 環境の準備 (1)PCへのインストール

16

○Node-REDでの変数

フロー全体、node内など、C言語でのグローバル変数、静的変数のような変数を使うことができます。図2.20はグ

ローバル変数の例です。互いに独立しているノード間でデータを受け渡すことができています。また function ノード

内での静的変数は context.set()と context.get()を利用することで実現できます。

図 2.20 グローバル変数の利用例

リスト7 上側の functionノード内のスクリプト

グローバル変数を試す、変数をインクリメント

var count = global.get('g_count')||0;

count ++;

global.set('g_count', count);

msg.payload = count;

return msg;

リスト8 下側の functionノード内のスクリプト

グローバル変数を試す、変数を取り出し

msg.payload = global.get('g_count')||0;

return msg;