hcidump で BLE でアドバタイジングの内容を確認する

以前以下の記事を書きました。

「gatttool を使って NUS( Nordic UART Service ) とつなぐ実験」
https://qiita.com/nanbuwks/items/7c448837eedf439b8ee9

これは connect を行って、gatttool から各種操作を行うお話。

さて、BLEはコネクトせずにアドバタイジングパケットを使っての操作ができます。

connectせずにアドバタイジングの中身を見るには？

「Raspberry PiでiBeaconを検知する」
https://qiita.com/katsuyoshi/items/9d5417495a47c4b15ac1
を参考にhcidumpを使うことにします。


# 環境

Ubuntu 18.04
hcidump 5.48
BBC micro:bit + Scratch micro:bit HEX



hcidumpは以下のようにしてインストールします。


```

$ sudo apt-get install bluez-hcidump
```

# 操作

```

$ sudo hcidump -R &
[1] 2462

としておいてから、

$ sudo hcitool lescan
```
とします。

```

D1:7C:18:BB:9E:96 FABLIB aonodn [penbee]
> 04 3E 27 02 01 00 01 96 9E BB 18 7C D1 1B 02 01 05 17 09 42 
  42 43 20 6D 69 63 72 6F 3A 62 69 74 20 5B 70 65 6E 62 65 65 
  5D C2 
D1:7C:18:BB:9E:96 (unknown)
> 04 3E 10 02 01 04 01 96 9E BB 18 7C D1 04 03 03 05 F0 C5 
CA:59:5C:B9:F3:41 BBC micro:bit [puvut]
> 04 3E 2A 02 01 00 01 41 F3 B9 5C 59 CA 1E 02 01 06 16 09 42 
  42 43 20 6D 69 63 72 6F 3A 62 69 74 20 5B 70 75 76 75 74 5D 
  03 03 05 F0 C5 
CA:59:5C:B9:F3:41 (unknown)
> 04 3E 0C 02 01 04 01 41 F3 B9 5C 59 CA 00 C5 

```

となりました。

ここで、micro:bitからのアドバタイジングのみを抽出すると


```

CA:59:5C:B9:F3:41 BBC micro:bit [puvut]
> 04 3E 2A 02 01 00 01 41 F3 B9 5C 59 CA 1E 02 01 06 16 09 42 
  42 43 20 6D 69 63 72 6F 3A 62 69 74 20 5B 70 75 76 75 74 5D 
  03 03 05 F0 C5 
CA:59:5C:B9:F3:41 (unknown)
> 04 3E 0C 02 01 04 01 41 F3 B9 5C 59 CA 00 C5 
```
となります。

BBC micro:bit では、最初の通信に名前とF005が入っているのがわかります。
ScratchLink は F005 を認識し、 micro:bit を通信します。

さて、BLE の Advertizing PDU
は ヘッダ 2 バイト ＋ 0〜37 バイトのペイロード からなりますが、１つ目の通信は45バイトあるのでこれはパケットそのものを見ているのではないようです。また、プリアンブルとアクセスアドレスについてもここには出てないようです。
したがって、ここに表示されているのは複数のパケットからなる通信の内容のうち、ペイロードのみがここには出ているようです。

通信内容のフォーマットについては、以下のようにして判読します。

BLE Core Spec
` Bluetooth.org
https://www.bluetooth.org/docman/handlers/downloaddoc.ashx?doc_id=229737
から
Core_V4.0.zipをダウンロード


全部で2302ページあります。


http://todotani.cocolog-nifty.com/blog/2013/02/bluetooth-le-bt.html
によると、
> Volume-3 (Core System Package), Part-C (Generic Access Profile), Section-11 “ADVERTISING AND SCAN RESPONSE DATA FORMAT”に必要な情報を見つけました。

ということで、該当箇所から読み解きます。




| ? |BD address| ?|length | AD Type| flag |length|AD Type| BBC micro:bit [puvut] | length | AD Type |service UUID | ? |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 04 3E 2A 02 01 00 01 | 41 F3 B9 5C 59 CA | 1E | 02 | 01 | 06 | 16 | 09 | 42 42 43 20 6D 69 63 72 6F 3A 62 69 74 20 5B 70 75 76 75 74 5D | 03 | 03 | 05 F0 | C5 | 


このうち、AD Typeは

"SPECIFICATIONS Assigned Numbers" 
https://www.bluetooth.com/specifications/assigned-numbers/
の "Generic Access Profile" を選んだ先の

"​​Assigned numbers are used in GAP for inquiry response, EIR data type values, manufacturer-specific data, advertising data, low energy UUIDs and appearance characteristics, and class of device."
https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/
で参照できます。


さて、BD address の両端にある
04 3E 2A 02 01 00 01 と 1E とは何でしょうか？


先の資料の Core_V4.0.zip 中の

Volume-2 Core System Package [BR/EDR Controller volume]
の
Part E HOST CONTROLLER INTERFACE FUNCTIONAL SPECIFICATION
の
Secsion-7 HCI COMMANDS AND EVENTS
の
7.7.65.2 LE Advertising Report Event に該当がありました。それとつきあわせると

| | | |
| --- | --- | --- | 
| Event Type | Scan Response |  0x04 | 
| Event Code  | LE Meta  | 0x3E | 
| Data Length  |  | 0x2A | 
| Sub Envent  | LE Advertising Report  | 0x02 | 
| Num Reports  |  | 0x01 | 
| Peer Address Type[0] |  Public Device Address  | 0x00 | 
| BD_ADDR[0] |  | 0x41 0xF3 0xB9 0x5C 0x59 0xCA |
| Length[0] |    | 0x1E | 


ということでした。

更に、最後の C5 についても、

| | | |
| --- | --- | --- | 
| RSSI[0] |  |  0xC5 | 

ということでした。