ブログ

Armadillo-IoT+RN4020アドオンモジュール:BLE通信のセンサー(IoT Smart Module)の温度、湿度、気圧、照度等を取得

at_kazutaka.bito
2016年2月21日 11時48分

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モードに設定します。

IoT Smart Moduleコマンドガイド

 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の設定方法はありませんでした。