開発を行う

4.1. Node-RED に接続する

3章Armadillo のセットアップ を完了している場合は Armadillo を起動すると、自動的に Node-RED コンテナが起動します。 Node-RED への接続には 「ネットワークに接続する」 で取得した IP アドレスを使用します。

パソコンの Web ブラウザから、http://<ipアドレス>:1880/ にアクセスしてください。

images/node-red/common-images/start.png

図4.1 初回起動時の Node-RED 画面


Node-RED には大きく 3 つの領域があります。

  • パレット

    使用可能なコアノード、カスタムノードの一覧を表示します。

  • ワークスペース

    Node-RED では一つのアプリケーションの流れをフローという単位で表します。 ワークスペース上にノードを繋げてフローを作成します。 パレットから必要なノードをワークスペースにドラッグ、ドロップで配置します。

  • サイドバー

    選択したノードの情報や、デバッグメッセージを表示します。

images/node-red/common-images/start_guide.png

図4.2 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 のコアノードの他にインストールされているカスタムノードがあります。 インストール済のカスタムノードは以下になります。

4.4. フローを作成する

Node-RED では一つのアプリケーションの流れをフローという単位で表します。 各ノードを使用したフローの作成方法について紹介します。

4.4.1. LED を制御する

ここでは、LED を1秒間隔で点滅するフローを作成します。すべて Node-RED のコアノードを使用します。 Armadillo-IoT ゲートウェイ A9E の LED は以下がありますが、今回対象にするのはアプリケーション LED です。 アプリケーション LED の場所については 「インターフェースレイアウト」 をご確認ください。

アプリケーション LED は /sys/class/leds/app/brightness ファイルへ値を書き込むことによって、LEDの点灯/消灯を行うことができます。 0 を書き込むと消灯、0 以外の値 (1~255) を書き込むと点灯します。

表4.1 LED 信号配列

部品番号 名称(色) 説明

SYS

システムLED(緑)

電源(VDD_3V3)の入力状態を表示、i.MX 8ULPのPTC5に接続

(Low: 消灯、High: 点灯)

APP

アプリケーションLED(緑)

アプリケーションの状態を表示、i.MX 8ULPのPTF30に接続

(Low: 消灯、High: 点灯)

WWAN

ワイヤレスWAN LED(緑)

LTE通信の状態を表示、i.MX 8ULPのPTF31に接続

(Low: 消灯、High: 点灯)


  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。[inject] は 2 秒間隔で実行します。

    名前: LED Blink
    繰り返し: 指定した時間間隔
    時間間隔:2秒
    images/node-red/led_blink_inject_prop.png

    図4.3 [inject] ノードのプロパティ内容


  3. [trigger] ノードをドラッグ、ドロップします。
  4. [trigger] ノードのプロパティを編集します。 [trigger] は 1 を送信して 1 秒待機後、0 を送信します。これにより点滅動作を実現します。

    送信データ:1
    送信後の処理:指定した時間待機
    1 秒
    再送信データ:0
    images/node-red/led_blink_trigger_prop.png

    図4.4 [trigger] ノードのプロパティ内容


  5. [LED Blink] ノードの右側にある端子をクリックし、[trigger] ノードの左側の端子を選択して放します。
  6. [write file] ノードをドラッグ、ドロップします。
  7. [write file] ノードのプロパティを編集します。 /sys/class/leds/app/brightness ファイルへ [trigger] からの送信データを書き込みます。

    ファイル名: /sys/class/leds/app/brightness
    動作: ファイルを上書き
    文字コード: デフォルト
    名前: APP LED
    images/node-red/led_blink_app_led_prop.png

    図4.5 [write file] ノードのプロパティ内容


  8. [trigger] ノードの右側にある端子をクリックし、[APP LED] ノードの左側の端子を選択して放します。
  9. [debug] ノードをドラッグ、ドロップします。
  10. [APP LED] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/led_blink_flow.png

    図4.6 LED を1秒間隔で点滅するフロー


  11. 画面右上の [デプロイ] を押します。アプリケーション LED が 1 秒毎に点滅を繰り返す動きをすれば成功です。

4.4.2. CPU の測定温度を取得する

ここでは、 Armadillo-IoT ゲートウェイ A9E の CPU の測定温度を1秒間隔で取得するフローを作成します。全て Node-RED のコアノードを使用します。 /sys/class/thermal/thermal_zone0/temp ファイルの値を読み出すことによって測定温度を取得することができます。 温度はミリ°C の単位で表示されるため、°C 単位への変換も行います。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。[inject] は 1 秒間隔で実行します。

    繰り返し: 指定した時間間隔
    時間間隔: 1 秒
    images/node-red/common-images/get_cpu_temp_inject_prop.png

    図4.7 [inject] ノードのプロパティ内容


  3. [read file] ノードをドラッグ、ドロップします。
  4. [read file] ノードのプロパティを編集します。 /sys/class/thermal/thermal_zone0/temp ファイルの値を読み出します。

    ファイル名: /sys/class/thermal/thermal_zone0/temp
    出力形式: 文字列
    文字コード: デフォルト
    名前: CPU temp
    images/node-red/common-images/get_cpu_temp_read_prop.png

    図4.8 [read file] ノードのプロパティ内容


  5. [Get CPU temp] ノードの右側にある端子をクリックし、[CPU temp] ノードの左側の端子を選択して放します。
  6. [function] ノードをドラッグ、ドロップします。
  7. [function] ノードのプロパティを編集します。 CPU の測定温度がミリ°C の単位のため、°C の単位へ変換します。 msg.payload で渡された値を 1000 で割り、msg.payload に戻します。

    名前: CPU temp calc
    コード:
    msg.payload = msg.payload / 1000;
    return msg;
    images/node-red/common-images/get_cpu_temp_calc_prop.png

    図4.9 [function] ノードのプロパティ内容


  8. [CPU temp] ノードの右側にある端子をクリックし、[CPU temp calc] ノードの左側の端子を選択して放します。
  9. [debug] ノードをドラッグ、ドロップします。
  10. [CPU temp calc] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/get_cpu_temp_flow.png

    図4.10 CPU の測定温度を1秒間隔で取得するフロー


  11. 画面右上の [デプロイ] を押します。デバッグメッセージに 1 秒毎に CPU の測定温度が表示されます。

4.4.3. 接点入力の入力レべルを取得する

ここでは、 接点入力の入力レベルを 1 秒間隔で取得するフローを作成します。 Node-RED のコアノードのほかに GPIO in ノードを使用します。 Armadillo-IoT ゲートウェイ A9E の CON3 にある接点入力を使用します。入力レベル 0 は LOW レベル、1 は HIGH レベルを表わします。 接点入力の場所については 「インターフェースレイアウト」 をご確認ください。

表4.2 CON3 信号配列(接点入力関連)

ピン番号ピン名 I/O 説明

8

DI1

In

接点入力1

9

DI2

In

接点入力2

10

COM

In

接点入力プラスコモン


DI ピンは GPIO として制御可能であり、対応する GPIO 番号を次に示します。

