SORACOM Beamの設定
AWS IoTへ接続するには、クライアント1台ずつにX509証明書を配置します。しかし、IoTデバイスによっては、クラウドとの通信にかかる処理コストが暗号化などで重荷になることもあるでしょう。
SORACOM Beamは、SORACOM Airによる3G/LTE通信を中継することで、クラウドとの認証や暗号化処理を肩代わり(オフロードともいいます)し、IoTデバイスとクラウドとの通信効率を高め、認証情報の運用を楽にすることができます。
SORACOM Beamの設定は、SORACOM Air SIMのグループ単位で行います。SORACOMユーザーコンソールのグループ設定画面を開き、[+ 追加]をクリックします。
任意のグループ名(今回はgroup1)を入力し、[グループ作成]ボタンをクリックしてグループを作成します。
グループの設定画面が表示されるので、[SORACOM Beam設定]のアコーディオンメニューを開き、[+] -[MQTTエントリポイント]をクリックします。
任意の設定名(今回は「AWS IoT」)を入力します。
転送先の[ホスト名]に、先ほど控えておいたAWS IoTのエンドポイントを入力して、[証明書]をオンにし、ダウンロードしたX509証明書ファイルをエディタで開いて、ファイルの内容をコピー&ペーストします。なお、[秘密鍵(key)]にはXXXXXXXXXX(ランダム文字列)-private.pem.key
ファイル、[証明書(cert)]にはXXXXXXXXXX(ランダム文字列)-certificate.pem.crt
、CA証明局にはこのWebページからダウンロードしたルートCAファイルが対応します。コピー&ペーストしたら、[保存]ボタンで確定します。
MQTTエントリポイントが追加されたことが確認できます。
あとは、SIM管理の画面からSIMの所属グループを「group1」に設定すれば、SORACOMの設定は完了です。
コーディング
前編で作成したNode.jsプログラムは光センサーのデータを端末に出力するだけでしたので、ここではSORACOM Beamを経由するAWS IoTへのデータ送信処理を追加します。
var GrovePi = require('node-grovepi').GrovePi var Board = GrovePi.board var LightAnalogSensor = GrovePi.sensors.LightAnalog // SORACOM BeamのMQTTエントリポイントに接続 var mqtt = require('mqtt') client = mqtt.connect('mqtt://beam.soracom.io:1883'); var board = new Board({ debug: true, // GrovePiボードの初期化イベント時に実行 onInit: function(res) { if (res) { console.log('GrovePi Version :: ' + board.version()) // A0に設置した光センサーを扱うインスタンス生成 var lightSensor = new LightAnalogSensor(0) // 1秒おきにセンサーデータを取得し整形、コンソールに表示 setInterval(function() { var val = lightSensor.read() var ratio = (1023 - val) * 10 / val console.log("value: " + ratio) // 送信するデータをJSON形式に整形 var json = '{"id":"grove","date":"'+ new Date().toISOString() + '", "payload":' + ratio + '}' // topic/groveトピックにデータ送信を実行 client.publish('topic/grove', json); }, 1000); } }, // エラーイベント時に実行 onError: function(err) { console.log('Something wrong just happened') console.log(err) } }) board.init()
前編で記述したコードに対し、5〜7行目と23〜26行目を追加しました。AWS IoTのエンドポイントと証明書の設定はSORACOM Beamに含まれるため、プログラム内ではSORACOM Beamの接続先のみ指定しています。
動作確認
それでは、データ送信処理を追加したプログラムを実行してみましょう。
$ npm install mqtt $ node grove.js info GrovePi.board GrovePi is initing GrovePi Version :: 1.2.2 value: 3167.0186335403723 value: 3167.0186335403723 value: 3186.875 ^C $
DynamoDBの管理画面を見てみると、テーブルの[項目]タブなどでデータが保存されている様子がわかります。
送信間隔は27行目の1000ミリ秒(=1秒)と短いので、断続的に実行する場合は1分間隔(1000*60
)などに調節しましょう。
デバッグ方法
うまくデータが格納されないときは、AWS IoTのデバッグログを取得するのがよいでしょう。次の記事を参考にしてください。
AWS IoTのログをCloudWatch Logsで取得する #reinvent | Developers.IO
次のステップ
今回はRaspberry PiとGrove PiでGrove光センサーのデータをAWSクラウドに送信しました。Groveにはたくさんのセンサーがラインナップされていますので、他のセンサーもいろいろ試してみてください。AWSのサービスもDynamoDBだけでなく、ストレージサービスのS3などAWS IoTが対応するサービスがいくつかあります。また、AWS IoTにはデバイスシャドウというデバイスを制御する機能がありますので、そちらの機能を組み込むのもよいでしょう。
まとめ
IoTアプリの入門編として、センサーからクラウドまでのチュートリアルを前後編でお伝えしてきました。最近ではデバイス、クラウドともに扱いやすい製品やサービスが揃ってきており、以前に比べるとIoTアプリを手軽に開発できるようになっています。それらをつなぐSORACOMには、SIMだけでなくSORACOM Beamといった魅力的なサービスがあります。新しいアイデアを形にするツールとして、SORACOMを活用していきましょう!
また、SORACOMではユーザー間の情報共有やユーザーからのフィードバックを重視しているようです。スタックオーバーフローのsoracomタグ(下記)で情報交換しましょう!