ブログ

Armadillo-IoT(G3):WLAN+BT コンボモジュールでBLE通信の照度センサーのデータを読む

at_kazutaka.bito
2016年6月12日 10時51分

Armadillo-IoT(G3)先行評価セットに搭載されているWLAN+BTコンボモジュール(AEH-AR9462)で、 BLE通信の照度センサー(BLECAST_BL)から照度データを読んでみました。

このセンサーは、アドバタイジングパケットに照度データが付加されています。 ここでは、bluezのhcitoolとhcidumpコマンドを使って、アドバタイジングパケットから簡易的に照度データを抜き出してみました。

1.hcidumpのインストール

標準のイメージでは、hcidumpはインストールされていないので、インストールします。 (なお、hcitoolは標準イメージにインストール済みです。)

Armadillo-IoT(G3)をインターネットに接続できる環境で立ち上げて、下記のコマンドでインストールします。

root@armadillo-iotg:~# apt-get install bluez-hcidump

2.照度センサーからデータを受信

照度センサー(BLECAST_BL)に電池をいれておきます。 初期設定では、1秒ごとにアドバタイジングパケットを送信します。

"hcidump --raw"をバックグランドで実行して、BLE通信のデータをRawデータを読めるようにします。

root@armadillo-iotg:~# hcidump --raw &
[1] 669
root@armadillo-iotg:~# HCI sniffer - Bluetooth packet analyzer ver 5.23
device: hci0 snap_len: 1500 filter: 0xffffffff

"hcitool lescan"でスキャンします。

root@armadillo-iotg:~# hcitool lescan
< 01 0B 20 07 01 10 00 10 00 00 00
> 04 0E 04 01 0B 20 00
< 01 0C 20 02 01 01
> 04 0E 04 01 0C 20 00
LE Scan ...
> 04 3E 24 02 01 03 00 77 7B 3F 11 22 32 18 02 01 05 07 FF 99
  99 EA 01 03 00 0C 09 42 4C 45 43 41 53 54 5F 42 4C 00 C2
32:22:11:3F:7B:77 BLECAST_BL

照度センサー(BLECAST_BL)が見つかると、 上記ログの末尾の

> 04 3E 24 02 01 03 00 77 7B 3F 11 22 32 18 02 01 05 07 FF 99
  99 EA 01 03 00 0C 09 42 4C 45 43 41 53 54 5F 42 4C 00 C2
32:22:11:3F:7B:77 BLECAST_BL

のように、照度センサー(BLECAST_BL)のMACアドレスと、受信データのRawデータが表示されます。 データの受信が確認できたら、"hcitool lescan"をctrl+Cで終了します。

また、上記手順でhcidumpをバックグランドで実行しているので、killallで終了させます。

root@armadillo-iotg:~# killall hcidump

3.照度センサーからの受信データの確認

照度センサー(BLECAST_BL)からのデータフォーマットは、 http://www.robotsfx.com/robot/BLECAST_BL.html に説明されています。 この説明に基づき、手順2で確認した

> 04 3E 24 02 01 03 00 77 7B 3F 11 22 32 18 02 01 05 07 FF 99
  99 EA 01 03 00 0C 09 42 4C 45 43 41 53 54 5F 42 4C 00 C2
32:22:11:3F:7B:77 BLECAST_BL

から、PDUデータを読み解くと下記のようになります。

03 00: ヘッダ
77 7B 3F 11 22 32: MACアドレス 
18: ?
02 01 05: AD1(Flag) 
07 FF 99 99 EA 01 03 00: AD2(センサーデータ) 
0C 09 42 4C 45 43 41 53 54 5F 42 4C: AD3(ローカルネーム)

備考)上記の"18: ?"については、該当する説明が見当たりませんでした。(以降のデータ長と推測。)

上記ログの場合、

07 FF 99 99 EA 01 03 00: AD2(センサーデータ)

の末尾の2Byte(03 00)が照度データで、
03:照度データのLSB
00:照度データのMSB
になります。

4.照度センサーからデータを受信して照度データを抜き出すスクリプト

手順3の方法で、照度センサーからデータを受信して照度データを抜き出すスクリプトを添付します。 start_ble_lux.sh <スクリプトの用法> 照度センサーのMACアドレスを引数に実行します。

start_ble_lux.sh [MACアドレス]

下記は、照度センサーのMACアドレスが"32:22:11:3F:7B:77"の場合の実行例です。

root@armadillo-iotg:~# ./start_ble_lux.sh 32:22:11:3F:7B:77
hcidump: no process found
hcitool: no process found
Search MAC Address: 32:22:11:3F:7B:77 (-> 77 7B 3F 11 22 32 in Advertising)
./start_ble_lux.sh: line 23:   802 Terminated              hcitool lescan > /dev/null 2> /dev/null
 
04 3E 24 02 01 03 00 77 7B 3F 11 22 32 18 02 01 05 07 FF 99 99 7B 0D 5A 00 0C 09 42 4C 45 43 41 53 54 5F 42 4C 00 D8
 
PDU_PAYLOAD = 03 00 77 7B 3F 11 22 32 18 02 01 05 07 FF 99 99 7B 0D 5A 00 0C 09 42 4C 45 43 41 53 54 5F 42
 
-------- PDU Payload --------
MAC_ADD = 77 7B 3F 11 22 32
UNKNOWN = 18
AD1 = 02 01 05
AD2 = 07 FF 99 99 7B 0D 5A 00
AD3 = 0C 09 42 4C 45 43 41 53 54 5F 42
 
lux data is last 2 bytes of AD2: 5A 00 -> 0x005A = 90
 
lux = 90

"-------- PDU Payload --------"の箇所にPDUデータの解析結果を表示して、 末尾に照度(10進数)を表示しています。

<スクリプトの説明> start_ble_lux.sh

######## Preparation: begin ########
// hcidump、hcitoolを重複実行しないようにkillallする。
######## Preparation: end ########
 
######## MAC Address: begin ########
// 本スクリプトの引数のMACアドレス(例:12:34:56:78:9A:BC)を
// hcidumpの出力の順番(例:BC 9A 78 56 34 12)に並び替える。
######## MAC Address: end ########
 
######## Scan  and Get Advertising: begin ########
// hcidumpでBLEのアドバタイジングパケットのRawデータをlog.txtに出力するよう、バックグランドで実行。
//  このとき、本スクリプトの引数のMACアドレスを含む行と次の行(※)を"grep -A 1"で抜き出す。
//  ※)今回の照度センサーのデータ長より、2行で出力されるため。
//  また、以降のPDUデータの解析がしやすいよう、trコマンド、sedコマンドで、1行のRawデータに変換している。
// hcitoolでスキャン
######## Scan and Get Advertising: end ########
 
######## Get Lux Data: begin ########
// 手順3のように、PDUデータを解析し、照度データを10進数で表示。
######## Get Lux Data: end ########

備考)
######## Get Lux Data: begin ########
######## Get Lux Data: end ########
の箇所は、今回の照度センサーの仕様に合わせてアドバタイジングパケットを解析した部分なので、 この部分を改造すると、他の仕様のアドバタイジングパケットの解析にも使えると思います。