Armadillo-IoT+RN4020アドオンモジュール
と アルプス電気株式会社様のセンサネットワークモジュール(IoT Smart Module)
を使って、 Armadillo-IoTからBLEで、センサネットワークモジュール(IoT Smart Module)の 温度、湿度、気圧、照度等のデータを読み取ってみました。
参考)本内容に関連するBLE通信のセンサー(IoT Smart Module)を使った動作手順に下記のブログもあります。
・Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認
・Armadillo-IoT+BLE無線USBドングル:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認
当方で確認した手順を下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、RN4020、IoT Smart Moduleとの対話的な通信により、設定、エラー処理、フェイルセーフなどを行う必要があります。
備考)
下記説明内にて、IoT Smart ModuleのMACアドレスは、今回確認したIoT Smart ModuleのMACアドレスではなく、ダミーのMACアドレス(01:23:45:67:89:AB、または、FE:DC:BA:98:76:54)に置き換えて記述しています。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
以下、 RN4020アドオンモジュールは、「RN4020アドオン」 センサネットワークモジュール(IoT Smart Module)を「IoTスマートモジュール」 と呼称します。
手順の概要は下記のようになります。
1.機材、資料
2.IoTスマートモジュールからのデータ受信方法の検討
3.Armadillo-IoTからRN4020アドオンの設定と運用開始
4.Armadillo-IoTからIoTスマートモジュールにBLEで接続して、センサーデータを取得
5.IoTスマートモジュールのコマンドレスポンスについて気になったこと
6.IoTスマートモジュールのセンサーデータの確認
1.機材、資料
機材は下記のもの使用しました。
・Armadillo-IoT+RN4020アドオンモジュール
・IoTスマートモジュール
今回の動作確認において、下記の資料を参考にしました。
・RN4020モジュールユーザガイド
・IoT Smart Moduleコマンドガイド
備考)
今回は、Armadillo-IoTのアドオンインタフェースのコネクタ"CON1"にRN4020アドオンモジュールを接続しました。
下記説明内のデバイスファイル"/dev/ttymxc3"の箇所は、アドオンモジュールを接続するコネクタに応じて、
CON1使用時:/dev/ttymxc3
CON2使用時:/dev/ttymxc0
と読み替える必要があります。
2.IoTスマートモジュールからのデータ受信方法の検討
IoTスマートモジュールは、センサーデータの送信方法に
・Notificationで通知
・Beaconのアドバタイジングパケットで通知
が選択できます。
・Notificationで通知
ここでは、この方法でセンサーデータを取得しました。
ただ、RN4020アドオンの[仕様]に記載されているとおり、
同時接続数: 1
であるので、RN4020アドオンを使って、複数のIoTスマートモジュールからデータを取得する場合は、接続を切り替える運用になります。
参考)複数のIoTスマートモジュールからデータを取得する方法として、
・RN4020アドオンモジュールで、接続(同時接続数: 1)を切り替えながら取得する方法は、
・Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の
温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認
Appendix.複数のIoTスマートモジュールについて、接続を切り替えながら、センサーデータを取得をご参考ください。
・同時に複数を接続して取得する方法は、
・Armadillo-IoT+BLE無線USBドングル:BLE通信のセンサー(IoT Smart Module)の
温度、湿度、気圧、照度等を取得して、Herokuに送信してWebブラウザで確認
をご参考ください。
・Beaconのアドバタイジングパケットで通知
IoTスマートモジュールのアドバタイジングパケットを確認したところ、RN4020アドオンでは、
読み取れないタイプのようでしたので、この方法は断念しました。
詳細は、末尾の
参考)IoTスマートモジュールのBeaconモードで、RN4020アドオンで受信できるかの確認
をご参考ください。
3.Armadillo-IoTからRN4020アドオンの設定と運用開始
IoTスマートモジュールからのデータを受信するにあたり、RN4020アドオンを
RN4020モジュールユーザガイド
3.2.1 1 つ目のデバイス ( モジュールA) の設定
を参考にセントラルロールに設定します。
SF,1 // factory reset SS,C0000000 // Support Device Info and Battery as server SR,92000000 // Set device as central, support MLDP and enable UART flow control R,1 // reboot to make changes effective
Armadillo-IoTとRN4020アドオンは、シリアルで通信します。
Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル
6.11. Armadillo-IoT RN4020アドオンモジュール BT00を参考に、
Armadillo-IoTでtipコマンドを実行して、上記のRN4020のコマンドを設定します。
注意)下記"==="で始まっている行は表示されません。
(PCのシリアル通信ソフトで、ローカルエコーを有効すると見えますが、その場合はレスポンスの文字で上書きされることに注意ください。)
[root@armadillo-iotg (ttymxc1) ~]# tip -l /dev/ttymxc3 -s 115200 Connected. === "SF,1"を入力 AOK === "SS,C0000000"を入力 AOK === "SR,92000000"を入力 AOK === "R,1"を入力 Reboot CMD === "~."を入力。(tipが終了します。)
4.Armadillo-IoTからIoTスマートモジュールにBLEで接続して、センサーデータを取得
RN4020モジュールユーザガイド
Chapter2. RN4020 OEN モジュールインタフェース
「E」コマンド:接続
「CHW」コマンド:ハンドルを指定して、文字を書く
「K」コマンド:切断
IoT Smart Moduleコマンドガイド
1.2 Bluetooth Smartサービス
Appendix1 Service Database
0x0013:センサーデータの通知のNotification設定用のハンドル
0x0016:コマンド応答、接続パラメータ更新通知のNotification設定用のハンドル
0x0018:コマンド制御用のハンドル
および
2.2 コマンドによる設定例
2.2.4 Case3:モーション(動き)100ms/環境1分間隔(Hybridモード)
を参考に、この手順で使用するコマンドを整理すると下記のようになります。
// IoTスマートモジュールに接続して、Notificationを設定 E,0,0123456789AB // IoTスマートモジュールのMACアドレス:0123456789ABに接続 CHW,0013,0100 // センサーデータ通知用のNotificationを有効。 CHW,0016,0100 // コマンド応答用のNotificationを有効。 // IoTスマートモジュールのセンサー設定と測定開始 CHW,0018,2F0303 // 設定の初期化 CHW,0018,01037F // 全センサーを選択 CHW,0018,040304 // モーション/環境計測(Hybridモード)を選択 CHW,0018,06046400 // モーション(動き等)の計測間隔(100ms) CHW,0018,05040A00 // 環境(温度、湿度等)の計測間隔(10秒) CHW,0018,200301 // 計測開始 // IoTスマートモジュールと接続停止 K // 接続停止
実際に、Armadillo-IoT+RN4020アドオンからIoTスマートモジュールと通信した手順を下記に示します。
IoTスマートモジュールの電源をONにしておきます。 (下記手順において、正しいコマンドを入力しているにも関わらず、"ERR"、"N"など期待のレスポンスに ならなくなった場合は、IoTスマートモジュールの電源をOFF->ONにして、手順の最初からやりなおします。)
Armadillo-IoTでtipコマンドを実行して、上記のコマンドを実行します。
注意)下記"==="で始まっている行は表示されません。
(PCのシリアル通信ソフトで、ローカルエコーを有効すると見えますが、その場合はレスポンスの文字で上書きされることに注意ください。)
[root@armadillo-iotg (ttymxc1) ~]# tip -l /dev/ttymxc3 -s 115200 Connected. === "E,0,0123456789AB"を入力 AOK ConnParam: 00A0,0004,0258 Connected === "CHW,0013,0100"を入力 AOK === "CHW,0016,0100"を入力 AOK === "CHW,0018,2F0303"を入力 AOK Notify,0012,E01400000000C9370B0001000000000000000000. === "CHW,0018,01037F"を入力 AOK Notify,0012,E01400000000C7390B0001000000000000000000. === "CHW,0018,040304"を入力 AOK Notify,0012,E01400000000C7400B0001000000000000000000. Notify,0015,810301. Notify,0015,810300. ConnParam: 0028,0004,0258 === "CHW,0018,06046400"を入力 AOK Notify,0012,E01400000000CA440B0001000000000000000000. Notify,0015,810301. Notify,0015,810300. ConnParam: 0028,0004,0258 === "CHW,0018,05040A00"を入力 AOK Notify,0012,E01400000000CA440B0001000000000000000000. === "CHW,0018,200301"を入力 AOK Notify,0012,E01400000000C2450B0001000000000000000000. Notify,0012,F21437FF9B001B005A00060062EF640021110000. Notify,0012,F2143BFF9E0018006000120032EFC80021110001. . . . Notify,0012,F21469FFE8016C016F0000007DEF00000C150001. Notify,0012,F314EEE19C0A940D0200100000000000010A0F01. Notify,0012,F21469FFE3016C0172000C0068EF00000D150002. . . . (と、センサーデータが出続ける。) === "K"を入力 Connection End === "~."を入力。(tipが終了します。)
5.IoTスマートモジュールのコマンドレスポンスについて気になったこと
上記手順4において、気になった点があります。
Notify,0015,810301. Notify,0015,810300.
は、接続パラメータ更新の通知で、
Notify,0015,810301. // 更新中
の後、数秒後、
Notify,0015,810300. // 更新完了
が出力されます。
そして、今回の手順には説明してませんが、接続パラメータが更新されない場合、
(当方が確認したのは、Case1の例に従って、計測モードを設定した場合)
Notify,0015,810301. // 更新中
自体のレスポンスがありません。
意味的には当然ですが、直前の設定に応じて、
Notify,0015,810301. Notify,0015,810300.
は、レスポンスがある/ない場合があることに注意が必要かと思いました。
(直前の設定を確認した上で、レスポンスを判断するか、
IoTセンサーモジュールの不揮発メモリに保存(今回は未実施)しておいて、更新しないようにするか)など運用方法での対応が必要かと思います。)
6.IoTスマートモジュールのセンサーデータの確認
手順4の設定の場合、
・環境系センサーデータ(気圧、温度、湿度、紫外線、照度)が、10秒毎
・モーション系センサーデータ(地磁気、加速度)が、100ms毎
で、IoTスマートモジュールから通知されています。
手順4で実施した際のログの
Notify,0012,F21469FFE8016C016F0000007DEF00000C150001. Notify,0012,F314EEE19C0A940D0200100000000000010A0F01.
が、センサーデータになります。
IoT Smart Moduleコマンドガイドより、
5.通知データ構造
5.1 データパケット1
5.2 データパケット2
と照らし合わせると、
Notify,0012,F21469FFE8016C016F0000007DEF00000C150001.
F2:イベントコード 14:長さ 69FF:地磁気X(LSB、MSBの順) E801:地磁気Y(LSB、MSBの順) 6C01:地磁気Z(LSB、MSBの順) 6F00:加速度X(LSB、MSBの順) 0000:加速度Y(LSB、MSBの順) 7DEF:加速度Z(LSB、MSBの順) 0000:タイムスタンプ(ms)(LSB、MSBの順) 0C:タイムスタンプ(s) 15:タイムスタンプ(m) 00:タイムスタンプ(h) 01:インデックス
Notify,0012,F314EEE19C0A940D0200100000000000010A0F01.
F3:イベントコード 14:長さ EEE1:気圧(LSB、MSBの順) 9C0A:湿度(LSB、MSBの順) 940D:温度(LSB、MSBの順) 0200:紫外線量(LSB、MSBの順) 1000:照度(LSB、MSBの順) 00000000:予約 01:日付(日) 0A:日付(月) 0F:日付(年) 01:インデックス
となります。
最終的には、上記の値を
IoT Smart Moduleコマンドガイドより、
5.通知データ構造
5.1 データパケット1
5.2 データパケット2
の計算式に入れて計算する必要がありますが、ここでは割愛します。
本編はここまでです。以降は、参考情報です。
#######################################################################
参考)IoTスマートモジュールのBeaconモードで、RN4020アドオンで受信できるかの確認
下記の手法で確認しました。
1.Armadillo-IoTで最新のbluezを使ってみる
を参考に、BLE無線USBドングルで通信できるようにします。
補足)IoTスマートモジュールのBeaconモードに設定すること自体は、RN4020アドオンでも可能ですが、アドバタイジングパケットの確認のために、BLE無線USBドングル+bluezで通信できるようにします。
2.IoTスマートモジュールのBeaconモードに設定します。
2.2.4 Case4:環境 1秒間隔 ※Beacon動作で行う場合
を参考に、bluezのgatttoolを使って、IoTスマートモジュールをBeaconモードに設定します。 (上記資料では、計測間隔を1秒に設定してますが、下記設定では計測間隔を10秒にしています。)
[root@armadillo-iotg (ttymxc1) ~]# gatttool -i hci0 -b 01:23:45:67:89:AB -I [01:23:45:67:89:AB][LE]> connect Attempting to connect to 01:23:45:67:89:AB Connection successful [01:23:45:67:89:AB][LE]> connect [01:23:45:67:89:AB][LE]> char-write-req 0x0016 0100 Characteristic value was written successfully Notification handle = 0x0015 value: 81 03 01 Notification handle = 0x0015 value: 81 03 00 Notification handle = 0x0015 value: 81 03 00 [01:23:45:67:89:AB][LE]> char-write-req 0x0018 2F0303 Characteristic value was written successfully [01:23:45:67:89:AB][LE]> char-write-req 0x0018 16070100000000 Characteristic value was written successfully [01:23:45:67:89:AB][LE]> char-write-req 0x0018 1206401F0000 Characteristic value was written successfully [01:23:45:67:89:AB][LE]> disconnect (gatttool:1845): GLib-WARNING **: Invalid file descriptor. [01:23:45:67:89:AB][LE]> quit
3.まずは、BLE無線USBドングル+bluezで、IoTスマートモジュールのアドバタイジングパケットを確認します。
・パケットの内容
[root@armadillo-iotg (ttymxc1) ~]# killall hcidump [root@armadillo-iotg (ttymxc1) ~]# hcidump & [root@armadillo-iotg (ttymxc1) ~]# hcitool lescan 01:23:45:67:89:AB SNM00 > HCI Event: LE Meta Event (0x3e) plen 43 LE Advertising Report ADV_IND - Connectable undirected advertising (0) bdaddr 01:23:45:67:89:AB (Public) Flags: 0x06 Unknown type 0xff with 19 bytes data Shortened local name: 'SNM00' RSSI: -53 01:23:45:67:89:AB (unknown) > HCI Event: LE Meta Event (0x3e) plen 43 LE Advertising Report SCAN_RSP - Scan Response (4) bdaddr 01:23:45:67:89:AB (Public) RSSI: -53
・パケットの生データ
[root@armadillo-iotg (ttymxc1) ~]# killall hcidump [root@armadillo-iotg (ttymxc1) ~]# hcidump --raw & [root@armadillo-iotg (ttymxc1) ~]# hcitool lescan 01:23:45:67:89:AB SNM00 > 04 3E 2B 02 01 00 00 AB 89 67 45 23 01 1F 02 01 06 14 FF 72 02 00 8A 00 00 00 74 EF 95 E5 24 0A 50 0D 02 00 0F 00 06 08 53 4E 4D 30 30 C6 01:23:45:67:89:AB (unknown) > 04 3E 2B 02 01 04 00 AB 89 67 45 23 01 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C6
IoT Smart Moduleコマンドガイド 7.Beaconフォーマット を参考に見てみると、 AD Struster1が、 14 FF 72 02 ..... となっていることから、Beaconモードでは動作しているようです。
4.RN4020アドオンでアドバタイジングパケットを見てみます。 Armadillo-IoT: BLEアドオンモジュールを利用してみたを参考に、 アドバタイジング・パケットを受信してみる を参考に、
[root@armadillo-iotg (ttymxc1) ~]# tip -l /dev/ttymxc3 -s 115200 Connected. === "SF,1"を入力 AOK === "SS,C0000000"を入力 AOK === "SR,92000000"を入力 AOK === "R,1"を入力 Reboot CMD === "J,1"を入力 AOK === "F"を入力 AOK
で、アドバタイジング・パケットを受信してみると、
0123456789AB,0,-3C
のように、データが見れませんでした。
5.RN4020アドオンで受信できないことの考察
BLEアドオンで一部BLE端末からのパケットが受信できない より、 上記、BLE無線USBドングル+bluezで確認した時のパケットの情報
01:23:45:67:89:AB SNM00 > HCI Event: LE Meta Event (0x3e) plen 43 LE Advertising Report ADV_IND - Connectable undirected advertising (0)
から、ADV_INDがConnectableになっていることが要因と考えられます。
RN4020アドオンで受信するためには、Non connectableに設定する必要があると思われますが、 IoTスマートモジュールの説明書を一見したかぎりでは、ADV_INDの設定方法はありませんでした。