IoTハンズオン Powered by OpenBlocks IoT | SORACOM | AWS¶
Auhtor: Kohei MATSUSHITA
概要¶
OpenBlocks IoT BX1 (以下 BX1) を使用し、富士通コンポーネント社製 温度・加速度センサーデバイス “FWM8BLZ02” のデータを “SORACOM Air” の回線で “AWS IoT” に送信し、Amazon Elasticsearch Service(以下 Amazon ES)上のKibanaでグラフ化するところまでを解説します
全体構成¶
OpenBlocks IoT BX1 (以下 BX1) を使用し、富士通コンポーネント社製 温度・加速度センサーデバイス “FWM8BLZ02” のデータを “SORACOM Air” の回線で “AWS IoT” に送信し、”Amazon Elasticsearch Service” (以下 Amazon ES)上のKibanaでグラフ化するところまでを解説します
全体構成図と流れは以下のようになります

※ 上図SVG
- BX1のWi-Fi AP設定とSORACOM Air(3Gネットワーク)設定
- センサーとBX1の接続
- Amazon Elasticsearch Serviceのインスタンス作成と設定
- AWS IoTの設定
- BX1とAWS IoTの接続
- 片付け&まとめ
- 自習室: SORACOM BeamでAWS IoTの認証処理をオフロード
- 自習室: AWS IoTのThing Shadowでパトライトを制御する
※テキストのPDFは こちら(5.5MB P74)
ハンズオンの前に¶
対象者(前提条件・スキル等)¶
- AWS Management Consoleの基本的な操作がわかる
- シリアルコンソールとターミナル等による機器操作スキル (FTDIシリアルドライバのインストール等含む)
- AWS IoTの概要を理解している(AWS IoT ハンズオン ~基本編~」を参考にしますと、より実践的な内容を理解することが出来ます。)
AWSのアカウントをお持ちでない方は¶
Amazon Web Servicesをご利用いただくために、事前のアカウント取得をお願いいたします
ソラコムのアカウント取得・SORACOM Airのアクティベートが済んでいない方は¶
SORACOM Airを使用するため、事前にSORACOMアカウントの取得並びにSIMのアクティベートを完了しておいていただく必要があります
アクティベートにはクレジットカードの番号入力が必要となります (アカウント登録には必要ありません)
部材等の確認¶
準備するものをご確認ください (不足している場合はチューターにお声がけください)
- 支給されるもの
- 持ち帰りOK
- SORACOM Air <miniSIMサイズ> x 1枚
- 貸し出し物 (返却いただきます)
- OpenBlocks IoT BX1 x 1ケ
- BX1用 電源兼シリアルコンソール USBケーブル x 1本
- センサーデバイス FWM8BLZ02 (電池入り) x 1ケ
- 持ち帰りOK
- 用意いただくもの <必須>
- ノートPC
- Wi-Fiで2.4GHz/5GHz双方への接続可 (5GHzのみは不可)
- USBポート使用可 (AタイプでUSB3.0以上(900mA以上の給電)の1ポート以上)
- curlやwgetなどHTTPコールが可能なツール
- Chrome等のモダンブラウザ(Internet Explorerは不可)
- 参加者個人のAWSアカウント
- 有効なクレジットカード (SORACOM Airのアクティベーションに使用)
- ノートPC
- あると便利なもの
- スマートフォン (本ドキュメントを参照しながらの作業)
- FTDIシリアルドライバー
- シリアルコンソール制御用ターミナルソフトインストール済 (例: TeraTerm, GNU screen)
注釈
curl等のツール類はBX1の中に入っていますので、それを利用することも可能です (ただしBX1から利用する場合は3G回線費用が別途かかる可能性が有ります。その他、EC2インスタンスを用意して、そちらで実施することも可能です)
注意事項¶
- 章毎に達成状況を確認しながら進めていきますが、時間の都合上未達者がいても次に進む場合がありますのでご了承ください
- AWSやSORACOM等、ハンズオンで発生する費用については参加者の自己負担となります
- 不明な点はお気軽にチューターへご相談ください
ソラコムの料金詳細は SORACOM Airのご利用料金 をご覧ください
BX1のWi-Fi AP設定とSORACOM Air(3Gネットワーク)設定¶
本章のゴール: pingをWebUI上から行い、3G回線がつながっていることを確認する
作業の位置づけ;

※ 上図SVG
BX1の取り扱い (電源ON/OFF・再起動、SIM挿入)¶
BX1は給電開始と共に電源ONとなります。USBケーブルを接続すると起動を開始します
起動完了(使用できるようになるまで)に4分ほどかかります
注釈
- INITボタンや電源ボタンはOSのシャットダウンと再起動に利用されますので、必要時以外は押さないでください
- SIMは電源ON前に挿すようにしてください。起動後に挿しても認識しません
部位の名前やSIM挿入方法については、下記を参照してください
警告
必ずお読みください
- OpenBlocks IoTがサポートしているのは標準SIMサイズ(miniSIMサイズ)のみとなっています
- microSIMやnanoSIMといった 別サイズのSIMを利用する場合は必ず講師の指示を仰ぐようにしてください

ステータスインジケータ (LEDの表示色)¶
BX1は STATUS のLEDにて状態を把握することができます
本ハンズオンにおいては、起動後は 白色、水色、青色 が望ましく、それ以外の色の場合は不具合がある可能性がありますので、チューターにご相談ください
具体的なLED色と状態については、下記を参照してください

