wikipediaの技術詳細には次のように書いてある。
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にはこう書いてある。
cmd <ofg> <ocf> [parameters]
Submit an arbitrary HCI command to local device.
ogf, ocf and parameters are hexadecimal bytes.
ogf
, ocf
というのは、bluetooth仕様の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 に従って、次の内容を分解してみる。
# 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に定義がある。
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 には定義があるかも。