表4.3 接点入力に対応する CON3 ピン番号

ピン番号 ピン名 GPIOチップ GPIO番号

8

DI1

gpiochip1

12

9

DI2

gpiochip1

14


[ティップ]

接点入力に何も接続していない(開放状態)場合、取得できる入力レベルは 1 (HIGH レベル)となります。

接続に関する注意事項は以下です。

表4.4 CON3 接続可能な電線

規格

UL

IEC

電線範囲

26~18 AWG

0.12~0.9mm2

被覆剥き長さ

5~6mm

使用可能フェルール端子

型番 : MFL25-5BE

メーカー:ミスミ

推奨ねじ締めトルク

0.2Nm


[警告]

電線の先端に予備半田しないでください。正しい接続ができなくなります。

[警告]

端子台に電線を接続する際、端子台に過度な力を加えないでください。 端子台が破損する恐れがあります。

Armadillo-IoT ゲートウェイ A9E の接点入力インターフェースはフォトカプラで絶縁されています。 そのため、フォトカプラを駆動させるために5V以上の電圧を印加する必要があります。 外部電源を用いてフォトカプラを駆動させる場合の接続方法について以下に示します。

images/node-red/example_di_connect.png

図4.11 接点入力の接続方法(DI1 ピン)


例として DI1 ピンからの入力レベルを取得するフローを作成します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。[inject] は 2 秒間隔で実行します。

    名前: Get DI1
    繰り返し: 指定した時間間隔
    時間間隔:1秒
    images/node-red/get_di1_inject_prop.png

    図4.12 [inject] ノードのプロパティ内容


  3. [GPIO in] ノードをドラッグ、ドロップします。
  4. [GPIO in] ノードのプロパティを編集します。

    Device:gpiochip1
    Type:Digital pin
    Pin: 12
    Name:DI1
    images/node-red/get_di1_prop.png

    図4.13 [GPIO in] ノードのプロパティ内容


  5. [Get DI1] ノードの右側にある端子をクリックし、[DI1] ノードの左側の端子を選択して放します。
  6. [debug] ノードをドラッグ、ドロップします。
  7. [DI1] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/get_di1_flow.png

    図4.14 接点入力の入力レベルを 1 秒間隔で取得するフロー


  8. 画面右上の [デプロイ] を押します。デバッグメッセージに 1 秒毎に DI1 ピンの入力レベルが表示されます。 何も接続してない場合であれば常に 1 が表示されます。

4.4.4. 接点出力の出力レベルを制御する

ここでは、 接点出力の出力レベルを 1 秒毎に HIGH レベルと LOW レベルを切り替えるフローを作成します。 Node-RED のコアノードのほかに GPIO out ノードを使用します。 Armadillo-IoT ゲートウェイ A9E の CON3 にある接点出力を使用します。 出力レベル 0 は LOW レベル、1 は HIGH レベルを表わします。 接点出力の場所については 「インターフェースレイアウト」 をご確認ください。

表4.5 CON3 信号配列(接点出力関連)

ピン番号ピン名 I/O 説明

4

DO1A

-

接点出力1A

5

DO1B

-

接点出力1B

6

DO2A

-

接点出力2A

7

DO2B

-

接点出力2B


DO ピンは GPIO として制御可能であり、対応する GPIO 番号を次に示します。

表4.6 接点出力に対応する CON3 ピン番号

ピン番号 ピン名 GPIOチップ GPIO番号

4

DO1A

gpiochip1

0

5

DO1B

gpiochip1

0

6

DO2A

gpiochip1

1

7

DO2B

gpiochip1

1


接続に関する注意事項は以下です。

表4.7 CON3 接続可能な電線

規格

UL

IEC

電線範囲

26~18 AWG

0.12~0.9mm2

被覆剥き長さ

5~6mm

使用可能フェルール端子

型番 : MFL25-5BE

メーカー:ミスミ

推奨ねじ締めトルク

0.2Nm


[警告]

電線の先端に予備半田しないでください。正しい接続ができなくなります。

[警告]

端子台に電線を接続する際、端子台に過度な力を加えないでください。 端子台が破損する恐れがあります。

Armadillo-IoT ゲートウェイ A9E の接点出力インターフェースはフォトカプラで絶縁されています。 そのため、フォトカプラを駆動させるために5V以上の電圧を印加する必要があります。 外部電源を用いてフォトカプラを駆動させる場合の接続方法について以下に示します。

[fig.development.example_do+_connect]

図4.15 接点出力の接続方法(制御対象がプラスコモンの場合の DO1 ピン)


images/node-red/example_do-_connect.png

図4.16 接点出力の接続方法(制御対象がマイナスコモンの場合の DO1 ピン)


例として DO1 ピンの出力レベルを制御するフローを作成します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。[inject] は2秒間隔で実行します。

    名前: Set DO1
    繰り返し: 指定した時間間隔
    時間間隔: 2秒
    images/node-red/set_do1_inject_prop.png

    図4.17 [inject] ノードのプロパティ内容


  3. [trigger] ノードをドラッグ、ドロップします。
  4. [trigger] ノードのプロパティを編集します。

    送信データ:1
    送信後の処理:指定した時間待機
    1 秒
    再送信データ:0
    images/node-red/led_blink_trigger_prop.png

    図4.18 [trigger] ノードのプロパティ内容


  5. [GPIO out] ノードをドラッグ、ドロップします。
  6. [GPIO out] ノードのプロパティを編集します。

    Device:gpiochip1
    Type:Digital (0/1)
    Pin: 0
    Name:DO1
    images/node-red/set_do1_prop.png

    図4.19 [GPIO out] ノードのプロパティ内容


  7. [Set DO1] ノードの右側にある端子をクリックし、[DO1] ノードの左側の端子を選択して放します。
  8. [debug] ノードをドラッグ、ドロップします。
  9. [DO1] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/set_do1_flow.png

    図4.20 接点出力の出力レベルを 1 秒毎に HIGH レベルと LOW レベルを切り替えるフロー


  10. 画面右上の [デプロイ] を押します。 1 秒毎に DO1 ピンの出力レベルが HIGH レベルと LOW レベルで切り替わります。

4.4.5. 接点入力の入力レベルの立ち上がりエッジを検出する

ここでは、 接点入力の入力レベルの立ち上がりエッジを検出するフローを作成します。 Node-RED のコアノードのほかに rising edge ノードを使用します。 Armadillo-IoT ゲートウェイ A9E の CON3 にある接点入力と接点出力を使用します。 入力レベル、出力レベルの 0 は LOW レベル、1 は HIGH レベルを表わします。 接点入力、接点出力の場所については 「インターフェースレイアウト」 をご確認ください。

例として DI2 ピンの立ち上がりエッジを取得するフローを作成します。 また、立ち上がりエッジ検出のためにループバック接続を行います。 接続に関する注意事項は以下です。

表4.8 CON3 接続可能な電線

規格

UL

IEC

電線範囲

26~18 AWG

0.12~0.9mm2

被覆剥き長さ