Web管理画面(WebUI)へのログイン¶
警告
- BX1に接続したPCやスマートフォンは、BX1のWi-Fiに接続している限り、後ほど設定するSORACOM Airの設定が終わるまではインターネットに接続することが出来ません
- また、SORACOM Airの設定が完了すると、インターネットへのアクセスは “PC =[Wi-Fi]=> BX1 =[SORACOM Air]=> インターネット” という経路になり、 通信料が発生する可能性があります ので、Dropbox等の共有ソフトの動作をOFFにすることを 強く推奨いたします
使用許諾の確認と管理ユーザアカウントの設定¶
使用許諾の “同意する” ボタンを押すと、WebUI管理用アカウントの作成を求められます
下記にて設定願います (本来は複雑な組み合わせが好ましいのですが、ハンズオン時のトラブルシュート対策です)
ID | iot (アイ オー ティー) |
Password | iot (アイ オー ティー) |
成功すると、ネットワーク設定画面が表示されます

Wi-Fi AP設定とSORACOM Air(3Gネットワーク)設定¶
ネットワーク設定画面を開きます
(前項から正しく遷移していれば表示されているはずですが、そうでない場合は [ネットワーク] - [基本] を選択するようにしてください)
ネットワーク設定画面では各項目をそれぞれ下記のとおり設定してください
ホスト名 | <シリアル番号> (例 F2A00788) |
ドメイン | openblocks.local |
Wi-Fi / 使用チャンネル (設定項目の出し方は 下記注釈を参照のこと) | <シリアル番号 最後の値> (例:F2A00788なら “8”) (0の方は10 / A~Eの方は 11) |
Wi-Fi / SSID | iotfamily_<シリアル番号> (例: iotfamily_F2A00788) |
Wi-Fi / 無線認証 | WPA-PSK |
Wi-Fi / 無線暗号化 | AES |
Wi-Fi / パスフレーズ | openblocks |
モバイル回線 / APN | soracom.io |
モバイル回線 / ユーザ名 | sora |
モバイル回線 / パスワード | sora |
注釈
- Wi-Fiのチャンネル設定は 詳細を表示する をチェックすることで表示されます
- モバイル回線の設定は サービスネットワーク(モバイル回線) を 使用する にチェックすることで表示されます
警告
- 無線認証をWPA2-PSKに変更すると、OSによっては再接続ができなくなる事があります
再起動¶
APNの設定は再起動で反映されるため、BX1を再起動します
- WebUIから [メンテナンス] - [停止・再起動] を表示
- 再起動を実施します (最後に確認ダイアログがでるので見逃さないようにしてください)
注釈
再起動は5分程度かかります

pingで確認¶
再起動が無事終了すればBX1は3Gネットワークに接続された状態となっています
WebUI上からpingを発信して確認してみます
警告
- 再起動の後はにOpenBlocks IoTのWi-Fiではなく、会場などのWi-Fiに接続されることがあります。WebUIに接続できない場合は接続先を確認してください
- pingは SORACOM Air SIM のアクティベーションが完了していないと成功しません
- WebUIにログインした後 [ネットワーク] - [通信確認]
- 宛先ホスト:
metadata.soracom.io

ここまで到達できればゴールです
センサーとBX1の接続 へ進む
センサーとBX1の接続¶
本章のゴール: センサーデバイス FWM8BLZ02(以下、センサー)の温度データをBX1で受信し、WebUI上でグラフ化される
作業の位置づけ;

※ 上図SVG
センサーをBX1に登録する¶
センサーを検出して登録する¶
- WebUIから [サービス] - [Bluetooth関連] を表示
- Bluetooth LEデバイス検出 の [検出] をクリック
- 一覧の中から自分のデバイスを探し 使用設定 にチェックをして [保存]
警告
- Bluetooth デバイス検出 ではなく Bluetooth LEデバイス検出 を押すようにしてください

自分のデバイスの探し方¶
Device Name = FWM8BLZ02 が大量に表示される可能性があります
お配りしたセンサーにはアドレスのタグが書かれており、画面上に表示されている Device Address (= MAC Address) と一致したものが、ご自分のセンサーとなりますので確認してください

BX1のデータ収集設定¶
BX1のデータ収集機能を開始する¶
- WebUIから [サービス] - [基本] を表示
- データ収集 における データ収集 ならびに PD Handler BLE をそれぞれ 使用する にして [保存]
注釈
- “PD Handler” は “データ収集” を <使用する> にすると表示されます

注釈
- データ収集を開始すると、新たなデバイスの登録ができなくなります
- デバイス登録をする場合は、まず、データ収集を行わないように設定を変更してください
BX1内へのデータ収集機能を開始する¶
- WebUIから [サービス] - [収集設定] を表示
- 本体内(local) を 使用する

ページ後半に移動し dev_le_0000001 の設定を下記のようにします
送信対象 | 送信する |
取得時間間隔(ms) | 1000 |
送信先設定 | localのみにチェック |
以上を確認し [保存]

グラフの表示¶
localへのデータ収集が開始されると、WebUI内のグラフに表示が開始されます

