使用 HCITool 通告蓝牙 LE 服务
Advertise Bluetooth LE Service using HCITool
我正在尝试在我的 Linux 计算机上创建低功耗蓝牙外围设备(目标是通过蓝牙从 iPhone 发送数据)。我目前正在使用工具 hciconfig
、hcitool
和 hcidump
.
我目前的实验是用特定的 UUID 来宣传一个服务,iOS CoreBluetooth 库将获取该服务。 (注意:我不是要创建 iBeacon)。
现在,它实际上就像困扰我的一个命令一样简单。
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
我认为它应该做的是:
- 0x08:将组设置为 BLE
- 0x0008:将命令设置为 HCI_LE_Set_Advertising_Data
- 0x15:将Header中的Significant Bytes Length设置为21。(Flag包3Byte,Service Structure 18Byte)
- 0x02:将标志结构的长度设置为 2 字节
- 0x01:将结构类型设置为 AD 标志
0x1a:标志值:
bit 0 (OFF) LE Limited Discoverable Mode
bit 1 (ON) LE General Discoverable Mode
bit 2 (OFF) BR/EDR Not Supported
bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
(标志结束)
- 0x11 将服务结构的长度设置为 17 字节
- 0x07 将结构类型设置为 128 位完整服务 UUID 列表
- 0x41 ... 0x50 将测试服务的 UUID 设置为 ABCDEFGHIJKLMNOP
据我所见 hcidump
,它执行正确并且看起来像我想要的那样。但它被错误拒绝:
LE Set Advertising Data (0x08|0x0008) ncmd 1
status 0x12
Error: Invalid HCI Command Parameters
我花了一整天的时间试图把它弄好。熟练的人会看到我做错了什么吗?这是宣传服务的正确方式吗?
(感兴趣的上下文reader:我已经成功地完成了我想使用 NodeJs 中的 Bleno 库做的事情。但是,这不适合我们系统中的大局。直接使用 HCITool 进行广告只是为了实验,以后会写在Python)
HCI_LE_Set_Advertising_Data 有效负载的长度应恰好为 32 个字节。尝试用零填充命令以达到 32 字节:
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 00 00 00 00 00 00 00 00 00
您可以使用 hcidump --raw.
获得更多见解
比较原始命令的输出:
$hcidump --raw
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 16 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50
> 04 0E 04 01 08 2
用零填充一个:
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 20 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50 00 00 00 00 00 00 00 00 00 00
> 04 0E 04 01 08 20 00
获得更多信息的另一种方法是 运行 hciconfig hci0 leadv
并使用 hcidump --raw
检查 hciconfig 发送的 SET_ADVERTISING_PARAMETERS 命令的负载。
顺便说一下,我注意到有时非零填充命令也有效,这可能取决于您使用的 bluez 版本。
我正在尝试在我的 Linux 计算机上创建低功耗蓝牙外围设备(目标是通过蓝牙从 iPhone 发送数据)。我目前正在使用工具 hciconfig
、hcitool
和 hcidump
.
我目前的实验是用特定的 UUID 来宣传一个服务,iOS CoreBluetooth 库将获取该服务。 (注意:我不是要创建 iBeacon)。
现在,它实际上就像困扰我的一个命令一样简单。
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
我认为它应该做的是:
- 0x08:将组设置为 BLE
- 0x0008:将命令设置为 HCI_LE_Set_Advertising_Data
- 0x15:将Header中的Significant Bytes Length设置为21。(Flag包3Byte,Service Structure 18Byte)
- 0x02:将标志结构的长度设置为 2 字节
- 0x01:将结构类型设置为 AD 标志
0x1a:标志值:
bit 0 (OFF) LE Limited Discoverable Mode bit 1 (ON) LE General Discoverable Mode bit 2 (OFF) BR/EDR Not Supported bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller) bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
(标志结束)
- 0x11 将服务结构的长度设置为 17 字节
- 0x07 将结构类型设置为 128 位完整服务 UUID 列表
- 0x41 ... 0x50 将测试服务的 UUID 设置为 ABCDEFGHIJKLMNOP
据我所见 hcidump
,它执行正确并且看起来像我想要的那样。但它被错误拒绝:
LE Set Advertising Data (0x08|0x0008) ncmd 1
status 0x12
Error: Invalid HCI Command Parameters
我花了一整天的时间试图把它弄好。熟练的人会看到我做错了什么吗?这是宣传服务的正确方式吗?
(感兴趣的上下文reader:我已经成功地完成了我想使用 NodeJs 中的 Bleno 库做的事情。但是,这不适合我们系统中的大局。直接使用 HCITool 进行广告只是为了实验,以后会写在Python)
HCI_LE_Set_Advertising_Data 有效负载的长度应恰好为 32 个字节。尝试用零填充命令以达到 32 字节:
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 1a 11 07 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 00 00 00 00 00 00 00 00 00 00
您可以使用 hcidump --raw.
获得更多见解
比较原始命令的输出:
$hcidump --raw
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 16 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50
> 04 0E 04 01 08 2
用零填充一个:
HCI sniffer - Bluetooth packet analyzer ver 5.30
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
< 01 08 20 20 15 02 01 1A 11 07 41 42 43 44 45 46 47 48 49 4A
4B 4C 4D 4E 4F 50 00 00 00 00 00 00 00 00 00 00
> 04 0E 04 01 08 20 00
获得更多信息的另一种方法是 运行 hciconfig hci0 leadv
并使用 hcidump --raw
检查 hciconfig 发送的 SET_ADVERTISING_PARAMETERS 命令的负载。
顺便说一下,我注意到有时非零填充命令也有效,这可能取决于您使用的 bluez 版本。