5~6mm

使用可能フェルール端子

型番 : MFL25-5BE

メーカー:ミスミ

推奨ねじ締めトルク

0.2Nm


[警告]

電線の先端に予備半田しないでください。正しい接続ができなくなります。

[警告]

端子台に電線を接続する際、端子台に過度な力を加えないでください。 端子台が破損する恐れがあります。

CON3 にある接点入力、接点出力のピンを次に示します。

表4.9 CON3 信号配列(接点入力、出力関連)

ピン番号ピン名 I/O 説明

4

DO1A

-

接点出力1A

5

DO1B

-

接点出力1B

6

DO2A

-

接点出力2A

7

DO2B

-

接点出力2B

8

DI1

In

接点入力1

9

DI2

In

接点入力2

10

COM

In

接点入力プラスコモン

11

VIN

In

入力電圧

12

GND

In

GND


DI ピンと DO ピンは GPIO として制御可能であり、対応する GPIO 番号を次に示します。

表4.10 接点入力、出力に対応する CON6 ピン番号

ピン番号 ピン名 GPIOチップ GPIO番号

4

DO1A

gpiochip1

0

5

DO1B

gpiochip1

0

6

DO2A

gpiochip1

1

7

DO2B

gpiochip1

1

8

DI1

gpiochip1

12

9

DI2

gpiochip1

14


Armadillo-IoT ゲートウェイ A9E の接点入力、出力インターフェースはフォトカプラで絶縁されています。 そのため、フォトカプラを駆動させるために5V以上の電圧を印加する必要があります。

ループバック接続を用いて DO2 ピンの出力レベルを変更して、DI2 ピンで立ち上がりエッジを検出します。 必要なピン接続は以下です。

・VIN ピン - COM ピン
・GND ピン  - DO2B ピン
・DI2 ピン  - DO2A ピン
images/node-red/get_di2_rising_edge_connect.png

図4.21 DI2 ピンの立ち上がりエッジを取得するための接続図


  1. はじめに DI2 ピンの立ち上がりエッジを検出するフローを作成します。 パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。

    名前: Get DI2
    繰り返し: 指定した時間間隔
    時間間隔:0.1秒
    images/node-red/get_di2_inject_prop.png

    図4.22 [inject] ノードのプロパティ内容


  3. [GPIO in] ノードをドラッグ、ドロップします。
  4. [GPIO in] ノードのプロパティを編集します。

    Device:gpiochip1
    Type:Digital pin
    Pin: 14
    Name:DI2
    images/node-red/get_di2_prop.png

    図4.23 [GPIO in] ノードのプロパティ内容


  5. [Get DI2] ノードの右側にある端子をクリックし、[DI2] ノードの左側の端子を選択して放します。
  6. [rising edge] ノードをドラッグ、ドロップします。
  7. [rising edge] ノードのプロパティを編集します。

    Name: notify rising edge
    Threshold: 0
    images/node-red/get_di2_rising_edge_prop.png

    図4.24 [rising edge] ノードのプロパティ内容


  8. [DI2] ノードの右側にある端子をクリックし、[notify rising edge] ノードの左側の端子を選択して放します。
  9. [change] ノードをドラッグ、ドロップします。
  10. [change] ノードのプロパティを編集します。

    名前: notification
    ルール: 値の置換 msg.payload
    検索する文字列: 1
    置換後の文字列: notify!
    images/node-red/get_di2_notification_prop.png

    図4.25 [change] ノードのプロパティ内容


  11. [notify rising edge] ノードの右側にある端子をクリックし、[notification] ノードの左側の端子を選択して放します。
  12. [debug] ノードをドラッグ、ドロップします。
  13. [notification] ノードの右側にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。
  14. 次に DO2 ピンの出力レベルを変更するフローを追加します。[Get DI2] の下に [inject] ノードをドラッグ、ドロップします。
  15. [inject] ノードのプロパティを編集します。

    名前: Output LOW
    msg.payload: 0
    繰り返し: なし
    images/node-red/get_di2_outpu_low_prop.png

    図4.26 [inject] ノードのプロパティ内容


  16. [Output LOW] の下に [inject] ノードをドラッグ、ドロップします。
  17. [inject] ノードのプロパティを編集します。

    名前: Output HIGH
    msg.payload: 1
    繰り返し: なし
    images/node-red/get_di2_outpu_high_prop.png

    図4.27 [inject] ノードのプロパティ内容


  18. [GPIO out] ノードをドラッグ、ドロップします。
  19. [GPIO out] ノードのプロパティを編集します。

    Device:gpiochip1
    Type:Digital (0/1)
    Pin: 1
    Name:DO2
    images/node-red/get_di2_do2_prop.png

    図4.28 [GPIO out] ノードのプロパティ内容


  20. [Output LOW] ノードの右側にある端子をクリックし、[DO2] ノードの左側の端子を選択して放します。
  21. [Output HIGH] ノードの右側にある端子をクリックし、[DO2] ノードの左側の端子を選択して放します。 [DO2] ノードの左側は二つのノードが繋がっている状態になります。

    images/node-red/get_di2_rising_edge_flow.png

    図4.29 接点入力の入力レベルの立ち上がりエッジを検出するフローとデバッグメッセージ


  22. 画面右上の [デプロイ] を押します。 [Output LOW] を押した後に [Output HIGH] を押した場合に、立ち上がりエッジを検出して "notify!" がサイドバーのデバッグメッセージに表示されます。

4.4.6. RS-485 modbus RTU 読み出しを行う

ここでは、 RS-485 を使用した Modubus RTU 読み出し用フローを作成します。 Node-RED のコアノードのほかに modbus-client ノード、Modbus-Read ノード、 modbus-response ノードを使用します。 Armadillo-IoT ゲートウェイ A9E の CON3 にある RS-485 を使用します。 RS-485 シリアルインターフェースのデバイスファイルは、/dev/ttyrpmsg30 を使用します。 RS-485 の場所については 「インターフェースレイアウト」 をご確認ください。

表4.11 CON3 信号配列(RS-485関連)

ピン番号 ピン名

1

DATA+

2

DATA-

3

GND


機能
  • 最大データ転送レート : 5Mbps
  • 半二重対応
  • RS-485 シリアルインターフェースのデバイスファイルは、/dev/ttyrpmsg30 を使用します。

終端抵抗 120Ω の ON/OFFをスイッチ (SW3) で切り替えることができます、設定方法は以下をご確認ください。

images/a9e-sw3.svg

図4.30 スイッチの状態と終端抵抗のON/OFF


images/common-images/callouts/1.svg
終端抵抗 120Ω がONになります。
images/common-images/callouts/2.svg
終端抵抗 120Ω がOFFになります。
[ティップ]

終端はRS-485の信号線の最遠端で行います。 Armadillo-IoT ゲートウェイ A9E が最遠端になる場合は終端抵抗をONにしてください。

接続に関する注意事項は以下です。

表4.12 CON3 接続可能な電線

規格

UL

IEC

電線範囲

26~18 AWG