ここまで到達できればゴールです
トラブルシュート¶
データ収集状況ログの確認¶
WebUIから [サービス] - [収集ログ] にて、動作確認が可能です
ログ選択はそれぞれ下記のとおりです
pd-handler-stdout.log | センサー <-> BX1 間の送受信状況 |
pd-emitter.log | BX1 <-> 送信先(localやAWS IoT等) 間の送受信状況 |
下記画面はセンサーからのデータ読み出しが成功している場合のログ画面です。JSONが表示されているのが見てわかります

pd-handler-stdout.log に timeout: ...
などと表示されている¶
センサーとのBLE接続確立に失敗している可能性があります
- しばらく待つ (再接続するため)
- データ収集プロセスを再起動する (チューターにご相談ください)
これらで対処可能です
Amazon Elasticsearch Serviceのインスタンス作成と設定¶
本章のゴール: Amazon Elasticsearch Service上のKibanaでテストデータのグラフが表示される
※以下、文中ではAmazon Elasticsearch Serviceを以下Amazon ESと略します
作業の位置づけ;

※ 上図SVG
Amazon ESのクラスタを作成¶
警告
- OpenBlocks IoTのWi-Fi APに接続をしている場合は、会場のWi-Fi等に切り替えてください。切り替えない場合、AWS管理画面へ接続できない・ロードが遅い等の問題が起こる他、SORACOM Airの通信料がかかる場合があります
Get started (もしくはダッシュボードの Create a new domain) からAmazon ESのインスタンス作成のウィザードを開始します
それぞれのステップでは、下記項目を変更するようにしてください (それ以外の項目はデフォルト値でOKです)
Elasticsearch domain name | awsiot-handson-es |
> [Next] を押して次のステップへ | |
Instance type | t2.micro.elasticsearch |
Storage type | EBS |
> [Next] を押して次のステップへ | |
Set the domain access policy to | Allow open access to the domain |
> [Next] を押すと確認画面がでるので、確認後 [Confirm and create] で作成します |
警告
今回は時間の関係上 “Allow open access to the domain” (=すべてのアクセスを許可) としています。本番運用時にはアクセスコントロールを行うようにしてください
注釈
Amazon ESが使えるようになるまで10分程度かかるため、次章の作業(AWS IoTの設定) を行うとよいでしょう
テストデータの投入と表示¶
Amazon ESが利用可能になったら、動作確認を行います
データの投入¶
注釈
- ここでは確認のために
curl
コマンドを使用します。準備願います (Windowsの方向け) date
コマンドが下記の通り使えない場合は2016-05-19T10:10:50+0900
というフォーマットの日付文字列に置き換えてください${YOUR_ES_ENDPOINT}
は、Amazon ESのダッシュボードで確認した Endpoint に置き換えてください
curl -X PUT ${YOUR_ES_ENDPOINT}/es-test/es0/1 -d "{\"deviceId\":\"es-test0\",\"field1\":1,\"@timestamp\":\"$(date +%Y-%m-%dT%H:%M:%S%z)\"}"
Windowsの方: 下記の通りダブルクオーテーションのエスケープを変更してください
curl -X PUT %YOUR_ES_ENDPOINT%/es-test/es0/1 -d "{""deviceId"":""es-test0"",""field1"":1,""@timestamp"":""2016-05-19T10:10:50+0900""}"
コマンドの投入結果は下記のようになります
{"_index":"es-test","_type":"es0","_id":"1","_version":1,"created":true}
AWS IoTの設定¶
本章のゴール: AWS IoTでMQTT(AWS IoT上のテストサイト)による受信ができることを確認する
作業の位置づけ;

※ 上図SVG
概要¶
AWS IoTの設定は若干ステップが多いため、まずステップの概要を確認します
IAMロールの作成¶
AWS IoTのルールを作成する前に、AWS IoTからAmazon Elasticsearch Serviceへデータ送信をするための権限ロールを作成します
ロールの作成¶
IAMコンソールのロール一覧から [新しいロールの作成] をクリックし、ウィザードを開始します
ウィザードの各項目は下記のようにしてください
ロール名 | awsiot_handson_put_to_es |
ロールタイプの選択 | AWS サービスロール => AWS IoT を選択 |
ポリシーのアタッチ | <なにも選択せず> |
インラインポリシーの設定¶
- IAMコンソールのロール一覧から、先ほど作成した awsiot_handson_put_to_es ロールを選択
- [インラインポリシー] - [ここをクリックしてください] をクリック
- 次の画面では [カスタムポリシー] - [選択] をクリック
- 下記の通りポリシー名とポリシードキュメントを設定し [ポリシーの検証] をした後 [ポリシーの適用] をクリック
ポリシー名 | awsiot_handson_put_to_es_adhoc_policy |
ポリシードキュメント
※ AWS_ACCOUNT_ID は各自のAWS AccountIDに読み替えるようにしてください
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "es:ESHttpPut",
"Resource": [
"arn:aws:es:ap-northeast-1:AWS_ACCOUNT_ID:domain:awsiot-handson-es/*"
]
}
}
以上でロールの作成は完了です _
AWS IoTポリシの作成¶
“モノ” が AWS IoTにアクセスする際の制限を設定することができます
今回はフルコントロールとします
注釈
IAMのポリシーとは別のものになります
作業¶
- AWS IoTのコンソールから “Create a resource” をクリックし “Create a policy” をクリック
- 下記を入力したら “Add statement” をクリックし “Create” をクリック
Name | awsiot_handson_policy |
Action | iot:* |
Resource | テキストボックスに * を入力、Allowにチェック |
これでポリシが作成されました
※下図は “Add statement” 直前の画面です

