node-red/node.js プログラミングdoilab.net/web/jisyu/etc/iot/ni18_20web.pdf · 2018. 8....
TRANSCRIPT
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版と同様にインス
2
トールの作業が必要になります。もしフルバージョンがインストール済みの RaspberryPiをお持ちでしたら以下は読み
飛ばしてください。
図 2.3に示すように RaspberryPiには大きくわけて4つのアクセス方法があります。Node-REDを使う場合、webブラ
ウザ経由の Node-REDエディタが中心になります。通常の GUI画面を直接接続することが不要になり組み込みコンピュ
ータのように利用することができます。ただ、RaspberryPiZeroW の場合はこの SSH 接続とシリアル接続は開通してい
ませんので、少しだけ設定をしないといけません。ここでは通常の USB キーボード、HDMI ディスプレイの利用できる
場合とない場合の2つについて方法を紹介します。
図 2.2 RaspberryPiのダウンロードサイト
図 2.3 4つのアクセス方法
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のようにログインできます。
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 // 接続するネットワーク環境に合わせる
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 実行の様子
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 実行の様子
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 実行の様子
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などクラウドサービスを簡単に利用できる。
・多くの専用ノードがコミュニティベースも含め開発されている。
9
○Node-REDのユーザ・インターフェース
図 2.10 Node-RED エディタの各部の名称
○Node-REDの操作方法
※削除は削除したいノードあるいは接続を選択して ctrl-x か Delete キーを押します。
図 2.11 Node-REDの操作方法
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
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とも同様に動作します。
12
図 2.14 もっとも簡単なフロー
図 2.15 フローを動かす
13
Payloadの設定
図 2.16 インジェクトノードのプロパティ
繰り返しの設定、5秒毎に設定
図 2.17インジェクトノードのプロパティ
14
図 2.18 繰り返しの動作
15
(3)function node を試す
function node にはNode.jsのコードを書くことができます。繰り返しの for文など、一般的な構文はほとんど記
述できます。また別パッケージを呼び出す require()もNode-RED全体の設定として取り込み、functionノードで利用
することができます。つまりNode.jsでできたことはほぼNode-RED にもポーティングできるということです。
図 2.19 はループの例です。フローだけをみると出力が無いよう見えますが、function ノードの中で console.log()を
使用してコマンドプロンプトに出力しています。
図 2.19 ループの例
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;