0.12~0.9mm2

被覆剥き長さ

5~6mm

使用可能フェルール端子

型番 : MFL25-5BE

メーカー:ミスミ

推奨ねじ締めトルク

0.2Nm


[警告]

電線の先端に予備半田しないでください。正しい接続ができなくなります。

[警告]

端子台に電線を接続する際、端子台に過度な力を加えないでください。 端子台が破損する恐れがあります。

RS-485通信対応デバイスとの接続方法について以下に示します。

images/node-red/example_rs485_connect.png

図4.31 RS-485通信対応デバイスとの接続方法


今回は以下のRS-485通信対応デバイスを想定した場合の設定内容となります。 実際に動作確認する場合は、使用するRS-485通信対応デバイスの設定に変更してください。

ユニットID: 1
通信プロトコル: Modbus RTU
ボーレート: 9600
読み出しアドレス: 0x00
ファンクションコード: 1
  1. パレットから [Modbus-Read] ノードをワークスペースにドラッグ、ドロップします。
  2. [Modbus-Read] ノードのプロパティを編集します。
  3. 先に Server を設定する必要があります。[新規に modbus-client を追加] の右隣の編集ボタンを押して [modbus-client] を作成します。

    名前: RS485 slave device
    Type: Serial
    Serial port: /dev/ttyrpmsg1
    Serial type: RTU
    Baud rate: 9600
    Unit-Id: 1
    images/node-red/read_modbus_client_prop.png

    図4.32 [modbus-client] ノードのプロパティ内容


  4. [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
    images/node-red/read_modbus_prop.png

    図4.33 [Modbus-Read] ノードのプロパティ内容


  5. [Modbus-Response] ノードをドラッグ、ドロップします。
  6. [slave device] ノードの右側にある端子をクリックし、[Modbus-Response] ノードの左側の端子を選択して放します。

    images/node-red/read_modbus_flow.png

    図4.34 RS-485 を使用した Modubus RTU 読み出し用フロー


  7. 画面右上の [デプロイ] を押します。読み出しに成功すると 1 秒毎に読みだした値が更新され [Modbus-Response] ノードの下に表示されます。

4.4.7. CPU の測定温度のグラフをダッシュボードに表示する

「CPU の測定温度を取得する」 で取得した CPU 温度をダッシュボードにグラフとして表示するフローを作成します。

  1. サイドバーの右端にある三角形のボタンを押し、[ダッシュボード] を選択します。

    images/node-red/common-images/dashboard_select.png

    図4.35 [ダッシュボード]を選択する


  2. [ダッシュボード] 編集画面が表示されることを確認します。

    images/node-red/common-images/dashboard_start.png

    図4.36 ダッシュボード編集画面


  3. [+タブ] ボタンを押して [Tab1] を追加します。

    images/node-red/common-images/dashboard_add_tab.png

    図4.37 ダッシュボードに [TAb1] を追加


  4. [Tab1] プロパティを編集します。

    名前: Armadillo
    アイコン: dashboard
    images/node-red/common-images/dashboard_tab_prop.png

    図4.38 [Tab1] プロパティ内容


  5. [Armadillo] タブが追加されました。

    名前: Armadillo
    アイコン: dashboard
    images/node-red/common-images/dashboard_add_armadillo.png

    図4.39 ダッシュボード編集画面に [Armadillo] タブが追加


  6. [Armadillo] 横の [+グループ] ボタンを押して [Group1] を追加します。

    名前: Armadillo
    アイコン: dashboard
    images/node-red/common-images/dashboard_add_group.png

    図4.40 ダッシュボード編集画面に [Group1] グループが追加


  7. [Group1] プロパティを編集します。

    名前: Group 1
    タブ: Armadillo
    種類:
    幅: 15
    □グループ名を表示する
    images/node-red/common-images/dashboard_group_prop.png

    図4.41 [Group1] プロパティ内容


  8. [chart] ノードをワークスペースにドラッグ、ドロップします。ダッシュボード編集画面の [Group1] グループに追加されたことを確認します。

    images/node-red/common-images/dashboard_add_chart.png

    図4.42 ダッシュボード編集画面に [chart] ノードが追加


  9. [chart] ノードのプロパティを編集します。

    グループ: [Armadillo] Group 1
    サイズ: 自動
    ラベル: CPU temp
    種類: 折れ線グラフ
    X軸: 直近 1 時間
    X軸ラベル: HH:mm:ss
    Y軸: 最小 20 最大 50
    凡例: 非表示 補完: 直線
    images/node-red/common-images/cpu_temp_dashboard_chart_prop.png

    図4.43 [inject] ノードのプロパティ内容


  10. [CPU temp calc] ノードの右側にある端子をクリックし、[CPU temp] ノードの左側の端子を選択して放します。

    images/node-red/common-images/cpu_temp_dashboard_flow.png

    図4.44 CPU の測定温度のグラフをダッシュボードに表示するフロー


  11. 画面右上の [デプロイ] を押します。ダッシュボード編集画面の [テーマ] タブの右側にある四角に矢印が重なったボタンを選択すると、ダッシュボードが表示されます。

    images/node-red/common-images/cpu_temp_dashboard.png

    図4.45 CPU の測定温度のグラフのダッシュボード


  12. ダッシュボードの CPU 温度のグラフは一秒毎に更新されます。

4.4.8. 外部プログラムを実行する

ここでは、外部プログラムを実行しその結果を取得するフローを作成します。 外部プログラムは [exec] ノードで実行することができます。 ここでの外部プログラムとはシステムコマンドやユーザー自身が作成したプログラムのことを指します。

例として date コマンドを実行するフローを作成します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  2. [exec] ノードをドラッグ、ドロップします。
  3. [exec] ノードのプロパティを編集します。

    コマンド: date
    引数: なし
    images/node-red/common-images/exec_prop.png

    図4.46 [exec] ノードのプロパティ内容


  4. [indect] ノードの右側にある端子をクリックし、[exec] ノードの左側の端子を選択して放 します。
  5. [debug] ノードをドラッグ、ドロップします。
  6. [exec] ノードの右側の一番上にある端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/exec_flow.png

    図4.47 外部プログラムを実行するフロー


  7. 画面右上の [デプロイ] を押します。
  8. [inject] ノードの左の四角を押すと [exec] ノードに設定した date コマンドが実行され標準出力の結果が デバッグメッセージに表示されます。

[exec] ノードの右の端子は上からそれぞれ「標準出力」「標準エラー出力」「返却コード」となっており、 取得したい出力によって使い分けることができます。

4.4.9. Node-RED を終了する

ここでは、 Node-RED を任意のタイミングで終了するフローを作成します。 Node-RED のコアノードのほかに exit ノードを使用します。

[警告]

Node-RED 終了後、Node-RED を再起動するためには Armadillo-IoT ゲートウェイ A9E の電源を再投入する必要があります。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします
  2. [inject] ノードのプロパティを編集します。

    名前: Finish Node-RED
    繰り返し: なし
    images/node-red/common-images/finish_inject_prop.png

    図4.48 [inject] ノードのプロパティ内容


  3. [exit] ノードをドラッグ、ドロップします。
  4. [exit] ノードのプロパティを編集します。

    Name: exit
    Exit code: 0
    images/node-red/common-images/finish_exit_prop.png

    図4.49 [exit] ノードのプロパティ内容


  5. [Finish Node-RED] ノードの右側にある端子をクリックし、[exit] ノードの左側の端子を選択して放します。

    images/node-red/common-images/finish_flow.png

    図4.50 Node-RED を任意のタイミングで終了するフロー


  6. 画面右上の [デプロイ] を押します。[Finish Node-RED] ノードの左側にあるボタンを押すと Node-RED が終了します。

4.5. ユーザデータを削除する

Node-RED に関するユーザデータは /var/app/rollback/volumes/node-red/root に保存されます。 当ディレクトリを削除した場合はユーザデータは全て削除されます。 この場合 Node-RED のブラウザからインストールしたカスタムノードは削除されます。

4.6. AWS へデバイス情報を送信するフローを作成する

Armadillo-IoT ゲートウェイ A9E から AWS サービスへデバイス情報を送信するための一連のフローについて説明します。 デバイス状態の送信には AWS IoT Device Shadow サービスを利用します。

[警告]

この機能を使用するには、バージョン 1.1.0 以上の Node-RED コンテナが必要です。

手順を以下に示します。

最初に AWS 上で作業が必要です。

  • AWS アカウントの作成
  • IAM ユーザーの作成
  • デバイスデータエンドポイントの取得

以下は Node-RED 上で操作します。

  • デバイス証明書を取得するフローの作成
  • デバイスを登録するフローの作成
  • AWS IoT ポリシーを作成するフローの作成
  • デバイス証明書を登録するフローの作成
  • ポリシーをアタッチするフローの作成

ここまでの手順はデバイス登録のために一度のみ実行する必要があります。 もし、デバイスを誤って削除してしまった場合や、登録した証明書の期限が切れた場合などがあれば、 再度実行する必要があります。

AWS IoT Device Shadow サービスを利用して、デバイスシャドウを制御します。 本ドキュメントでは、暗号化したデバイスシャドウを用いることで、デバイス状態についてよりセキュアに通信します。 デバイスシャドウを制御するフローについては、以下になります。

  • デバイスシャドウを取得するフローの作成
  • デバイスシャドウを更新するフローの作成
  • デバイスシャドウを削除するフローの作成

4.6.1. AWS アカウントの作成

AWS アカウントの作成方法については、AWS 公式サイトの AWS アカウント作成の流れ を参照してください。

4.6.2. IAM ユーザーの作成

AWS IAM (Identity and Access Management) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。 IAM により、誰を認証(サインイン)し、誰にリソースの使用を承認する(アクセス許可を持たせる)かを管理することができます。

本章では以下の手順について説明します。

  • IAM ユーザーの作成
  • IAM ユーザーにポリシーの設定
  • IAM ユーザーのアクセスキーの作成

4.6.2.1. IAM ユーザーを作成する

IAM ユーザの作成については 公式のドキュメント を参照してください。

4.6.2.2. IAM ユーザーにポリシーを設定する

作成した AWS IAM ユーザには AWS IoT Device Shadow サービスを利用するために必要な許可を与える必要があります。 必要なポリシーについては 公式のドキュメント を参照してください。 以下はポリシーの例です。ポリシー名については任意の名前を与えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:Get*",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeletePolicy",
                "iam:DeleteRole",
                "iam:AttachRolePolicy",
                "iam:List*",
                "iam:Pass*",
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:AcceptCertificateTransfer",
                "iot:AddThingToThingGroup",
                "iot:AssociateTargetsWithJob",
                "iot:Attach*",
                "iot:Cancel*",
                "iot:ClearDefaultAuthorizer",
                "iot:Create*",
                "iot:Delete*",
                "iot:DeprecateThingType",
                "iot:Describe*",
                "iot:Detach*",
                "iot:DisableTopicRule",
                "iot:EnableTopicRule",
                "iot:Get*",
                "iot:List*",
                "iot:Register*",
                "iot:RejectCertificateTransfer",
                "iot:RemoveThingFromThingGroup",
                "iot:ReplaceTopicRule",
                "iot:SearchIndex",
                "iot:Set*",
                "iot:StartThingRegistrationTask",
                "iot:StopThingRegistrationTask",
                "iot:TransferCertificate",
                "iot:Update*",
                "autoscaling:Describe*",
                "cloudwatch:*",
                "logs:*",
                "s3:PutObject",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:CreateBucket",
                "cloudformation:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/events.amazonaws.com/AWSServiceRoleForCloudWatchEvents*",
            "Condition": {
                "StringLike": {
                    "iam:AWSServiceName": "events.amazonaws.com"
                }
            }
        }
    ]
}

