ブログ

Armadillo-IoT G3L:BLE Beaconのデータを取得してみた

at_takuma.fukuda
2020年9月3日 13時29分

使用したビーコン

Feasycom社製FSC-BP03
Amazonで安価で購入出来るBLE Beaconです。
商品説明にBLE5.0対応という文言がありますが、LongRangeに対応しているわけでは無いようです。
Appleが策定したiBeaconや、Googleが策定したEddystoneなどのデータフォーマットに対応しています。

Armadillo-IoT G3Lの準備

BLEのBeaconデータは、アドバタイジングパケットと呼ばれる、デバイスから不特定多数に対して定期的に発信されるパケットとして送信されます。
Armadillo-IoTシリーズでアドバタイジングパケットを受信する手順としては以前にも下記記事でご紹介しています。
Armadillo-IoT(G3):WLAN+BT コンボモジュールでBLE通信の照度センサーのデータを読む
今回も同様にhci-dumpとhcitool lescanを使ってアドバタイジングパケットを受信しますが、
このビーコンから発信されるアドバタイジングパケットのみを受信するために、以下を行います。

root@armadillo:~# hcitool lewladd XX:XX:XX:XX:XX:XX(ビーコンのMACアドレス)

この手順によって特定のBLEデバイスをホワイトリストに追加することが出来ます。
Beaconの設定を変更してもMACアドレスは変更されないので予め登録しておくと使いやすいです。
ホワイトリストの設定を使ってデータを受信するには以下の手順でコマンドを実行します。

root@armadillo:~# hcidump --raw &
*アドバタイジングパケットのRAWデータを表示します
hcitool lescan --whitelist
*周囲にあるBLEデバイスから出力されたパケットのうち、ホワイトリストに追加されたデバイスからのもののみをスキャンします

ビーコンの設定・データ取得

iBeacon

まずiBeaconデータの受信を確認します。
FSC-BP03は専用のスマートフォンアプリから設定を変更することが出来ます。
受信したデータを解析しやすいようにシンプルな設定にしておきます。 FSC-BP03ではUUID、Major、Minorを設定可能です。

UUID:0
Major:2
Minor:4

こちらの設定を行った後にデータ受信操作を行うと以下のようなパケットが受信されます。

XX:XX:XX:XX:XX:XX (unknown)
> 04 3E 2A 02 01 00 00 XX XX XX XX XX XX 1E 02 01 06 1A FF 4C
  00 02 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  02 00 04 B5 AF

先頭の13バイトはiBeaconデータではなくBLEの共通のパケットです。

04:プリアンブル
3E 23 02 01:アクセスアドレス
00 00:ヘッダ
XX XX XX XX XX XX:MACアドレス

以降のパケットは下記のサイトを参考に読み解くと、以下のようになります。
Tech Web:iBeaconとは Qiita:Raspberry PiでiBeaconを検知する

1E :データ長 31
02 01 06:Info A? 詳細不明 
1A :データ長 26
FF:Info Header 
4C 00:Apple company identifier
02:タイプ
15:データ長 21
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 :UUID
00 02 :Major
00 04 :Minor
B5 :RSSI 0xB5=-75dBm
AF:CRC

これにより、iBeaconデータを受信し、UUID・Major・Minorによる識別と、RSSI値の取得が出来る事が確認出来ました。

Eddystone

EddystoneにはUID、URL、TLMなどの複数のデータフォーマットがあります。
FSC-BP03ではUIDとURLを使用可能です。
この記事ではURLに設定してデータの受信を行います。
以下のURLを送信するように設定します。

https://abcdefgh.com

こちらの設定を行った後にデータ受信操作を行うと以下のようなパケットが受信されます。

XX:XX:XX:XX:XX:XX (unknown)
> 04 3E 23 02 01 00 00 XX XX XX XX XX XX 17 02 01 06 03 03 AA
  FE 0F 16 AA FE 10 B1 03 61 62 63 64 65 66 67 68 07 AE

先頭の13バイトはiBeaconと同様のものです。

04:プリアンブル
3E 23 02 01:アクセスアドレス
00 00:ヘッダ
XX XX XX XX XX XX:MACアドレス

ここから先がEddystone固有のデータフォーマットとなります。
下記を参考に読み解いていきます。
Eddystone-URL

17:以降のデータ長
02 01 06 03 03 AA FE 0F 16 AA FE:Eddystoneの共通パケット(下記参考の事)
10 :フレームタイプ(URLの場合は0x10)
B1 :送信電力 この場合は0xB1=-79dBM
03 :URLの先頭部分 0x03=https://
61:US-ASCIIによってエンコードされた文字列 0x61=a 
62 63 64 65 66 67 68 :上記と同様に、bcdefgh
07:URLの末尾部分 0x07=.com
AE:CRCコード

また、この時以下のようなパケットも受信していることも確認出来ました。

> 04 3E 26 02 01 00 00 A6 15 01 30 0D DC 1A 02 01 06 03 03 AA
  FE 11 16 AA FE 20 00 0B 65 80 00 00 08 99 DF 00 02 28 64 00
  AF

フレームタイプが0x20となっているのでEddystone-TLMデータだと思われますが、
下記を参考に読み解くと、バッテリー電圧が2917mV/bit、気温が128℃となりますので正常なデータでは無いようです。
Unencrypted TLM Frame Specification