ibeacon 技術的詳細


[wikipedia](https://en.wikipedia.org/wiki/IBeacon)の技術詳細には次のように書いてある。

```bash
hcitool -i hci0 cmd 0x08 0x0006 a0 00 a0 00 03 00 00 00 00 00 00 00 00 07 00
################################## 02 01 06 1a ff 4c 00 02 15  # Apple's fixed iBeacon advertising prefix
hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 FB 0B 57 A2 82 28 44 CD 91 3A 94 A1 22 BA 12 06 00 01 00 02 D1 00
hcitool -i hci0 cmd 0x08 0x000a 01
```

これをただコピーするだけでは猿並みだ…。せっかくなので `hcitool` の引数を分解していく。

まず `-i hci0` は特に問題ない。`hciconfig`で見えるインターフェース一覧と同じで、`hci0`インターフェースに対して操作を行っている。

`cmd`は`hcitool`のサブコマンド。[man page](http://git.kernel.org/cgit/bluetooth/bluez.git/tree/tools/hcitool.1)にはこう書いてある。

```bash
cmd <ofg> <ocf> [parameters]
  Submit an arbitrary HCI command to local device.
  ogf, ocf and parameters are hexadecimal bytes.
```
`ogf`, `ocf` というのは、[bluetooth仕様](https://www.bluetooth.org/ja-jp/specification/adopted-specifications)のCoreに書かれていて、今ならCore Version4.2 の vol. 2, part E, section 5.4.1 に書かれている。ogf = OpCode Group Field, ocf = OpCode Command Fieldということらしい。ogf 6bit, ocf 10bitの、合計16bitで決まる。

ogf 0x08 = LE Controller Commands になっている(vol. 2, part E, section 7.8)

ocf については次の通り

* 0x0006 = HCI_LE_SET_Advertising_Parameters (vol. 2, part E, section 7.8.5)
* 0x0008 = HCI_LE_SET_Advertising_Data (vol. 2, part E, section 7.8.7)
* 0x000a = HCI_LE_Set_Advertise_Enable (vol. 2, part E, section 7.8.9)

その後ろのparametersに関しては、section 5.4.1のパケットフォーマットと突き合わせて逐一読んでいく。まず、parameter total length は、hcitool cmd が計算して埋めてくれる。その後ろのparametersはOpCodeごとに変わる。


advertising parameters
-------------------------

section 7.8.5 に従って、次の内容を分解してみる。

```text
# hcitool -i hci0 cmd 0x08 0x0006 a0 00 a0 00 03 00 00 00 00 00 00 00 00 07 00
```

|parameters|hex|meaning|
|------------|---|-------|
|Advertising_Interval_Min|a0 00|0x00a0 * 0.625 msec = 100 msec|
|Advertising_Interval_Max|a0 00|0x00a0 * 0.625 msec = 100 msec|
|Advertising_Type| 03 |Non connectable undirected advertising ADV_NONCONN_IND|
|Own_Address_Type|00|Public Device Address(default)|
|Peer_Address_Type| 00 |Public Device Address(default)|
|Peer_Address| 00 00 00 00 00 00 |address of the device to be connected = BDADDR_ANY|
|Advertising_Channel_Map|07|Default(all channels 37, 38, 39)|
|Advertising_Filter_Policy| 00 |Process scan adn connection requests from all devices(no white list in use)(default)|

advertising data
-----------------

section 7.8.7 に従って、次の内容を分解してみる

```
# hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 FB 0B 57 A2 82 28 44 CD 91 3A 94 A1 22 BA 12 06 00 01 00 02 D1 00
```

|parameters|hex|meaning|
|---------|---|------|
|Advertising_Data_Length|1E|30|
|Advertising_Data|残り全て|vol. 3, part C, section 11に従って読む|

vol. 3, part C, section 11によると、AD structureの配列になっている。AD Typeは[Generic Access Profile](https://www.bluetooth.org/en-us/specification/assigned-numbers/generic-access-profile)に定義がある。

```text
ad_structure{
 Length = 02
 Data {
  AD Type = 01 ... <<Flags>>
  AD Data = 1A ... 謎
 }
}
ad_structure{
 Length = 1A (26)
 Data {
  AD Type = FF ... <<Manufacturer Specific Data>>
  AD Data {
   Company Identifier Code = 4C 00 ... Apple, Inc(0x004C)
   additional manufacturer specific data {
    type = 02 ... ibeacon AD indicator
    length = 15 (21)
    data {
     uuid = FB 0B 57 A2 82 28 44 CD 91 3A 94 A1 22 BA 12 06
     major = 00 01
     minor = 00 02
     power = D1
    }
    padding = 00
   }
  }
 }
```

Flags については CSS v5 では Reserved とされているビットを使っている。CSS v6 には定義があるかも。