図4.51 ポリシーの例


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 アプリケーション向けのセキュアエレメントです。 フラッシュメモリを内蔵しており、保存された秘密鍵を外部に露出することなく暗号処理に利用できます。

セキュアエレメントは I2C デバイスとして認識されます。 製品によって I2C バスが異なるためご注意ください。 Armadillo-IoT ゲートウェイ A9E で使用する I2C バスを 表4.13「I2C デバイス」 に示します。

表4.13 I2C デバイス

I2C バス

I2C デバイス

アドレス

デバイス名

6(I2C6)

0x48

SE050(セキュアエレメント)


このフローでは秘密鍵とデバイス証明書を EdgeLock SE050 より取得して、/var/app/rollback/volumes/node-red/cert に保存します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  2. [exec] ノードをドラッグ、ドロップします。
  3. [exec] ノードのプロパティを編集します。

    コマンド: se05x_getkey 0xF0000111 /cert/device_cert.pem /dev/i2c-6:0x48
    引数: チェックなし
    出力: コマンド終了時 - execモード
    名前: デバイス証明書の取得
    images/node-red/exec_get_device_cert.png

    図4.52 [デバイス証明書の取得] ノードのプロパティ内容


  4. [inject] ノードの右側にある端子をクリックし、[デバイス証明書の取得] ノードの左側の端子を選択して放します。
  5. もう一つ [exec] ノードをドラッグ、ドロップします。
  6. [exec] ノードのプロパティを編集します。

    コマンド: ls /cert
    引数: チェックなし
    出力: コマンド終了時 - execモード
    名前: ファイルの確認
    images/node-red/common-images/aws/exec_cert_dir.png

    図4.53 [ファイルの確認] ノードのプロパティ内容


  7. [デバイス証明書の取得] ノードの右側にある端子をクリックし、 [ファイルの確認] ノードの左側の端子を選択して放します。
  8. もう一つ、[inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  9. [exec] ノードをドラッグ、ドロップします。
  10. [exec] ノードのプロパティを編集します。

    コマンド: se05x_getkey 0xF0000110 /cert/key.pem /dev/i2c-6:0x48
    引数: チェックなし
    出力: コマンド終了時 - execモード
    名前: リファレンスキーの取得
    images/node-red/exec_get_key.png

    図4.54 [リファレンスキーの取得] ノードのプロパティ内容


  11. 二つ目の [inject] ノードの右側にある端子をクリックし、 [リファレンスキーの取得] ノードの左側の端子を選択して放します。
  12. [リファレンスキーの取得] ノードの右側にある端子をクリックし、 [ファイルの確認] ノードの左側の端子を選択して放します。
  13. [debug] ノードをドラッグ、ドロップします。
  14. [ファイルの確認] ノードの右側の一番上にある端子をクリックし、 [debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/get_device_cert_flow.png

    図4.55 デバイス証明書を取得するフロー


  15. 画面右上の [デプロイ] を押します。
  16. [inject] ノードの左の四角をそれぞれ押すと、コマンドの実行結果結果がデバッグメッセージに表示されます。 下記ファイルが出力されていれば取得に成功しています。
AmazonRootCA1.pem
device_cert.pem
key.pem

図4.56 ファイル一式


実行に成功した場合は /var/app/rollback/volumes/node-red/cert/ にデバイス証明書が保存されています。

4.6.5. デバイスを登録するフローの作成

AWS IoT Device Shadow サービスを利用するため、AWS IoT Core にデバイス(モノ)を登録する必要があります。 今回モノの名前はデバイスのシリアルナンバー(例: 001234567890)を使用します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  2. [credentials] ノードをドラッグ、ドロップします。
  3. [credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。 private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_access_key
    private: [hidden] 2
    to: [msg.] aws_secret_key
    private: [文字列] 3
    to: [msg.] aws_iot_region
    private: [hidden] 4
    to: [msg.] aws_iot_host

    1

    「IAM ユーザーの作成」で取得したアクセスキー

    2

    「IAM ユーザーの作成」で取得したシークレットキー

    3

    リージョン(例: ap-northeast-1)

    4

    IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)

    images/node-red/common-images/aws/credentials.png

    図4.57 [接続情報の登録] ノードのプロパティ内容


  4. [inject] ノードの右側にある端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
  5. [function] ノードをドラッグ、ドロップします。
  6. [function] ノードのプロパティを編集します。

    名前: デバイス登録の引数設定
    コード:
    msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
        + " " + msg.aws_iot_region
        + " " + msg.aws_iot_host;
    return msg;
    images/node-red/common-images/aws/function_arg_register_device.png

    図4.58 [exec queue] ノードのプロパティ内容


  7. [接続情報の登録] ノードの右側にある端子をクリックし、 [デバイス登録の引数設定] ノードの左側の端子を選択して放します。
  8. [exec queue] ノードをドラッグ、ドロップします。
  9. [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
    images/node-red/common-images/aws/exec_queue_register_device.png

    図4.59 [exec queue] ノードのプロパティ内容


  10. [デバイス登録の引数設定] ノードの右側にある端子をクリックし、 [デバイス登録] ノードの左側の端子を選択して放します。
  11. [function] ノードをドラッグ、ドロップします。
  12. [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;
    images/node-red/common-images/aws/function_get_thing_name.png

    図4.60 [デバイス名の取得] ノードのプロパティ内容


  13. [debug] ノードをドラッグ、ドロップします。
  14. [デバイス名の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/new_thing_flow.png

    図4.61 デバイスを登録するフロー


  15. 画面右上の [デプロイ] を押します。
  16. [inject] ノードの左の四角を押すと登録したモノの名前がデバッグメッセージに表示されます。
"thingName:001234567890"

図4.62 登録したモノの名前


表示されたモノの名前がデバイスシャドウの対象になります。 もし、デバイスの登録に失敗した場合はエラーに応じたステータスコードを表示します。

4.6.6. AWS IoT ポリシーを作成するフローの作成

登録したモノに対して AWS IoT Device Shadow サービスを利用するための許可を与える必要があります。 そのため、必要な AWS IoT ポリシーを作成してアタッチする必要があります。 まず、ポリシーを新しく作成します。 「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。

  1. [接続情報の登録] ノードのプロパティに [ポリシー名] を追加します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_access_key
    private: hidden: 2
    to: [msg.] aws_secret_key
    private: [文字列] 3
    to: [msg.] aws_iot_region
    private: [hidden] 4
    to: [msg.] aws_iot_host
    private: [hidden] 5
    to: [msg.] aws_policy_name

    1

    「IAM ユーザーの作成」で取得したアクセスキー

    2

    「IAM ユーザーの作成」で取得したシークレットキー

    3

    リージョン(例: ap-northeast-1

    4

    IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)

    5

    ポリシー名(例: node-red-thing-policy)

    images/node-red/common-images/aws/credentials.png

    図4.63 [接続情報の登録] ノードのプロパティ内容


  2. [function] ノードをドラッグ、ドロップします。
  3. [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;
    images/node-red/common-images/aws/function_arg_new_policy.png

    図4.64 [ポリシー登録の引数設定] ノードのプロパティ内容


  4. [接続情報の登録] ノードの右側にある端子をクリックし、 [ポリシー登録の引数設定] ノードの左側の端子を選択して放します。
  5. [exec queue] ノードをドラッグ、ドロップします。
  6. [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
    images/node-red/common-images/aws/exec_queue_new_policy.png

    図4.65 [新しいポリシーの作成] ノードのプロパティ内容


  7. [ポリシー登録の引数設定] ノードの右側にある端子をクリックし、 [新しいポリシーの作成] ノードの左側の端子を選択して放します。
  8. [function] ノードをドラッグ、ドロップします。
  9. [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;
    images/node-red/common-images/aws/function_get_policy_name.png

    図4.66 [ポリシー名の取得] ノードのプロパティ内容


  10. [新しいポリシーの作成] ノードの右側にある端子をクリックし、 [ポリシー名の取得] ノードの左側の端子を選択して放します。
  11. [debug] ノードをドラッグ、ドロップします。
  12. [ポリシー名の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/new_policy_flow.png

    図4.67 ポリシーを作成するフロー


  13. 画面右上の [デプロイ] を押します。
  14. [inject] ノードの左の四角を押すとポリシー作成の結果がデバッグメッセージに表示されます。
"policyName:node-red-thing-policy"

図4.68 登録したポリシーの名前


すでに登録済みの場合は "Policy cannot be created - name already exists が表示されます。 もし、ポリシーの作成に失敗した場合はエラーに応じたステータスコードを表示します。

4.6.7. デバイス証明書を登録するフローの作成

登録したデバイスのデバイス証明書を登録します。 「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。

  1. パレットから [function] ノードをワークスペースにドラッグ、ドロップします。
  2. [function] ノードのプロパティを編集します。

    名前: デバイス証明書登録の引数設定
    コード:
    msg.payload = msg.aws_access_key + ":" + msg.aws_secret_key
        + " " + msg.aws_iot_region
        + " " + msg.aws_iot_host;
    return msg;
    images/node-red/common-images/aws/function_arg_register_device_cert.png

    図4.69 [デバイス証明書登録の引数設定] ノードのプロパティ内容


  3. [接続情報の登録] ノードの右側にある端子をクリックし、 [デバイス証明書登録の引数設定] ノードの左側の端子を選択して放します。
  4. [exec queue] ノードをドラッグ、ドロップします。
  5. [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
    images/node-red/common-images/aws/exec_queue_register_device_cert.png

    図4.70 [デバイス証明書の登録] ノードのプロパティ内容


  6. [デバイス証明書登録の引数設定] ノードの右側にある端子をクリックし、 [デバイス証明書の登録] ノードの左側の端子を選択して放します。
  7. [function] ノードをドラッグ、ドロップします。
  8. [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;
    images/node-red/common-images/aws/function_get_cert_arn.png

    図4.71 [証明書 ID の取得] ノードのプロパティ内容


  9. [デバイス証明書の登録] ノードの右側にある端子をクリックし、 [証明書 ID の取得] ノードの左側の端子を選択して放します。
  10. [debug] ノードをドラッグ、ドロップします。
  11. [証明書 ID の取得] ノードの右側の端子をクリックし、 [debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/register_device_cert_flow.png

    図4.72 デバイス証明書を登録するフロー


  12. 画面右上の [デプロイ] を押します。
  13. [inject] ノードの左の四角を押すとデバイス証明書の登録結果がデバッグメッセージに表示されます。 実際は使用しているリージョン名と、アカウントID が含まれます。
"certificateArn: arn:aws:iot:ap-northeast-1:00000000:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

図4.73 証明書 ID名


すでに登録済みの場合は "The certificate is already provisioned or registered" が表示されます。 もし、デバイス証明書の登録に失敗した場合はエラーに応じたステータスコードを表示します。

4.6.8. AWS IoT ポリシーをデバイスにアタッチするフローの作成

「AWS IoT ポリシーを作成するフローの作成」 で作成したポリシーをデバイスにアタッチします。 「デバイスを登録するフローの作成」 で作成した [接続情報の登録] ノードを使用します。

  1. [接続情報の登録] ノードのプロパティに、 「デバイス証明書を登録するフローの作成」 で取得した [証明書ID] を追加します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_access_key
    private: [hidden] 2
    to: [msg.] aws_secret_key
    private: [文字列] 3
    to: [msg.] aws_iot_region
    private: [hidden] 4
    to: [msg.] aws_iot_host
    private: [hidden] 5
    to: [msg.] aws_cert_arn

    1

    「IAM ユーザーの作成」で取得したアクセスキー

    2

    「IAM ユーザーの作成」で取得したシークレットキー

    3

    リージョン(例: ap-northeast-1)

    4

    IoT Core REST API エンドポイント(例: iot.ap-northeast-1.amazonaws.com)

    5

    証明書ID (例: arn:aws:iot:ap-northeast-1:00000000:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)

    images/node-red/common-images/aws/credentials.png

    図4.74 [接続情報の登録] ノードのプロパティ内容


  2. パレットから [function] ノードをワークスペースにドラッグ、ドロップします。
  3. [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;
    images/node-red/common-images/aws/function_arg_attach_policy.png

    図4.75 [ポリシーをアタッチするための引数設定] ノードのプロパティ内容


  4. [接続情報の登録] ノードの右側にある端子をクリックし、 [ポリシーをアタッチするための引数設定] ノードの左側の端子を選択して放します。
  5. [exec queue] ノードをドラッグ、ドロップします。
  6. [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
    images/node-red/common-images/aws/exec_queue_attach_policy.png

    図4.76 [ポリシーを証明書にアタッチ] ノードのプロパティ内容


  7. [ポリシーをアタッチするための引数設定] ノードの右側にある端子をクリックし、 [ポリシーを証明書にアタッチ] ノードの左側の端子を選択して放します。
  8. [function] ノードをドラッグ、ドロップします。
  9. [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;
    images/node-red/common-images/aws/function_attach_policy_result.png

    図4.77 [ポリシーアタッチ結果の取得] ノードのプロパティ内容


  10. [ポリシーを証明書にアタッチ] ノードの右側にある端子をクリックし、 [ポリシーアタッチ結果の取得] ノードの左側の端子を選択して放します。
  11. [debug] ノードをドラッグ、ドロップします。
  12. [ポリシーアタッチ結果の取得] ノードの右側の端子をクリックし、 [debug] ノードの左側の端子を選択して放します。
  13. [exec queue] ノードをドラッグ、ドロップします。
  14. [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
    images/node-red/common-images/aws/exec_queue_attach_cert.png

    図4.78 [証明書をデバイスにアタッチ] ノードのプロパティ内容


  15. [ポリシーをアタッチするための引数設定] ノードの右側にある端子をクリックし、 [証明書をデバイスにアタッチ] ノードの左側の端子を選択して放します。
  16. [function] ノードをドラッグ、ドロップします。
  17. [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;
    images/node-red/common-images/aws/function_attach_cert_result.png

    図4.79 [証明書アタッチ結果の取得] ノードのプロパティ内容


  18. [証明書をデバイスにアタッチ] ノードの右側にある端子をクリックし、 [証明書アタッチ結果の取得] ノードの左側の端子を選択して放します。
  19. [証明書アタッチ結果の取得] ノードの右側の端子をクリックし、 [debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/thing_attach_policy_flow.png

    図4.80 デバイスにポリシーをアタッチするフロー


  20. 画面右上の [デプロイ] を押します。
  21. [inject] ノードの左の四角を押すとデバイスにポリシーがアタッチされます。

アタッチに成功した場合は "success" が表示されます。 もし、失敗した場合はエラーに応じたステータスコードを表示します。

4.6.9. デバイスシャドウを取得するフローの作成

デバイスが登録されている場合、デバイスシャドウが取得可能です。 対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  2. [credentials] ノードをドラッグ、ドロップします。
  3. [credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。 private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_device_endpoint

    1

    「デバイスデータエンドポイントを取得する」 で取得したデバイスデータエンドポイント(例: aaaaaaaa.iot.ap-northeast-1.amazonaws.com)

    images/node-red/common-images/aws/credentials_cert_get_thing_shadow.png

    図4.81 [接続情報の登録] ノードのプロパティ内容


  4. [inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
  5. [function] ノードをドラッグ、ドロップします。
  6. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ取得のための引数設定
    コード:
    msg.payload = msg.aws_device_endpoint;
    return msg;
    images/node-red/common-images/aws/function_arg_cert_get_device_shadow.png

    図4.82 [デバイスシャドウ取得のための引数設定] ノードのプロパティ内容


  7. [接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ取得のための引数設定] ノードの左側の端子を選択して放します。
  8. [exec queue] ノードをドラッグ、ドロップします。
  9. [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}"
    images/node-red/common-images/aws/exec_queue_cert_get_device_shadow.png

    図4.83 [暗号化を使用したデバイスシャドウの取得] ノードのプロパティ内容


  10. [デバイスシャドウ更新のための引数設定] ノードの右側の端子をクリックし、 [暗号化を使用したデバイスシャドウの取得] ノードの左側の端子を選択して放します。
  11. [function] ノードをドラッグ、ドロップします。
  12. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ内容の取得
    コード:
    var res = msg.payload.match(/\{.*\}/);
    msg.payload = res[0];
    return msg;
    images/node-red/common-images/aws/function_cert_get_device_shadow.png

    図4.84 [デバイスシャドウ内容の取得] ノードのプロパティ内容


  13. [暗号化を使用したデバイスシャドウの取得] ノードの右側の端子をクリックし、 [デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
  14. [debug] ノードをドラッグ、ドロップします。
  15. [デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/cert_get_thing_shadow_flow.png

    図4.85 データの暗号化を使用したデバイスシャドウを取得するフロー


  16. 画面右上の [デプロイ] を押します。
  17. [inject] ノードの左の四角を押すと取得したデバイスシャドウの内容がデバッグメッセージに表示されます。 デバイスシャドウが作成されていない場合は "No shadow exists with name: 001234567890" のように表示されます。

4.6.10. デバイスシャドウを更新するフローの作成

デバイスシャドウを更新します。 対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。
  2. [inject] ノードのプロパティを編集します。

    名前: デバイスシャドウ内容
    msg.payload: { "state": {"desired": {"message": "success" }}}
    images/node-red/common-images/aws/update_thing_shadow_payload.png

    図4.86 [デバイスシャドウ内容] ノードのプロパティ内容


  3. [credentials] ノードをドラッグ、ドロップします。
  4. [credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。 private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_device_endpoint

    1

    「デバイスデータエンドポイントを取得する」 で取得したデバイスデータエンドポイント(例: aaaaaaaa.iot.ap-northeast-1.amazonaws.com)

    images/node-red/common-images/aws/credentials_cert_get_thing_shadow.png

    図4.87 [接続情報の登録] ノードのプロパティ内容


  5. [inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
  6. [function] ノードをドラッグ、ドロップします。
  7. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ更新のための引数設定
    コード:
    msg.payload = "\'" + msg.payload + "\'"
        + " " + msg.aws_device_endpoint;
    return msg;
    images/node-red/common-images/aws/function_arg_cert_update_device_shadow.png

    図4.88 [デバイスシャドウ更新のための引数設定] ノードのプロパティ内容


  8. [接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ取得のための引数設定] ノードの左側の端子を選択して放します。
  9. [exec queue] ノードをドラッグ、ドロップします。
  10. [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}"
    images/node-red/common-images/aws/exec_queue_cert_update_device_shadow.png

    図4.89 [暗号化を使用したデバイスシャドウの更新] ノードのプロパティ内容


  11. [デバイスシャドウ更新のための引数設定] ノードの右側の端子をクリックし、 [暗号化を使用したデバイスシャドウの更新] ノードの左側の端子を選択して放します。
  12. [function] ノードをドラッグ、ドロップします。
  13. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ内容の取得
    コード:
    var res = msg.payload.match(/\{.*\}/);
    msg.payload = res[0];
    return msg;
    images/node-red/common-images/aws/function_cert_get_device_shadow.png

    図4.90 [デバイスシャドウ内容の取得] ノードのプロパティ内容


  14. [暗号化を使用したデバイスシャドウの更新] ノードの右側の端子をクリックし、 [デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
  15. [debug] ノードをドラッグ、ドロップします。
  16. [デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/cert_update_thing_shadow_flow.png

    図4.91 データの暗号化を使用したデバイスシャドウを更新するフロー


  17. 画面右上の [デプロイ] を押します。
  18. [inject] ノードの左の四角を押すと更新したデバイスシャドウの内容がデバッグメッセージに表示されます。

4.6.11. デバイスシャドウを削除するフローの作成

デバイスシャドウを削除します。 対象とするデバイスは 「デバイスを登録するフローの作成」 で取得した thingName を使用します。

  1. パレットから [inject] ノードをワークスペースにドラッグ、ドロップします。 プロパティはデフォルトから変更ありません。
  2. [credentials] ノードをドラッグ、ドロップします。
  3. [credentials] ノードのプロパティを編集します。[追加] ボタンを押して値を追加します。 private のステータスが [文字列] のままだと内容が表示されたままのため、確認後は [hidden] に変更するのを推奨します。

    Name: 接続情報の登録
    Values:
    private: [hidden] 1
    to: [msg.] aws_device_endpoint

    1

    「デバイスデータエンドポイントを取得する」 で取得したデバイスデータエンドポイント(例: aaaaaaaa.iot.ap-northeast-1.amazonaws.com)

    images/node-red/common-images/aws/credentials_cert_get_thing_shadow.png

    図4.92 [接続情報の登録] ノードのプロパティ内容


  4. [inject] ノードの右側の端子をクリックし、[接続情報の登録] ノードの左側の端子を選択して放します。
  5. [function] ノードをドラッグ、ドロップします。
  6. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ削除のための引数設定
    コード:
    msg.payload = msg.aws_device_endpoint;
    return msg;
    images/node-red/common-images/aws/function_arg_cert_delete_device_shadow.png

    図4.93 [デバイスシャドウ削除のための引数設定] ノードのプロパティ内容


  7. [接続情報の登録] ノードの右側の端子をクリックし、[デバイスシャドウ削除のための引数設定] ノードの左側の端子を選択して放します。
  8. [exec queue] ノードをドラッグ、ドロップします。
  9. [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}"
    images/node-red/common-images/aws/exec_queue_cert_delete_device_shadow.png

    図4.94 [暗号化を使用したデバイスシャドウの削除] ノードのプロパティ内容


  10. [デバイスシャドウ削除のための引数設定] ノードの右側の端子をクリックし、 [暗号化を使用したデバイスシャドウの削除] ノードの左側の端子を選択して放します。
  11. [function] ノードをドラッグ、ドロップします。
  12. [function] ノードのプロパティを編集します。

    名前: デバイスシャドウ内容の取得
    コード:
    var res = msg.payload.match(/\{.*\}/);
    msg.payload = res[0];
    return msg;
    images/node-red/common-images/aws/function_cert_get_device_shadow.png

    図4.95 [デバイスシャドウ内容の取得] ノードのプロパティ内容


  13. [暗号化を使用したデバイスシャドウの更新] ノードの右側の端子をクリックし、 [デバイスシャドウ内容の取得] ノードの左側の端子を選択して放します。
  14. [debug] ノードをドラッグ、ドロップします。
  15. [デバイスシャドウ内容の取得] ノードの右側の端子をクリックし、[debug] ノードの左側の端子を選択して放します。

    images/node-red/common-images/aws/cert_delete_thing_shadow_flow.png

    図4.96 データの暗号化を使用したデバイスシャドウを削除するフロー


  16. 画面右上の [デプロイ] を押します。
  17. [inject] ノードの左の四角を押すと削除したデバイスシャドウの内容がデバッグメッセージに表示されます。 デバイスシャドウがすでに削除されている場合は "No shadow exists with name: 001234567890" のように表示されます。