| | 3章Armadillo のセットアップ を完了している場合は Armadillo を起動すると、自動的に Node-RED コンテナが起動します。
Node-RED への接続には 「ネットワークに接続する」 で取得した IP アドレスを使用します。 パソコンの Web ブラウザから、http://<ipアドレス>:1880/ にアクセスしてください。 Node-RED には大きく 3 つの領域があります。
パレット
使用可能なコアノード、カスタムノードの一覧を表示します。
ワークスペース
Node-RED では一つのアプリケーションの流れをフローという単位で表します。
ワークスペース上にノードを繋げてフローを作成します。
パレットから必要なノードをワークスペースにドラッグ、ドロップで配置します。
サイドバー
選択したノードの情報や、デバッグメッセージを表示します。
4.2. Node-RED コンテナのログを表示するパソコンの Web ブラウザから、http://<ipアドレス>:1880/node-red.log にアクセスすると Node-RED コンテナのログが表示されます。 このログファイルは /var/app/rollback/volumes/node-red/log に保存されています。ログのサイズが 5MB を超えると新しいログファイルに移行します。
古いログファイルを表示したい場合は、http://<ipアドレス>:1880/node-red.log.1 にアクセスしてください。 4.3. Node-RED で利用可能なノードの一覧3章Armadillo のセットアップ でインストールした Node-RED コンテナには Node-RED のコアノードの他にインストールされているカスタムノードがあります。
インストール済のカスタムノードは以下になります。 Node-RED では一つのアプリケーションの流れをフローという単位で表します。
各ノードを使用したフローの作成方法について紹介します。 ここでは、LED を1秒間隔で点滅するフローを作成します。すべて Node-RED のコアノードを使用します。
Armadillo-640 の LED は以下がありますが、今回対象にするのはユーザー LED(緑) です。
ユーザー LED(緑) の場所については 「インターフェースレイアウト」 をご確認ください。 ユーザー LED(緑) は /sys/class/leds/green/brightness ファイルへ値を書き込むことによって、LEDの点灯/消灯を行うことができます。
0 を書き込むと消灯、0 以外の値 (1~255) を書き込むと点灯します。 表4.1 LED 信号配列 部品番号 | 名称(色) | 説明 |
---|
LED3 | ユーザー LED(赤) | i.MX6ULLのGPIO1_IO05ピンに接続、(Low: 消灯、High: 点灯) | LED4 | ユーザー LED(緑) | i.MX6ULLのGPIO1_IO08ピンに接続、(Low: 消灯、High: 点灯) | LED5 | ユーザー LED(黄) | i.MX6ULLのUART1_CTS_Bピンに接続、(Low: 消灯、High: 点灯) |
-
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
[inject] ノードのプロパティを編集します。[inject] は 2 秒間隔で実行します。
名前: LED Blink
繰り返し: 指定した時間間隔
時間間隔: 2秒
-
[trigger] ノードをドラッグ、ドロップします。
[trigger] ノードのプロパティを編集します。
[trigger] は 1 を送信して 1 秒待機後、0 を送信します。これにより点滅動作を実現します。
送信データ:1
送信後の処理:指定した時間待機
1 秒
再送信データ:0
-
[LED Blink] ノードの右側にある端子をクリックし、[trigger] ノードの左側の端子を選択して放します。
-
[write file] ノードをドラッグ、ドロップします。
[write file] ノードのプロパティを編集します。
/sys/class/leds/green/brightness ファイルへ [trigger] からの送信データを書き込みます。
ファイル名: /sys/class/leds/green/brightness
動作: ファイルを上書き
文字コード: デフォルト
名前: green LED
-
[trigger] ノードの右側にある端子をクリックし、[green LED] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[green LED] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。ユーザー LED(緑) が 1 秒毎に点滅を繰り返す動きをすれば成功です。
ここでは、 Armadillo-640 の CPU の測定温度を1秒間隔で取得するフローを作成します。全て Node-RED のコアノードを使用します。
/sys/class/thermal/thermal_zone0/temp ファイルの値を読み出すことによって測定温度を取得することができます。
温度はミリ°C の単位で表示されるため、°C 単位への変換も行います。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
[inject] ノードのプロパティを編集します。[inject] は 1 秒間隔で実行します。
繰り返し: 指定した時間間隔
時間間隔: 1 秒
-
[read file] ノードをドラッグ、ドロップします。
[read file] ノードのプロパティを編集します。
/sys/class/thermal/thermal_zone0/temp ファイルの値を読み出します。
ファイル名: /sys/class/thermal/thermal_zone0/temp
出力形式: 文字列
文字コード: デフォルト
名前: CPU temp
-
[Get CPU temp] ノードの右側にある端子をクリックし、[CPU temp] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
CPU の測定温度がミリ°C の単位のため、°C の単位へ変換します。
msg.payload で渡された値を 1000 で割り、msg.payload に戻します。
名前: CPU temp calc
コード:
msg.payload = msg.payload / 1000;
return msg;
-
[CPU temp] ノードの右側にある端子をクリックし、[CPU temp calc] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[CPU temp calc] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。デバッグメッセージに 1 秒毎に CPU の測定温度が表示されます。
4.4.3. RS-485 modbus RTU 読み出しを行うここでは、 USB RS-485 変換器を使用した Modubus RTU 読み出し用フローを作成します。
Node-RED のコアノードのほかに modbus-client ノード、Modbus-Read ノード、 modbus-response ノードを使用します。
RS-485 シリアルインターフェースのデバイスファイルは、/dev/ttyUSB0 を使用します。
USB の場所については 「インターフェースレイアウト」 をご確認ください。
今回は以下のRS-485通信対応デバイスを想定した場合の設定内容となります。
実際に動作確認する場合は、使用するRS-485通信対応デバイスの設定に変更してください。 ユニットID: 1
通信プロトコル: Modbus RTU
ボーレート: 9600
読み出しアドレス: 0x00
ファンクションコード: 1 -
パレットから [Modbus-Read] ノードをワークスペースにドラッグ、ドロップします。
-
[Modbus-Read] ノードのプロパティを編集します。
先に Server を設定する必要があります。[新規に modbus-client を追加] の右隣の編集ボタンを押して [modbus-client] を作成します。
名前: RS485 slave device
Type: Serial
Serial port: /dev/ttyUSB0
Serial type: RTU
Baud rate: 9600
Unit-Id: 1
[Modbus-Read] ノードのプロパティを編集します。
名前: slave device
トピック:
Unit-Id:
FC: FC 1:Read Coil Status
Address: 0
Quantity: 1
Poll Rate: 1 Second(s)
Server: RS485 slave device
-
[Modbus-Response] ノードをドラッグ、ドロップします。
[slave device] ノードの右側にある端子をクリックし、[Modbus-Response] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。読み出しに成功すると1 秒毎に読みだした値が更新され [Modbus-Response] ノードの下に表示されます。
4.4.4. CPU の測定温度のグラフをダッシュボードに表示する「CPU の測定温度を取得する」 で取得した CPU 温度をダッシュボードにグラフとして表示するフローを作成します。
サイドバーの右端にある三角形のボタンを押し、[ダッシュボード] を選択します。
[ダッシュボード] 編集画面が表示されることを確認します。
[+タブ] ボタンを押して [Tab1] を追加します。
[Tab1] プロパティを編集します。
名前: Armadillo
アイコン: dashboard
[Armadillo] タブが追加されました。
名前: Armadillo
アイコン: dashboard
[Armadillo] 横の [+グループ] ボタンを押して [Group1] を追加します。
名前: Armadillo
アイコン: dashboard
[Group1] プロパティを編集します。
名前: Group 1
タブ: Armadillo
種類:
幅: 15
□グループ名を表示する
[chart] ノードをワークスペースにドラッグ、ドロップします。ダッシュボード編集画面の [Group1] グループに追加されたことを確認します。
[chart] ノードのプロパティを編集します。
グループ: [Armadillo] Group 1
サイズ: 自動
ラベル: CPU temp
種類: 折れ線グラフ
X軸: 直近 1 時間
X軸ラベル: HH:mm:ss
Y軸: 最小 20 最大 50
凡例: 非表示 補完: 直線
[CPU temp calc] ノードの右側にある端子をクリックし、[CPU temp] ノードの左側の端子を選択して放します。
画面右上の [デプロイ] を押します。ダッシュボード編集画面の [テーマ] タブの右側にある四角に矢印が重なったボタンを選択すると、ダッシュボードが表示されます。
-
ダッシュボードの CPU 温度のグラフは一秒毎に更新されます。
ここでは、外部プログラムを実行しその結果を取得するフローを作成します。
外部プログラムは [exec] ノードで実行することができます。
ここでの外部プログラムとはシステムコマンドやユーザー自身が作成したプログラムのことを指します。 例として date コマンドを実行するフローを作成します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[exec] ノードをドラッグ、ドロップします。
[exec] ノードのプロパティを編集します。
コマンド: date
引数: なし
-
[indect] ノードの右側にある端子をクリックし、[exec] ノードの左側の端子を選択して放
します。
-
[debug] ノードをドラッグ、ドロップします。
[exec] ノードの右側の一番上にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すと [exec] ノードに設定した
date コマンドが実行され標準出力の結果が
デバッグメッセージに表示されます。
[exec] ノードの右の端子は上からそれぞれ「標準出力」「標準エラー出力」「返却コード」となっており、
取得したい出力によって使い分けることができます。 ここでは、 Node-RED を任意のタイミングで終了するフローを作成します。
Node-RED のコアノードのほかに exit ノードを使用します。 | |
---|
Node-RED 終了後、Node-RED を再起動するためには Armadillo-640 の電源を再投入する必要があります。 |
-
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします
[inject] ノードのプロパティを編集します。
名前: Finish Node-RED
繰り返し: なし
-
[exit] ノードをドラッグ、ドロップします。
[exit] ノードのプロパティを編集します。
Name: exit
Exit code: 0
[Finish Node-RED] ノードの右側にある端子をクリックし、[exit] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。[Finish Node-RED] ノードの左側にあるボタンを押すと Node-RED が終了します。
Node-RED に関するユーザデータは /var/app/rollback/volumes/node-red/root に保存されます。
当ディレクトリを削除した場合はユーザデータは全て削除されます。
この場合 Node-RED のブラウザからインストールしたカスタムノードは削除されます。 4.6. AWS へデバイス情報を送信するフローを作成するArmadillo-640 から AWS サービスへデバイス情報を送信するための一連のフローについて説明します。
デバイス状態の送信には AWS IoT Device Shadow サービスを利用します。 | |
---|
この機能を使用するには、バージョン 1.1.0 以上の Node-RED コンテナが必要です。 |
手順を以下に示します。 最初に AWS 上で作業が必要です。 -
AWS アカウントの作成
-
IAM ユーザーの作成
-
デバイスデータエンドポイントの取得
以下は Node-RED 上で操作します。 -
デバイス証明書を取得するフローの作成
-
デバイスを登録するフローの作成
-
AWS IoT ポリシーを作成するフローの作成
-
デバイス証明書を登録するフローの作成
-
ポリシーをアタッチするフローの作成
ここまでの手順はデバイス登録のために一度のみ実行する必要があります。
もし、デバイスを誤って削除してしまった場合や、登録した証明書の期限が切れた場合などがあれば、
再度実行する必要があります。 AWS IoT Device Shadow サービスを利用して、デバイスシャドウを制御します。
本ドキュメントでは、暗号化したデバイスシャドウを用いることで、デバイス状態についてよりセキュアに通信します。
デバイスシャドウを制御するフローについては、以下になります。 -
デバイスシャドウを取得するフローの作成
-
デバイスシャドウを更新するフローの作成
-
デバイスシャドウを削除するフローの作成
AWS IAM (Identity and Access Management) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。
IAM により、誰を認証(サインイン)し、誰にリソースの使用を承認する(アクセス許可を持たせる)かを管理することができます。 本章では以下の手順について説明します。 -
IAM ユーザーの作成
-
IAM ユーザーにポリシーの設定
-
IAM ユーザーのアクセスキーの作成
4.6.2.2. IAM ユーザーにポリシーを設定する作成した AWS IAM ユーザには AWS IoT Device Shadow サービスを利用するために必要な許可を与える必要があります。
必要なポリシーについては 公式のドキュメント を参照してください。
以下はポリシーの例です。ポリシー名については任意の名前を与えてください。 4.6.2.3. IAM ユーザーのアクセスキーを作成する作成した AWS IAM ユーザのアクセスキーを作成します。AWS IAM ユーザーのアクセスキーの管理については
公式のドキュメント を参照してください。
作成したアクセスキーとシークレットキーについては、
AWS IoT Device Shadow サービスの利用のため Node-RED のノードに設定する必要があるため、無くさないでください。
以上で AWS 上で操作が必要な手順については終了です。 4.6.3. デバイスデータエンドポイントを取得するデバイスシャドウの取得・更新・削除にはデバイスデータエンドポイントを使用します。
デバイスデータエンドポイントの取得方法は 公式のドキュメント を参照してください。 4.6.4. デバイス証明書を取得するフローの作成Armadillo Base OS 搭載機器は、標準でセキュアエレメントを搭載しており、対応した暗号化方式の認証鍵や証明書を安全に保存・利用することが可能です。
EdgeLock SE050 は IoT アプリケーション向けのセキュアエレメントです。 フラッシュメモリを内蔵しており、保存された秘密鍵を外部に露出することなく暗号処理に利用できます。 | |
---|
シリアルナンバー:009C01490001 以降の Armadillo-640 に搭載されています。 |
セキュアエレメントは I2C デバイスとして認識されます。
製品によって I2C バスが異なるためご注意ください。
Armadillo-640 で使用する I2C バスを 表4.2「セキュアエレメントが使用する I2C バス」 に示します。 表4.2 セキュアエレメントが使用する I2C バス I2C バス | I2C デバイス | アドレス | デバイス名 | 0(I2C1) | 0x48 | SE050(セキュアエレメント) |
このフローでは秘密鍵とデバイス証明書を EdgeLock SE050 より取得して、/var/app/rollback/volumes/node-red/cert に保存します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[exec] ノードをドラッグ、ドロップします。
[exec] ノードのプロパティを編集します。
コマンド: se05x_getkey 0xF0000111 /cert/device_cert.pem /dev/i2c-0:0x48
引数: チェックなし
出力: コマンド終了時 - execモード
名前: デバイス証明書の取得
-
[inject] ノードの右側にある端子をクリックし、[デバイス証明書の取得] ノードの左側の端子を選択して放します。
-
もう一つ [exec] ノードをドラッグ、ドロップします。
[exec] ノードのプロパティを編集します。
コマンド: ls /cert
引数: チェックなし
出力: コマンド終了時 - execモード
名前: ファイルの確認
-
[デバイス証明書の取得] ノードの右側にある端子をクリックし、
[ファイルの確認] ノードの左側の端子を選択して放します。
-
もう一つ、[inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[exec] ノードをドラッグ、ドロップします。
[exec] ノードのプロパティを編集します。
コマンド: se05x_getkey 0xF0000110 /cert/key.pem /dev/i2c-0:0x48
引数: チェックなし
出力: コマンド終了時 - execモード
名前: リファレンスキーの取得
-
二つ目の [inject] ノードの右側にある端子をクリックし、
[リファレンスキーの取得] ノードの左側の端子を選択して放します。
-
[リファレンスキーの取得] ノードの右側にある端子をクリックし、
[ファイルの確認] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[ファイルの確認] ノードの右側の一番上にある端子をクリックし、
[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角をそれぞれ押すと、コマンドの実行結果結果がデバッグメッセージに表示されます。
下記ファイルが出力されていれば取得に成功しています。
実行に成功した場合は /var/app/rollback/volumes/node-red/cert/ にデバイス証明書が保存されています。 AWS IoT Device Shadow サービスを利用するため、AWS IoT Core にデバイス(モノ)を登録する必要があります。
今回モノの名前はデバイスのシリアルナンバー(例: 001234567890)を使用します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[credentials] ノードをドラッグ、ドロップします。
[credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。
private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_access_key
private: [hidden]
to: [msg.] aws_secret_key
private: [文字列]
to: [msg.] aws_iot_region
private: [hidden]
to: [msg.] aws_iot_host |
「IAM ユーザーの作成」で取得したアクセスキー
| |
「IAM ユーザーの作成」で取得したシークレットキー
| |
リージョン(例: ap-northeast-1)
| |
IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)
|
-
[inject] ノードの右側にある端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイス登録の引数設定
コード:
msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
+ " " + msg.aws_iot_region
+ " " + msg.aws_iot_host;
return msg;
-
[接続情報の登録] ノードの右側にある端子をクリックし、
[デバイス登録の引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: デバイス登録
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
AWS_ACCESS="$1"
AWS_REGION="$2"
ENDPOINT="$3"
URI=/things/${AT_SERIAL_NUMBER}
RESULT=$(curl \
--cacert /cert/AmazonRootCA1.pem \
--user "${AWS_ACCESS}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:execute-api" \
--request POST -v \
-w '\n%{http_code}' \
-d "{}" \
"https://${ENDPOINT}${URI}")
RESULT_BODY=$(echo "${RESULT}" | sed "$ d")
RESULT_STATUS=$(echo "${RESULT}" | tail -n 1)
if [ "${RESULT_STATUS}" = 200 ]; then
echo "${RESULT_BODY}"
else
echo '{"statusCode": '${RESULT_STATUS}',"responseBody": '${RESULT_BODY}'}'
fi
-
[デバイス登録の引数設定] ノードの右側にある端子をクリックし、
[デバイス登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイス名の取得
コード:
var str = msg.payload;
var json = str.substr(str.indexOf("{"),str.lastIndexOf("}") + 1);
try {
var res = JSON.parse(json);
msg.payload = "thingName:" + res.thingName;
} catch {
msg.payload = json;
}
return msg;
-
[debug] ノードをドラッグ、ドロップします。
[デバイス名の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すと登録したモノの名前がデバッグメッセージに表示されます。
表示されたモノの名前がデバイスシャドウの対象になります。
もし、デバイスの登録に失敗した場合はエラーに応じたステータスコードを表示します。 4.6.6. AWS IoT ポリシーを作成するフローの作成登録したモノに対して AWS IoT Device Shadow サービスを利用するための許可を与える必要があります。
そのため、必要な AWS IoT ポリシーを作成してアタッチする必要があります。
まず、ポリシーを新しく作成します。
「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。
[接続情報の登録] ノードのプロパティに [ポリシー名] を追加します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_access_key
private: hidden:
to: [msg.] aws_secret_key
private: [文字列]
to: [msg.] aws_iot_region
private: [hidden]
to: [msg.] aws_iot_host
private: [hidden]
to: [msg.] aws_policy_name |
「IAM ユーザーの作成」で取得したアクセスキー
| |
「IAM ユーザーの作成」で取得したシークレットキー
| |
リージョン(例: ap-northeast-1
| |
IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)
| |
ポリシー名(例: node-red-thing-policy)
|
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: ポリシー登録の引数設定
コード:
msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
+ " " + msg.aws_iot_region
+ " " + msg.aws_iot_host
+ " " + msg.aws_policy_name;
return msg;
-
[接続情報の登録] ノードの右側にある端子をクリックし、
[ポリシー登録の引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: 新しいポリシーの作成
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
AWS_ACCESS="$1"
AWS_REGION="$2"
ENDPOINT="$3"
POLICY_NAME="$4"
URI=/policies/${POLICY_NAME}
RESULT=$(curl \
-H "Content-type: application/json" \
--cacert /cert/AmazonRootCA1.pem \
--user "${AWS_ACCESS}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:execute-api" \
-d '{"policyDocument": "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Effect\": \"Allow\",\"Action\": \"iot:*\",\"Resource\": \"*\"}]}"}' \
--request POST -v \
-w '\n%{http_code}' \
"https://${ENDPOINT}${URI}")
RESULT_BODY=$(echo "${RESULT}" | sed "$ d")
RESULT_STATUS=$(echo "${RESULT}" | tail -n 1)
if [ "${RESULT_STATUS}" = 200 ]; then
echo "${RESULT_BODY}"
else
echo '{"statusCode": '${RESULT_STATUS}',"responseBody": '${RESULT_BODY}'}'
fi
-
[ポリシー登録の引数設定] ノードの右側にある端子をクリックし、
[新しいポリシーの作成] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: ポリシー名の取得
コード:
var str = msg.payload;
var json = str.substr(str.indexOf("{"), str.lastIndexOf("}") + 1);
try {
var res = JSON.parse(json);
msg.payload = "policyName:" + res.policyName;
} catch {
msg.payload = json;
}
return msg;
-
[新しいポリシーの作成] ノードの右側にある端子をクリックし、
[ポリシー名の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[ポリシー名の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すとポリシー作成の結果がデバッグメッセージに表示されます。
すでに登録済みの場合は "Policy cannot be created - name already exists が表示されます。
もし、ポリシーの作成に失敗した場合はエラーに応じたステータスコードを表示します。 4.6.7. デバイス証明書を登録するフローの作成登録したデバイスのデバイス証明書を登録します。
「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。 -
パレットから [function] ノードをワークスペースにドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイス証明書登録の引数設定
コード:
msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
+ " " + msg.aws_iot_region
+ " " + msg.aws_iot_host;
return msg;
-
[接続情報の登録] ノードの右側にある端子をクリックし、
[デバイス証明書登録の引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: デバイス証明書の登録
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
AWS_ACCESS="$1"
AWS_REGION="$2"
ENDPOINT="$3"
URI=/certificate/register-no-ca
CERT=$(cat /cert/device_cert.pem | sed -z 's/\n/\\n/g')
RESULT=$(curl \
-H "Content-type: application/json" \
--cacert /cert/AmazonRootCA1.pem \
--user "${AWS_ACCESS}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:execute-api" \
-d "{\"certificatePem\":\"${CERT}\",\"status\":\"ACTIVE\"}" \
--request POST -v \
-w '\n%{http_code}' \
"https://${ENDPOINT}${URI}")
RESULT_BODY=$(echo "${RESULT}" | sed "$ d")
RESULT_STATUS=$(echo "${RESULT}" | tail -n 1)
if [ "${RESULT_STATUS}" = 200 ]; then
echo "${RESULT_BODY}"
else
echo '{"statusCode": '${RESULT_STATUS}',"responseBody": '${RESULT_BODY}'}'
fi
-
[デバイス証明書登録の引数設定] ノードの右側にある端子をクリックし、
[デバイス証明書の登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: 証明書 ID の取得
コード:
var str = msg.payload;
var json = str.substr(str.indexOf("{"), str.lastIndexOf("}") + 1);
try {
var res = JSON.parse(json);
msg.payload = "certificateArn:" + res.certificateArn;
} catch {
msg.payload = json;
}
return msg;
-
[デバイス証明書の登録] ノードの右側にある端子をクリックし、
[証明書 ID の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[証明書 ID の取得] ノードの右側の端子をクリックし、
[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すとデバイス証明書の登録結果がデバッグメッセージに表示されます。
実際は使用しているリージョン名と、アカウントID が含まれます。
すでに登録済みの場合は "The certificate is already provisioned or registered" が表示されます。
もし、デバイス証明書の登録に失敗した場合はエラーに応じたステータスコードを表示します。 4.6.8. AWS IoT ポリシーをデバイスにアタッチするフローの作成「AWS IoT ポリシーを作成するフローの作成」 で作成したポリシーをデバイスにアタッチします。
「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。
[接続情報の登録] ノードのプロパティに、
「デバイス証明書を登録するフローの作成」 で取得した [証明書ID] を追加します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_access_key
private: [hidden]
to: [msg.] aws_secret_key
private: [文字列]
to: [msg.] aws_iot_region
private: [hidden]
to: [msg.] aws_iot_host
private: [hidden]
to: [msg.] aws_cert_arn |
「IAM ユーザーの作成」で取得したアクセスキー
| |
「IAM ユーザーの作成」で取得したシークレットキー
| |
リージョン(例: ap-northeast-1)
| |
IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)
| |
証明書ID (例: arn:aws:iot:ap-northeast-1:00000000:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
|
-
パレットから [function] ノードをワークスペースにドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: ポリシーをアタッチするための引数設定
コード:
msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
+ " " + msg.aws_iot_region
+ " " + msg.aws_iot_host
+ " " + msg.aws_policy_name
+ " " + msg.aws_cert_arn;
return msg;
-
[接続情報の登録] ノードの右側にある端子をクリックし、
[ポリシーをアタッチするための引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: ポリシーを証明書にアタッチ
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
AWS_ACCESS="$1"
AWS_REGION="$2"
ENDPOINT="$3"
POLICY_NAME="$4"
CERT_ARN="$5"
URI=/target-policies/${POLICY_NAME}
RESULT=$(curl \
-H "Content-type: application/json" \
--cacert /cert/AmazonRootCA1.pem \
--user "${AWS_ACCESS}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:execute-api" \
-d "{\"target\":\"${CERT_ARN}\"}" \
--request PUT -v \
-w '\n%{http_code}' \
"https://${ENDPOINT}${URI}")
RESULT_BODY=$(echo "${RESULT}" | sed "$ d")
RESULT_STATUS=$(echo "${RESULT}" | tail -n 1)
if [ "${RESULT_STATUS}" = 200 ]; then
echo "${RESULT_BODY}"
else
echo '{"statusCode": '${RESULT_STATUS}',"responseBody": '${RESULT_BODY}'}'
fi
-
[ポリシーをアタッチするための引数設定] ノードの右側にある端子をクリックし、
[ポリシーを証明書にアタッチ] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: ポリシーアタッチ結果の取得
コード:
var str = msg.payload;
var json = str.substr(str.indexOf("{"), str.lastIndexOf("}") + 1);
var success_msg = "{ \"policyAttach\" : \"success\" }";
if (json.length === 0) {
msg.payload = success_msg;
} else {
try {
var res = JSON.parse(json);
if (Object.keys(res).length === 0) {
msg.payload = success_msg;
}
} catch {
msg.payload = json;
}
}
return msg;
-
[ポリシーを証明書にアタッチ] ノードの右側にある端子をクリックし、
[ポリシーアタッチ結果の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
-
[ポリシーアタッチ結果の取得] ノードの右側の端子をクリックし、
[debug] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: 証明書をデバイスにアタッチ
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
AWS_ACCESS="$1"
AWS_REGION="$2"
ENDPOINT="$3"
POLICY_NAME="$4"
CERT_ARN="$5"
URI=/things/${AT_SERIAL_NUMBER}/principals
RESULT=$(curl \
-H "x-amzn-principal:${CERT_ARN}" \
--cacert /cert/AmazonRootCA1.pem \
--user "${AWS_ACCESS}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:execute-api" \
--request PUT -v \
-w '\n%{http_code}' \
"https://${ENDPOINT}${URI}")
RESULT_BODY=$(echo "${RESULT}" | sed "$ d")
RESULT_STATUS=$(echo "${RESULT}" | tail -n 1)
if [ "${RESULT_STATUS}" = 200 ]; then
echo "${RESULT_BODY}"
else
echo '{"statusCode": '${RESULT_STATUS}',"responseBody": '${RESULT_BODY}'}'
fi
-
[ポリシーをアタッチするための引数設定] ノードの右側にある端子をクリックし、
[証明書をデバイスにアタッチ] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: 証明書アタッチ結果の取得
コード:
var str = msg.payload;
var json = str.substr(str.indexOf("{"), str.lastIndexOf("}") + 1);
var success_msg = "{ \"deviceCertAttach\" : \"success\" }";
try {
var res = JSON.parse(json);
if (Object.keys(res).length === 0) {
msg.payload = success_msg;
}
} catch {
msg.payload = json;
}
return msg;
-
[証明書をデバイスにアタッチ] ノードの右側にある端子をクリックし、
[証明書アタッチ結果の取得] ノードの左側の端子を選択して放します。
[証明書アタッチ結果の取得] ノードの右側の端子をクリックし、
[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すとデバイスにポリシーがアタッチされます。
アタッチに成功した場合は "success" が表示されます。
もし、失敗した場合はエラーに応じたステータスコードを表示します。 4.6.9. デバイスシャドウを取得するフローの作成デバイスが登録されている場合、デバイスシャドウが取得可能です。
対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[credentials] ノードをドラッグ、ドロップします。
[credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。
private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_device_endpoint
-
[inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ取得のための引数設定
コード:
msg.payload = msg.aws_device_endpoint;
return msg;
-
[接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ取得のための引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: 暗号化を使用したデバイスシャドウの取得
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
ENDPOINT="$1"
URI=/things/${AT_SERIAL_NUMBER}/shadow
curl --tlsv1.2 \
--cacert /cert/AmazonRootCA1.pem \
--key /cert/key.pem \
--cert /cert/device_cert.pem \
--request GET \
"https://${ENDPOINT}:8443${URI}"
-
[デバイスシャドウ更新のための引数設定] ノードの右側の端子をクリックし、
[暗号化を使用したデバイスシャドウの取得] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ内容の取得
コード:
var res = msg.payload.match(/\{.*\}/);
msg.payload = res[0];
return msg;
-
[暗号化を使用したデバイスシャドウの取得] ノードの右側の端子をクリックし、
[デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すと取得したデバイスシャドウの内容がデバッグメッセージに表示されます。
デバイスシャドウが作成されていない場合は "No shadow exists with name: 001234567890" のように表示されます。
4.6.10. デバイスシャドウを更新するフローの作成デバイスシャドウを更新します。
対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
[inject] ノードのプロパティを編集します。
名前: デバイスシャドウ内容
msg.payload: { "state": {"desired": {"message": "success" }}}
-
[credentials] ノードをドラッグ、ドロップします。
[credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。
private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_device_endpoint
-
[inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ更新のための引数設定
コード:
msg.payload = "\'" + msg.payload + "\'"
+ " " + msg.aws_device_endpoint;
return msg;
-
[接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ取得のための引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: 暗号化を使用したデバイスシャドウの更新
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
MESSAGES="$1"
ENDPOINT="$2"
URI=/things/${AT_SERIAL_NUMBER}/shadow
curl --tlsv1.2 \
--cacert /cert/AmazonRootCA1.pem \
--key /cert/key.pem \
--cert /cert/device_cert.pem \
--request POST -v \
-d "${MESSAGES}" \
"https://${ENDPOINT}:8443${URI}"
-
[デバイスシャドウ更新のための引数設定] ノードの右側の端子をクリックし、
[暗号化を使用したデバイスシャドウの更新] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ内容の取得
コード:
var res = msg.payload.match(/\{.*\}/);
msg.payload = res[0];
return msg;
-
[暗号化を使用したデバイスシャドウの更新] ノードの右側の端子をクリックし、
[デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すと更新したデバイスシャドウの内容がデバッグメッセージに表示されます。
4.6.11. デバイスシャドウを削除するフローの作成デバイスシャドウを削除します。
対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。 -
パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
プロパティはデフォルトから変更ありません。
-
[credentials] ノードをドラッグ、ドロップします。
[credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。
private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。
Name: 接続情報の登録
Values:
private: [hidden]
to: [msg.] aws_device_endpoint
-
[inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ削除のための引数設定
コード:
msg.payload = msg.aws_device_endpoint;
return msg;
-
[接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ削除のための引数設定] ノードの左側の端子を選択して放します。
-
[exec queue] ノードをドラッグ、ドロップします。
[exec queue] ノードのプロパティを編集します。
名前: 暗号化を使用したデバイスシャドウの削除
コマンド: bash $file
Queue: 1
Debug Mode: ✓
Append msg.payload: ✓
構文: Shell
内容:
ENDPOINT="$1"
URI=/things/${AT_SERIAL_NUMBER}/shadow
curl --tlsv1.2 \
--cacert /cert/AmazonRootCA1.pem \
--key /cert/key.pem \
--cert /cert/device_cert.pem \
--request POST -v \
-d "${MESSAGES}" \
"https://${ENDPOINT}:8443${URI}"
-
[デバイスシャドウ削除のための引数設定] ノードの右側の端子をクリックし、
[暗号化を使用したデバイスシャドウの削除] ノードの左側の端子を選択して放します。
-
[function] ノードをドラッグ、ドロップします。
[function] ノードのプロパティを編集します。
名前: デバイスシャドウ内容の取得
コード:
var res = msg.payload.match(/\{.*\}/);
msg.payload = res[0];
return msg;
-
[暗号化を使用したデバイスシャドウの更新] ノードの右側の端子をクリックし、
[デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
-
[debug] ノードをドラッグ、ドロップします。
[デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。
-
画面右上の [デプロイ] を押します。
-
[inject] ノードの左の四角を押すと削除したデバイスシャドウの内容がデバッグメッセージに表示されます。
デバイスシャドウがすでに削除されている場合は "No shadow exists with name: 001234567890" のように表示されます。
| |
| | | |
| |