SORACOM Beam経由でAWS IoTデバイスSDK for JavaScriptを使う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。

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をグループに登録すれば完了です。

beam-devicesdk01

サンプルコード

では、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経由でデバイスを制御するデモで利用しています。興味のある方はぜひご来場ください!