“モノ” の作成¶
AWS IoT上で “モノ” として認識できるようにします
実物の “モノ” の状態を管理するための機能であるThing shadowを使用する際に、特に必要となります
作業¶
- AWS IoTのコンソールから “Create a thing” をクリック
- 下記を入力したら “Create” をクリック
Name | awsiot_handson_thing0 |
これで “モノ” が作成されました
※下図は “Create” 直前の画面です

証明書の作成, ポリシの割り当て, “モノ”の割り当て¶
“モノ” がAWS IoTにアクセスする際に使用する証明書(キーペア)を作成します
“モノ” に公開鍵を持たせてAWS IoTにアクセスすることで認証としています
証明書は有効(活動中)/無効(非活動)というステータスを持っており、証明書が有効だとしても非活動の場合はAWS IoTへのアクセスができないといった制御が可能です
また、この証明書にポリシと “モノ” を割り当てることで、その証明書を持っている “モノ” の制限をすることができるという仕組みです
すでに存在するキーペアから作成することも可能ですが、今回はAWS IoTに発行してもらいます
注釈
AWS IoT接続トラブルの原因の80%が、証明書に起因するものですので丁寧に実施してください
作業¶
- 証明書の作成
- AWS IoTのコンソールから “Create a certiicate” をクリック
- “1-CLick certificate create” をクリック <”INACTIVE” と書かれた証明書が作成されます>
- 画面上の “Download private key” と “Download certificate” をクリックし、それぞれ .pem.key ファイルと .pem.crt ファイルを取得する
警告
- private keyファイルはこのタイミングでのみダウンロード可能です。あとでダウンロードできないので、必ず取得してください
- ポリシを証明書に割り当て
- 作成された証明書のチェックボックスをクリック (ついていれば次へ)
- [Actions]の中から[Attach a policy]をクリック
- Policy name にポリシ名
awsiot_handson_policy
を入力し “Attach” をクリック
- “モノ” を証明書に割り当て
- 証明書のチェックボックスをクリック (ついていれば次へ)
- [Actions]の中から[Attach a thing]をクリック
- Thing name にポリシ名
awsiot_handson_thing0
を入力し “Attach” をクリック
- 証明書のアクティベート
- 証明書のチェックボックスをクリック (ついていれば次へ)
- [Actions]の中から[Activate]をクリック <証明書が “ACTIVE” に変化します>
※下図は 証明書にチェックを入れた後 “Actions” をクリックした直後の画面です

ルールの作成¶
AWS IoTでは、MQTTやRESTで送信されてきたデータに対して、どのようにアクションするか設定でき、これをルールと呼びます
作業¶
- AWS IoTのコンソールから “Create a rule” をクリック
- 下記を入力したら “Add action” をクリックし “Create” をクリック
Name | awsiot_handson_rule0 |
Description | awsiot_handson_rule0 |
SQL version | 2016-03-23-beta |
Attribute | * |
Topic filter | awsiot_handson/sensor0 |
Condition | <なにも入力しません> |
Choosen an action | Amazon Elasticsearch Service |
Domain name | awsiot-handson-es |
ID | ${newuuid()} |
Index | awsiot_handson |
Type | fwm8blz02 |
Role | awsiot_handson_put_to_es |
これでルールが作成されました
※下図は “Add action” 直前の画面です

注釈
Amazon Elasticsearch Serviceのインスタンスが完了してない場合は Endpointが https://null となり、設定が完了できません。Amazon ESのインスタンス作成の完了を待ってからルール作成を行ってください
AWS IoT上のMQTTクライアントツールを使用した確認¶
AWS IoTにはMQTTクライアントツールがあり、それを使って簡単に動作確認をすることができます
作業¶
- AWS IoTコンソールの右上 “MQTT Client” をクリック
- “Generate client ID” をクリック <Client IDに任意の文字列が入ります>
- “Connect” をクリック
- “Publish to topic” をクリック
- 下記を入力して “Publish” をクリック
Publish topic | awsiot_handson/sensor0 |
Payload | {"state":{"reported":{"deviceId":"awsiot-test0","field1":3,"time":"2016-05-19T10:10:50+0900"}}} |

Kibana上に上記payloadのデータが入っていれば成功です
注釈
Amazon Elasticsearch Serviceのインスタンス作成と設定 では es-test というIndexにデータを入れましたが、この章で使用しているIndexは awsiot_handson です
Kibanaの Settings 画面から新規に awsiot_handson を基にIndexを作成するようにしてください

ここまで到達できればゴールです
BX1とAWS IoTの接続 へ進む
トラブルシュート¶
AWS IoTの証明書が削除できない¶
証明書を削除できる条件は 1.モノやポリシが割り当てられていない 2.Deactivate状態である この2つが満たされている必要があります
割り当て済みのポリシや “モノ”を解除する
- 証明書をクリック
- 右側に現れたウィンドウの [Detail] で モノやポリシを “dettach” します
Deactivate状態にする
- 証明書のチェックボックスをクリック (ついていれば次へ)
- [Actions]の中から[Deactivate]をクリック <証明書が “INACTIVE” に変化します>
Rule作成時に Elasticsearch Service のインスタンスが見つからない¶
リージョンを確認してください
AWS IoTとElasticsearch Serviceのリージョンは一致している必要があります
Kibanaにデータが表示されない¶
表示対象のIndexが es-test になっていませんか?
BX1とAWS IoTの接続¶
本章のゴール: センサーからのデータがAWS IoTを通じてAmazon ES上のKibana上で確認できる
作業の位置づけ;

