SORACOM Beam経由でAWS IoTデバイスSDK for JavaScriptを使う
ども、大瀧です。
SORACOM Beamは3G/LTEモバイル回線からのトラフィックをプロキシし、認証情報などを付与してサーバーにアクセスするサービスです。AWS IoT(MQTTS)にも対応しており、こちらのエントリーのように利用することができます。
しかし、AWS IoTデバイスSDK for JavaScriptではそのままで利用することができなかったので、その対処方法と設定例を紹介します。
デバイスSDK for JavaScriptは、MQTTSとX509証明書の設定がハードコードされている
SORACOM Beam MQTTエントリポイントは、SIMを差したデバイスからのMQTTトラフィックをX509証明書を付与してMQTTSに変換します。デバイスSDKはAWS IoT Data APIがHTTPS/MQTTSのみ提供されているのに合わせMQTTSに固定されているのでBeamのMQTTエントリポイントへの接続は定義できない、というわけです。
一方で、デバイスSDKのGitHub READMEにあるとおり、デバイスSDKはMQTT.jsをラップしており、MQTT.js自体はMQTTをサポートしています。コンストラクタに渡すパラメータでプロトコル(MQTTS)を決め打ちしているようなので、プロトコル指定のパラメータを読むようにソースを改変しました。せっかくなので、以下のPull Requestを送ってみました。具体的な改変内容はPRをご確認ください。PRが無事masterブランチにマージされたら本家のnpm install
で利用できるようになると思います。
現時点で利用する場合は、直接git clone
で持ってきてください。
$ git clone -b add_protocol_option https://github.com/classmethod-aws/aws-iot-device-sdk-js.git Cloning into 'aws-iot-device-sdk-js'... remote: Counting objects: 131, done. remote: Compressing objects: 100% (4/4), done. remote: Total 131 (delta 0), reused 0 (delta 0), pack-reused 127 Receiving objects: 100% (131/131), 121.37 KiB | 234.00 KiB/s, done. Resolving deltas: 100% (53/53), done. Checking connectivity... done. $
SORACOM Beamの構成
以下の記事をベースに、AWS IoTの証明書発行とBeamでの証明書登録をしましょう。
最近ユーザーコンソールのWeb画面で証明書登録ができるようになったので、SORACOMユーザーコンソールで以下のようにグループ設定を追加しました。SORACOM Air SIMをグループに登録すれば完了です。
サンプルコード
では、SORACOM Air SIMを差したIoTゲートウェイで以下のコードを記述、実行します。
var iotsdk = require('aws-iot-device-sdk'); // LED点滅パターンを定義する変数blinkPatternIndex var blinkPatternIndex = 'red'; var thingName = 'bx1-08'; // Beam MQTTエントリポイント経由でAWS IoTに接続 var thingShadows = iotsdk.thingShadow({ host: 'beam.soracom.io', protocol: 'mqtt', port: 1883, clientId: thingName }); // シャドウ接続時の処理 thingShadows.on('connect', function() { console.log('AWS IoT Connected.'); thingShadows.register(thingName); // 直近の点滅パターンをシャドウに報告 thingShadows.update(thingName, { state: { reported: { blinkPattern: blinkPatternIndex } } }); }); // シャドウの差分検出時の処理 thingShadows.on('delta', function(thingName, stateObject) { console.log(JSON.stringify(stateObject)); // AWS IoTから指示されている点滅パターンを読み取り、ローカル変数に反映 blinkPatternIndex = stateObject.state.blinkPattern; // 点滅パターンをシャドウに報告 thingShadows.update(thingName, { state: { reported: stateObject.state } }); }); /* ローカル変数blinkPatternIndexからLEDの点滅パターンを変更するイベントを別途記述 */
8-14行目のAWS IoTへの接続オプションが今回のポイントです。host
パラメータをBeamエントリポイントに向けるのと、protocol
パラメータ、port
パラメータをBeamに合わせます。16行目以降は参考としてデバイスシャドウのイベント処理を実装したコードです。流れが少しわかりにくいですが、LEDの点灯パターンを変数blinkPatternIndex
で持ち、デバイスシャドウ側で値を変更、それを別のイベントで読み取ってLED点灯を実行する感じです。その辺りのコードは別エントリーでご紹介する予定です(作成中)。
$ cd aws-iot-device-sdk-js $ npm install : $ cd .. $ node sample.js AWS IoT Connected. {"timestamp":1452827422,"state":{"blinkPattern":"green"},"metadata":{"blinkPattern":{"timestamp":1452827422}}}
まとめ
IoTデバイスSDK for JavaScriptでSORACOM Beamを利用するための方法を紹介しました。デバイスSDKを利用するとデバイスシャドウが簡単に扱えるのでオススメです!
ちなみに、今回のサンプルは今日まで開催のネプコンジャパン2016信和産業様ブースでBLE経由でデバイスを制御するデモで利用しています。興味のある方はぜひご来場ください!