需要がどの程度あるか分かりませんが、Node-REDのHTTP Requestなどで受けたデータをAWS IoTにMQTTで投げる(つまりNode-REDがHTTPとMQTTのプロトコル変換を行う)方法についてまとめます。
AWS IoTにモノを作成
まず、AWS IoT Coreを開いて、モノを作成します。
「単一のモノを作成する」で良いでしょう。
モノの名前を付けます。ここで付けた名前がMQTTでPublishする際のClientIDになります。タイプとグループは任意で構いません。
モノの証明書を作成します。MQTTでPublishする際に必要となります。「1-Click証明書作成」が簡単で良いでしょう。
作成した証明書のダウンロードを行います。ルートCAのダウンロードも忘れないように。
モノを作成した後に、ポリシーのアタッチが続きますが、一旦「完了」で構いません。
AWS IoTのポリシー作成とアタッチ
次に、安全性>ポリシータブからポリシーを作成します。
ポリシーの名前を付けます。
ステートメントはアドバンスモードを選択し、下記のJSONを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
次に、安全性>ポリシーのタブから安全性>証明書のタブに移って、先ほど作成した証明書を選択し、ポリシーをアタッチします。
これでAWS IoT側の準備は完了です。
いよいよNode-RED
Node-REDで下図のようなフローを作成します。
設定が最も必要なのはMQTT Outのノードです。
「新規にmqtt brokerを追加」を選択し、編集ボタンをクリックします。
ここで、MQTT Brokerと言っているのがAWS IoT Coreです。ちなみに、IBM CloudにもIoTサービスがありますので、そちらを使うこともできます。IBM Cloud上でNode-REDを使っている場合は、ibmiotノードを使えば簡単にPublishすることができます。
AWS IoTでの説明に戻ります。サーバの設定とTLSの設定を行います。
サーバは、AWS IoT Coreのモノの画面から操作タブを開き、HTTPSのところに書いてあるサーバを指定します(HTTPSを使うわけではないのですが、同じサーバを指定すすればMQTTも動作します)。ポートはセキュアMQTTなので8883です。
TLS設定は、先ほどダウンロードした証明書をアップロードします。
次にMQTT Outの前にあるFunctionノードで、Publishするメッセージとトピックを指定します。
このようなJavaScriptのコードです。Publishされるメッセージはmsg.payload
に、トピックはmsg.topic
で指定します。
timestamp = msg.payload;
msg = {
'payload': {
'timestamp': timestamp
},
'topic': 'gw/1001/timestamp'
}
return msg;
Injectを実行する
ここまでに作成したフローをデプロイし、Injectを行います。
あらかじめ、AWS IoTのテスト画面でgw/1001/timestamp
トピックをサブスクライブしておくと、このようにメッセージが表示されます。
今回はInjectノードを使ってタイムスタンプの値をPublishするだけですが、HTTP Requestに変えたりすると頭書のような要件を実現することができるでしょう。