※ 上図SVG
準備¶
AWS IoTから入手しておくもの¶
- 証明書(Certificate)ファイル <拡張子 .pem.crt>
- プライベートキー(PrivateKey)ファイル <拡張子 .pem.key>
- エンドポイント
エンドポイントの確認方法¶
最終的には “XXXXXXX.iot.REGION.amazonaws.com” というフォーマットの文字列を入手します
下記どちらかの方法で確認してください
- AWS CLIで
aws iot describe-endpoint
で確認 - AWS IoTコンソールの “Things” の REST API endpointから抜き出す

その他、入手しておくもの¶
警告
- 上記URLにはファイル名にスペースが含まれています。しかしBX1ではファイル名にスペース文字が使用できないため、処置をしておいてください (本ハンズオンではスペースを
_
に変更しています)
BX1設定¶
ファイルアップロード¶
AWS IoTの証明書ファイル・プライベートキーファイル・ルート証明書ファイルの3つをBX1にアップロードします
- WebUIから [システム] - [ファイル管理] を表示
- 本画面からファイルを3つ、それぞれアップロード
すべてアップロードされると、下記のような画面となります

収集設定 / AWS IoTに対する設定¶
- WebUIから [サービス] - [収集設定] を表示
- AWS IoT を 使用する (クリックで設定が展開します)
- 下記の通り設定します
インターバル | 3 |
送信先ホスト | <エンドポイントURL> |
root証明書 | /var/webui/upload_dir/VeriSign-Class_3-Public-Primary-Certification-Authority-G5.pem |
注釈
- 先のファイルアップロード画面でアップロードされたファイルは BX1内の
/var/webui/upload_dir/
にアップロードされます。それ以下のパスを指定することでファイルの読み込みが可能です

保存せず、引き続きページ下部へ移動します
収集設定 / センサーのデータ送信先にAWS IoTを加える¶
- dev_le_0000001 の 送信先設定 で AWSIOT にチェックを付けます (クリックで設定が展開します)
- 下記の通り設定します
トピック名 | awsiot_handson/sensor0 |
証明書(AWS IoT) | /var/webui/upload_dir/<アップロードした .pem.crtファイル> |
プライベートキー(AWS IoT) | /var/webui/upload_dir/<アップロードした .pem.keyファイル> |

保存後、即座にAWS IoTへの送信が始まります。Amazon ESのKibanaでデータ受信ができているか確認してください

データの変化を楽しむ¶
加速度をつかってこんなグラフを作ることできます
※Kibanaの使い方は本ハンズオンの範疇を超えてしまうため、興味のある方はチューターにお声がけください

