使用HCITool宣传Bluetooth LE服务

Joa*_*kim 5 bluetooth-lowenergy gatt bluetooth-peripheral

我正在尝试在Linux计算机上创建低功耗蓝牙外围设备(目标是通过蓝牙从iPhone发送数据)。即时通讯目前使用的工具hciconfighcitoolhcidump

我当前的实验是播发带有特定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
Run Code Online (Sandbox Code Playgroud)

我认为应该执行以下操作:

  • 0x08:将组设置为BLE
  • 0x0008:将命令设置为HCI_LE_Set_Advertising_Data

  • 0x15:将报头中的有效字节长度设置为21。(标志数据包为3字节,服务结构为18字节)
  • 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)
    
    Run Code Online (Sandbox Code Playgroud)

(标志结束)

  • 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
Run Code Online (Sandbox Code Playgroud)

我花了整整一天的时间来纠正它。熟练的人看到我做错了吗?这是宣传服务的正确方法吗?

(感兴趣的读者的背景:我已经成功使用NodeJs中的Bleno库完成了我想做的事情。但是,这并不适合我们系统中的整体情况。直接使用HCITool进行广告只是为了实验,将被编写稍后在Python中)

小智 5

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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

用零填充一个:

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 
Run Code Online (Sandbox Code Playgroud)

获得更多洞察力的另一种方法是运行hciconfig hci0 leadv并用于hcidump --raw检查 hciconfig 发送的 SET_ADVERTISING_PARAMETERS 命令的有效负载。

顺便说一句,我注意到有时非零填充命令也可以使用,这可能取决于您使用的 bluez 版本。