使用HCITool宣传蓝牙LE服务

时间:2016-03-08 16:00:41

标签: 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

我认为它应该做的是:

  • 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)
    

(旗帜结束)

  • 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

我花了一整天时间试图把它弄好。有经验的人看到我做错了吗?这是宣传服务的正确方法吗?

(感兴趣的读者的上下文:我已经使用NodeJs中的Bleno库成功完成了我想要做的事情。但是,这不适合我们系统中的大局。直接使用HCITool进行广告只是为了实验和将在稍后用Python编写)

1 个答案:

答案 0 :(得分:3)

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版本。