SORACOM Beam からMQTTプロトコルでIMSIを付与してデータを送信してみたいと思います。
SORACOM Beam からの送信データの確認
MQTTサーバの導入はこちらの記事を参考にします
SORACOM BeamであたらいいMQTTエンドポイントを定義しましょう。
- ホスト名にはSoftLayerの仮想サーバのパブリックIPアドレスを記入
- エンドポイントを複数設定できるとありがたいですね(一般的に必要なのかは不明ですが)
この状態で送信して確認してみました。
IMSIを付与しない場合
d:urf054:SORACOM-beam:test (d0, q0, r0, m0, 'iot-2/evt/test/fmt/json', ... (32 bytes))
IMSIを付与する場合
d:urf054:SORACOM-beam:test (d0, q0, r0, m0, 'iot-2/evt/test/fmt/json/4401031448xxxxxxx', ... (32 bytes))
というように「トピック」の最後にIMSI番号が付与されています。(確かにSORACOM Beamの設定に書かれている通りになっていますね)
Bluemix IoTFでの確認
ここでBluemixの仕様を見てみると(最初から読めという話だが)
パブリッシュ先トピック iot-2/evt/event_id/fmt/format_string
- (https://docs.internetofthings.ibmcloud.com/ja/messaging/devices.html)
と記載されています。送信する際に fmt/「json」 としていたのですがこの状態では fmt/json/44xxxx となり format errorとなっていた模様です。したがって送信する際に fmt までに変更することでBluemix側で受信することができるようになりました。
これで実際に Node-RED の Debug メッセージを見ていると
確かにそのようになっていますね。
まとめ
SORACOM Beam 経由でBluemix IoTFに送信する際には、「format_string」にIMSIが付与されるのでパブリッシュする際には トピック「iot-2/evt/event_id/fmt」で送信する事。
(サービス仕様をよく読めと)
ところでPython等のMqttライブラリから操作していれば後は処理が出来たのですが、Node-REDの知識が少なくトピック名称をどの様にJavascriptで取得して良いのか調べないといけなくなりました。一旦取得できれば SORACM APIをで get /subscribers/{imsi} で存在確認ができるので適切なものかが確認できますね。
漠然と実際に1データ毎に、確認すればよいかと思っていましたが実際それはトラフィック多すぎになりますよね。{imsi}の情報が付与されており、beams.soracom.comから送信されている時点でOKとすべきなのだろうか。