センサーのデータ取得間隔が1秒毎となっているため、加速度の数値を変化させたい場合は若干振り続ける等するようにしてください
くれぐれも降ってる最中に投げ出す事のないように、ご注意願います!
トラブルシュート¶
以下を確認してみてください
- センサーからのデータを受信できているか (pd-handler-stdout.logを確認してください)
- 3G通信ができているか (pingを試してみてください)
- AWS IoTへ接続・送信できているか (CloudWatchを確認してください)
- AWS IoTのエンドポイントはあっているか
- トピック名はあっているか
- 証明書があっているか
- 証明書はACTIVEになっているか
- 有効なポリシがアタッチされているか
- ルールは正しくAmazon Elasticsearch ServiceへデータをPUTできるようになっているか
- Amazon Elasticsearch ServiceへのデータPUT (CloudWatchを確認してください)
- 有効なロールがセットされているか
BX1からAWS IoTへの送信状況の確認¶
WebUIから [サービス] - [収集ログ] にて、動作確認が可能です
ログ選択はそれぞれ下記のとおりです
pd-handler-stdout.log | センサー <-> BX1 間の送受信状況 |
pd-emitter.log | BX1 <-> 送信先(localやAWS IoT等) 間の送受信状況 |
片付け&まとめ¶
AWSリソース¶
本ハンズオンで作成したAWSリソース等は継続的に費用がかかるものがあるため、不要ならば削除するようにしてください
- AWS IoT
- ルール
- 証明書
- アタッチされている “モノ” とポリシをデタッチ
- 証明書のDeactivate
- “モノ”
- ポリシ
- IAMロール
- Amazon ESインスタンス (課金されるので注意)
自習室¶
自習室: SORACOM BeamでAWS IoTの認証処理をオフロード¶
自習室: AWS IoTのThing Shadowでパトライトを制御する¶
センサーデータフォーマット¶
富士通コンポーネント社製 温度・加速度センサーデバイス “FWM8BLZ02”¶
{
"deviceId": "e73a40839d8a", // BX1の設定画面で設定したデバイスID (BX1で付与)
"time": "2016-03-09T18:15:53.764+0900", // 計測日時 (BX1で付与)
"temperature": 27.22, // 温度 ℃
"accelX": 0.092, // X方向 加速度 G
"accelY": -0.952, // Y方向 加速度 G
"accelZ": -0.113 // Z方向 加速度 G
}
BX1の”AWSIOT”経由でデータ送信された場合、 {state: {reported: DATA}}
としたAWS IoTのDevice Shadowのフォーマットに変形されます
{
"state": {
"reported": {
"deviceId": "e73a40839d8a",
"time": "2016-03-09T18:15:53.764+0900",
"temperature": 27.22,
"accelX": 0.092,
"accelY": -0.952,
"accelZ": -0.113
}
}
}
Texas Instruments社製 多機能/開発用センサー SensorTag CC2541DK¶
{
"deviceId": "5c313ec027e1", // BX1の設定画面で設定したデバイスID (BX1で付与)
"humidity": 40.7, // 湿度 %
"temperature": 28.6, // 温度 ℃ (湿度センサー内)
"objectTemp": 23.8, // 物体温度 ℃
"ambientTemp": 28.4, // 周辺温度 ℃
"gyroX": -1.4, // ジャイロ(X軸) deg/s <角速度>
"gyroY": 4, // ジャイロ(Y軸) deg/s
"gyroZ": 0.2, // ジャイロ(Z軸) deg/s
"pressure": 1015.6, // 気圧 hPa
"accelX": 0.1, // 加速度(X軸) G
"accelY": 0.3, // 加速度(Y軸) G
"accelZ": 3.8, // 加速度(Z軸) G
"magX": -53.9, // 地磁気(X軸) μT <テスラ>
"magY": -5.2, // 地磁気(Y軸) μT
"magZ": 102.7, // 地磁気(Z軸) μT
"time": "2015-11-19T10:29:20.529+0900" // 計測日時(BX1で付与)
}
BX1の”AWSIOT”経由でデータ送信された場合、 {state: {reported: DATA}}
としたAWS IoTのDevice Shadowのフォーマットに変形されます
{
"state": {
"reported": {
"deviceId": "5c313ec027e1",
"humidity": 40.7,
"temperature": 28.6,
"objectTemp": 23.8,
"ambientTemp": 28.4,
"gyroX": -1.4,
"gyroY": 4,
"gyroZ": 0.2,
"pressure": 1015.6,
"accelX": 0.1,
"accelY": 0.3,
"accelZ": 3.8,
"magX": -53.9,
"magY": -5.2,
"magZ": 102.7,
"time": "2015-11-19T10:29:20.529+0900"
}
}
}
BX1へシリアルコンソールでログインする¶
BX1 は給電用USB ケーブルが、シリアルコンソールを兼任しています
FTDIのシリアルポートドライバがインストール済みのWindows / Mac OS Xや、Linuxならば追加ドライバ不要でアクセス可能です
ID | root |
Password | 0BSI0T (ゼロ ビー エス アイ ゼロ ティー) |
e.g.) screen コマンドによるアクセス
screen /dev/ttyUSB0 115200
自習室: SORACOM BeamでAWS IoTの認証処理をオフロード¶
本章のゴール: BX1の設定をAWS IoTからMQTTに切り替えてもAWS IoTならびにAmazon ESへのデータ送信がされる
作業の位置づけ;

SORACOM Beamとは?¶
IoT デバイスにかかる暗号化等の高負荷処理や接続先の設定といった面倒な処理を、クラウドにオフロードできるサービスです
Beamでサポートしている機能は下記のとおりです (2016年5月現在)
- プロトコル変換 (証明書添付含む)
- 接続先切り替え
詳細は SORACOM Beamのページ をご覧ください
自習室で行うこと¶
BX1とAWS IoTの接続 では、AWS IoTに接続するために必要な証明書(ファイル3つ)をBX1に格納していました
この証明書をBX1からSORACOMへ移動し、SORACOM Beamを使ってAWS IoTに接続します
前提条件¶
すでにハンズオンすべてを完了させており、センサーデータがAmazon Elasticsearch Serviceの Kibana上で確認できることが必要です
BX1の仕様上の注意点¶
SORACOM Beamへの切り替えに先立って、BX1の仕様上の注意を確認します
- AWS IoT向けとMQTTサーバ向けでデータのpayloadフォーマットが違います。詳細は センサーデータフォーマット をご覧ください
- MQTTサーバ向けの送信先トピックは <トピックプレフィックス>/<ユニークID(MQTT)> と、ユニークIDが自動的に付与されます
作業手順¶
BX1: AWS IoTへの送信を停止¶
AWS IoTへの送信を停止します
- WebUIから [サービス] - [収集設定] を表示
- AWS IoT を 使用しない に変更
- [保存] をクリック
保存するとAWS IoTへの送信を即時停止します (BX1内のグラフ描画は継続されます)
Kibana上にも送信されていないことを確認してください
注釈
デバイス情報送信設定 の 送信先設定 には AWS IoTの設定情報が残っていますが、使用されません
AWS: AWS IoTにルールを追加する¶
AWS IoTにルールを追加します
BX1固有の注意点にも記載したとおり、MQTTの送信先トピックが awsiot_handson/sensors/<ユニークID(MQTT)>
となったため、これを受けられるAWS IoTのルールを新設します
ルールの作成の仕方は ルールの作成 を参照してください
Name | awsiot_handson_rule1 |
Description | awsiot_handson_rule1 |
SQL version | 2016-03-23-beta |
Attribute | * |
Topic filter | awsiot_handson/sensors/# |
Condition | <なにも入力しません> |
Choosen an action | Amazon Elasticsearch Service |
Domain name | awsiot-handson-es |
ID | ${newuuid()} |
Index | awsiot_handson_w_beam |
Type | fwm8blz02 |
Role | awsiot_handson_put_to_es |
※ ルールの作成 と違う部分を特に強調してあります
SORACOM: 証明書ストアへX.509証明書の登録¶
ソラコムのコンソールから [セキュリティ] - [認証情報ストア] - [認証情報を登録] を順にクリック
各項目は下記のようにしてください
認証情報ID | AWSIoT_cert_0 |
概要 | AWSIoT cert 0 |
種別 | X.509 証明書 |
秘密鍵 (key) | <CertID>-private.pem.key の中身をペースト |
証明書 (cert) | <CertID>-certificate.pem.crt の中身をペースト |
CA証明局 | VeriSign-Class 3-Public-Primary-Certification-Authority-G5.pem の中身をペースト |

