Node-REDからAWS IoT Coreを使用する(後編)

前回はAWS IoT Coreの設定までを行いました。

uepon.hatenadiary.com

今回はその続きになります。

手順のおさらい

作業の手順をおさらいします。

  1. AWS IoT Coreの準備
  2. RaspberryPiへ必要なファイル(証明書情報など)をコピー
  3. RaspberryPiNode-REDの準備
  4. AWS IoT Coreを使用するためのNode-REDの拡張ノードの導入
  5. 拡張ノードからAWS IoT Coreを動作させる(送信・受信)

前編では 1.と 2. を行ってきましたので、この後編で 3. 以降を取り扱います。割りと作業が少ないのでサクッと終わるかもしれません。

RaspberryPiのNode-REDの準備

特にRaspberryPiを使用しなくてもいいのかなと思いますが、せっかくならIoTデバイスを!ということで使用しています。

以下のコマンドでインストール(バージョンアップを兼ねることができます)していきます。

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Node-REDも気がつけばバージョン3系になっているんですねえ。少し使ってないとかなりバージョンが変わってしまうので少なくともメジャーバージョンがアップしたら触って見るようにしないと。

インストールが終わったらNode-REDを起動します。起動の仕方もいろいろありますが、自分はCLIで直接実行します。

$ node-red

無事に起動しました。

あとは、ブラウザからRaspberryPiと1880ポートを使用してアクセスします。mDNSで名前の解決ができるなら以下のURLでアクセスすればOKです。

http://raspberrypi.local:1880

すると、フローエディタが起動します。

AWS IoT Coreを使用するためのNode-REDの拡張ノードの導入

ここまで来たらAWS IoT Coreを使用するための拡張ノードをインストールします。画面の右上にある【三】をクリックして、表示されたプルダウンメニューから【パレットの監視】をクリックします

そして、【ユーザ設定】画面の【ノードの追加】タブを選び、名前を指定してインストールをしていくのですが、今回使用する拡張ノードnode-red-contrib-aws-iotを検索しても候補が存在しません。初めての経験です。

Web検索するとちゃんと情報はでてくるので

flows.nodered.org

仕方がないので、今回はCLIからインストールします。一度、フローエディタを終了し、以下のように実行して拡張ノードをインストールしていきます。

$ cd ~/.node-red
$ npm install node-red-contrib-aws-iot

これで正常にインストールできました。再度、Node-REDを起動してみます。

$ node-red

すると左側のペイン(パレット)に以下のような拡張ノードが追加されています。入力カテゴリーにaws-iot-inと出力カテゴリーにaws-iot-outの拡張ノードが追加されています。

これでNode-REDの準備が完了しました。

拡張ノードからAWS IoT Coreを動作させる(送信・受信)

あとは導入した拡張ノードを使用してAWS IoT Coreの動きを確認します。 2つのフローを作成します。

  • injectノードaws-iot-inノードを接続
  • aws-iot-outノードdebugノードを接続

実際には以下の様になっていると思います。

aws-iot-inノードのプロパティ設定

あとはAWS IoT Coreに接続する設定していきます。aws-iot-inノードをダブルクリックし

aws-iot-inノードの編集】画面のプロパティで【Server】の【ペンアイコン】ボタンをクリックして編集を行っていきます。

すると、【aws-iot-broker設定ノードの追加】画面になります。目には見えないノードですが、ここで行った設定はaws-iot-outノードでも使用することになります。

Connectionタブでの設定は以下の様に行います。

  • Server … AWS IoT Coreで作成したエンドポイント
  • Client ID … AWS IoT Coreで作成したモノ
  • Port … 8883

以下の部分を設定することになります。

続いては【Security】タブをクリックして、以下のように設定をしていきます。

  • Key Path … AWS IoT Core作成時にダウンロードしたKeyファイルのフルパス(拡張子pem.key)
  • Cert Path … AWS IoT Core作成時にダウンロードしたCertファイルのフルパス(拡張子pem.crt)
  • CA Path … AWS IoT Core作成時にダウンロードしたCAファイルのフルパス(拡張子pem)

以下で使用するファイルを抑えておきます。

設定画完了したら【追加】ボタンをクリックしてます。

クリックすると【aws-iot-inノードの編集】画面に戻ります。設定値はモノ@エンドポイント:8883となっていればOKです。

あとは残りのフィールドの設定を行います。

  • Topic … data/RaspberryPi
  • Name … RaspberryPi

設定ができたら【完了】ボタンをクリックします。

aws-iot-outノードのプロパティ設定

aws-iot-outノードを設定します。ノードをダブルクリックして

aws-iot-outノードを編集】画面から【Server】のプルダウンをクリックして

先ほど作成した設定を選択します。

残る設定も以下のように設定します。

  • Topic … data/RaspberryPi
  • Name … RaspberryPi

設定したら【完了】ボタンをクリックします。

これで以下の様になっていれば設定が完了です。

あとは【デプロイ】ボタンをクリックして aws-iot-inノードaws-iot-outノードの下にconnectedが表示されていれば成功です。

AWS IoT Coreにデータを送信・受信する

あとは実行の確認になります。AWS IoT Coreをマネージメントコンソールをブラウザから開きます。

左側のペインの【テスト】→【MQTTテストクライアント】をクリックします。

Subscribe(データの受信)

まずはSubscribeの設定(データの受信設定)を行います。

【Subscribe to a topic】タブをクリックして、以下のフィールドに入力をしていきます。

  • Topic filter … data/RaspberryPi

入力後に【Subscribe】ボタンをクリックします。

画面下部の【Subscriptions】の部分にdata/RaspberryPiが表示されます。

Node-REDのフローエディタのデバック画面を見ると

Node-RED側でJSONデータが受信されています。これでデータの受信が成功しました。

AWS IoT Coreの画面にも送信されたJSONデータが表示されています。


ちなみに【Edit】ボタンを押すとQOSなどの設定が表示されます。問題なければ【Confirm】ボタンをクリックします。

Publish(データの送信)

続いてPublishの設定(データの送信設定)を行います。

【Publish to a topic】タブをクリックして、以下のフィールドに入力をしていきます。

  • Topic filter … data/RaspberryPi

入力後に【Publish】ボタンをクリックします。

Node-REDのフローのinjectノードのボタンをクリックするとNode-REDから時刻データを送信して

AWS IoT Coreの画面にも受信され時刻情報が表示されています。

データの送受信ともに動作の確認ができました。

おわりに

Node-REDを併用することでコードをほぼ使用することなくAWS IoT Coreを使ったMQTTのデータ送受信をテストすることができました。実際にはこの後データの格納などを行う処理を追加していくことになるかと思います。

WebのUIは画面が変わるだけでもかなりのハードルが上がることがあるため、やっぱりきついなあという印象は大きいですね。あと、今回はnode-red-contrib-aws-iotがフローエディタのノードの追加からできなかったのがちょっとびっくりした点でしょうか。npmコマンドを使うことでインストールできますが、初めての事象だったので結構ドキドキしました。

今回はAWS関連のLTを行うということで実験してみたのですが、他のクラウド環境でもデータの格納がどうなっているのか興味がでてきました。

/* -----codeの行番号----- */