設定を確認したら [登録] をクリック
無事登録されると認証情報ストアに下図のように表示されます

注釈
認証情報ストアには複数の認証情報を格納することができるほか、内容の編集・削除も可能です
SORACOM: SIMグループの作成とBeamの設定¶
SIMグループの作成¶
ソラコムのコンソールから [グループ] - [追加] を順にクリック
各項目は下記のようにしてください
グループ名 | mqtt2awsiot |

設定を確認したら [グループ作成] をクリック
SORACOM Beamの設定¶
ソラコムのコンソールから [グループ] - [mqtt2awsiot] - [SORACOM Beam 設定] を順にクリック
[+] をクリックし、リストの中から [MQTT エントリポイント] をクリック
各項目は下記のようにしてください
設定名 | AWS IoT |
転送先 / プロトコル | MQTTS |
転送先 / ホスト名 | <AWS IoT エンドポイント> |
転送先 / ポート番号 | 8883 |
転送先 / ユーザ名 | <空> |
転送先 / パスワード | <空> |
転送先 / 証明書 | ON |
転送先 / 証明書タイプ | AWSIoT_cert_0 (AWSIoT cert 0) |

設定を確認したら [保存] をクリック
無事登録されると下図のように表示されます

SORACOM: SIMをグループに所属させる¶
ソラコムのコンソールから [SIM管理] をクリック
さきほど作成した mqtt2awsiot グループへ所属させたいSIMのチェックボックスをつけたあと、 [操作] - [所属グループ変更] をクリック

グループ変更画面で mqtt2awsiot を選択し [グループ変更] をクリック

無事変更されると下図のように表示されます

以上の操作で対象のSIMから beam.soracom.io へのMQTT通信は、AWS IoTへ X.509証明書によるMQTTS通信として転送されるようになりました
BX1: データをSORACOM Beam(MQTT)へ送信¶
これまでのハンズオンではBX1はAWS IoTへ直接MQTTS通信していたので、それを beam.soracom.io へMQTT通信するように切り替えます
収集設定 / AWS IoTのOFFとMQTTサーバへの設定¶
BX1のWebUIから [サービス] - [収集設定] を表示
下記の通りにします
- MQTTサーバ を [使用する] に変更し、下記の通り設定します
インターバル[sec] | 2 |
送信ホスト | beam.soracom.io |
送信先ポート | 1883 |
QoS | 1 |
クライアントID | bx1-mqtt-client0 |
トピックプレフィックス | awsiot_handson/sensors |
ユーザ名 | <空> |
パスワード | <空> |
プロトコル | TCP |

保存せず、引き続きページ下部へ移動します
収集設定 / センサデータの送信先設定¶
dev_le_0000001 の 送信先設定 で MQTT にチェックを付けます
※ユニークID(MQTT) の項目が増え、クライアントID(AWS IoT)と同じ値が入ります

以上を確認したら保存してください。保存と同時に(若干のラグがありますが)送信が開始されます
Kibana上での確認¶
新規に awsiot_handson_w_beam というIndexに格納するようにしているので、そちらを参照するように変更するのをお忘れなく
まとめ¶
SORACOM Beamを使用することで、証明書ファイルをデバイス(BX1)に格納せずともAWS IoTへアクセスできるようになりました
デバイスへの設定が少なくて済むというのは、大量のデバイスを展開する際にもコスト面で有利です
あとかたづけ¶
作成したリソースは削除しておきましょう
- SORACOM上
- SIMのグループを解除
- SIMグループを削除
- 認証ストアの削除
- AWS上
- Amazon Elasticsearchインスタンス
- AWS IoT モノ、証明書、ポリシー、ルール
- IAMロール
トラブルシュート¶
SORACOM Beamには転送されたデータが正しく転送されたか否かを確認する方法がありません (2016年5月現在)
そのため、うまく転送されていないと思われる場合は各種設定を見直すようにしてください
とくに見直すポイントは下記です
- SORACOM: 証明書ストアへ保存した証明書や秘密鍵
- AWS: AWS IoTのエンドポイント
転送がうまく作動していれば、あとはAWSのCloudWatchでログが確認できるので、処置可能です
自習室: AWS IoTのThing Shadowでパトライトを制御する¶
本章のゴール: Thing Shadowの適用場面、構成コンポーネントやデータフローの理解
本章は、最初にAWS IoTのThing Shadowのデモに触れてみることで全体像を確認し、その次に各コンポーネントの解説を行います
デモ¶
https://s3-ap-northeast-1.amazonaws.com/ma2shita/patlite_control_w_awsiot.html
※デモはセットアップが完了していないと機能しません。詳しくはハンズオンスタッフまで

デモ画面は左側に現在のパトライトの状態、右側にパトライトに対してのライトON/OFF制御を持っています
- まずは右側のON/OFF制御を行ってみましょう
- 気づいた事を話し合ってみましょう
コンポーネントとデータフロー¶
概要の詳細化を行い、コンポーネントとデータフローを記載したのが下図です

- 通信の部
- Patlite <NHS-3FB1> ←→ BX1 との通信は SNMP
- 認証/認可: SNMPの機構を使用
- BX1 ←→ AWS IOT との通信は MQTTS
- 認証: AWS IoTが払いだしたX.509証明書を使用
- 認可: X.509証明書に割り当てたAWS IoTのpolicyを使用
- AWS IoT ←→ Web Browser との通信は Websocket
- 認証: なし(CognitoのUnauth(=Anonymous)を使用)
- 認可: Cognitoを使用しWeb Browserに一時的なIAMロールを割り当て、AWS IoT(のdataアクセス)に対して権限を付与
- Patlite <NHS-3FB1> ←→ BX1 との通信は SNMP
- プログラムの部
- BX1に2つのプログラムを配置
- reporter.rb
- 定期的にPatliteのステータスを取得し、AWS IoTへ reported を送信する
- commander.rb
/update/delta
を監視し、データが着信したら内容に応じてPatliteへコマンドを送信する
- reporter.rb
- Web BrowserにJavascriptアプリケーションを実行させる
- patlite_control_w_awsiot.html (核となる部分を抽出したもの)
/update/documents
を監視し、データの着信したら内容に応じて表示の更新をする- Web Browserへの入力を基にAWS IoTへ desired を送信する
- patlite_control_w_awsiot.html (核となる部分を抽出したもの)
- BX1に2つのプログラムを配置
- データフローの部
- 緑の線は、reporter.rbを起点に
/update/documents
を通じてWeb Browserの内容が更新されるまで - オレンジの線は、Web Browserへの入力を起点に
/update/delta
を通じてPatliteにコマンドが送信されるまで
- 緑の線は、reporter.rbを起点に
システム設計のポイント¶
双方向システムのポイントは、データフローがループ構成になるように設計するべきです
- ただし、無限ループを防止するためにもブレーカーを必ず設置しましょう。本デモでは人間をブレーカー代わりにしています
- ループ外からの操作にも対応できるようにするべきです
双方向が不要ならば緑の線もしくはオレンジの線の上のコンポーネントのみで十分です。しかしながら、その場合にThing Shadowを使う理由が見当たりません
- AWS IoTを MQTTブローカー として見るか ステートマシン として位置づけるか、これがThing Shadowを使う1つめの見極めポイントになります
- Thing Shadowの最大の特徴はデバイス操作の要求に対し 本当に操作すべき対象の抽出 を ``/update/delta`` への差分抽出 で実現/実装済みということです。この差分抽出は 現状(=reported) と 要求(=desired) という2つが必要となります。このような機構が不要であれば Thing Shadow を使用する必要はありません (e.g. センサーデータのアップロードにのみAWS IoTを使う場合)
commander.rbによる実行結果はreporter.rbに回収させるようにするのが、デバイスの稼働状況を確認するためにも推奨されます
プログラム改造のポイント¶
Patliteを用意できない場合もありますので、その場合は reporter.rb や commander.rb を改造する必要が出てきます
改造ポイントはデバイス通信部になります
- reporter.rb では Flow: Fetch state from real-device の部分
- commander.rb では Flow: Execute command to real-device の部分
<NHS-3FB1>は内部にステートを持ち、SNMP でステートの読み出しができる「ステートフル・デバイス」であったため、reporter.rbは ポーリング・パターン※1 で実装しました
しかしRS-232CといったI/FなデバイスはデータがI/Fを通じて流れてくる「ストリーム・デバイス」であることが多いです。この場合は リスニング・パターン※2 を実装する必要があります
- ※1 定期的にデータを取得しに行く定期実行型
- ※2 TCPソケットのようなポート待受型
参考資料¶
- AWS IoTのMQTT over WebSocketをCognito(Unauth)で認証して使ってみた | Developers.IO
- Paho - Open Source messaging for M2M
- dwyl/learn-aws-iot: Learn how to use Amazon Web Services Internet of Things (IoT) service to build connected applications.
- Class: AWS.Credentials — AWS SDK for JavaScript
- Device Shadow MQTT Topics - AWS IoT
- テンプレートリテラルが実装された - JS.next
全体構成 へ進む
時間配分¶
- [10m] 冒頭説明
- [20m] BX1のWi-Fi AP設定とSORACOM Air(3Gネットワーク)設定
- [20m] センサーとBX1の接続
- [10m] Amazon ESのインスタンス作成と設定
- [20m] AWS IoTの設定
- [20m] BX1とAWS IoTの接続
- [10m] 片付け&まとめ
※冒頭説明から片付け&まとめまで約120分のコンテンツです
- [20m] 自習室: SORACOM BeamでAWS IoTの認証処理をオフロード
- [20m] 自習室: Thing Shadowでパトライトを制御