使用hcitool设置广告数据包。

16

现在有一篇广为人知的博客文章介绍如何将USB蓝牙4.0适配器设置为iBeacon。归结起来就是这个神奇的命令:

sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 00 00 00 00 00 00 00 00 00 00 00 00 00
这个例子的问题在于它过于晦涩,难以在其他一般格式中使用。我已经设法将其分解了一些:
sudo hcitool -i hci0 cmd

发送一个hci命令到hci0设备

0x08 0x0008 

设置广告包只是一个魔法,其他stackoverflow命令都说“只需使用它,不要询问”

1e

以下数据包的整个长度(以字节为单位)

02 01 1a 1a

设置广告数据包的标志(请求详细信息)

ff 4c 00 ...

这是编码iBeacon信息的“公司特定数据”

我的尝试是用设置参数名称“04 09 41 42 43”(应将其设置为ABC)的操作码替换“FF…”字节,但这并不起作用。

我很惊讶hcitool没有给我们一些关于如何设置广告数据包的示例,因为这对于设置各种其他参数(如TEMP或POWER)非常有用。还有其他人使用hcitool设置名称之类的东西的经验吗?


最终传输的广告数据包负载以“02 01 1a 1a”序列开头。你试图更改的“ff 4c”位于负载内部,因此更改它不会导致不同的命令,而只会产生混乱的传输。 - Chris Stratton
4个回答

8
晚回复了,但是也许有人会发现这很有用。当我使用hcitool时自己寻找解决方案时,我发现了这个。
如果您使用“hcitool cmd --help”,它会告诉您类似于以下内容:“cmd <ogf> <ocf> ...”。 查看蓝牙核心规范有助于查找OGF和OCF的0x08和0x0008代表什么。具体来说,请参阅Vol. 2,第E部分,7.8
对于LE控制器命令,OGF代码定义为0x08
对于OCF代码0x0008,广告数据长度,广告数据
因此,基本上,通过0x08 0x0008,您表示正在设置发送的数据的长度(在LE控制器中)。至于名称,由于BLE广告包的长度为31字节(1E),因此您需要发送全部31字节。因此,如果您只拥有ABC作为名称,则设置04 09 41 42 43是正确的,但那只有五个字节。 对于31,您需要添加00 26次。只要小心,不要加太多或太少。
另外,我没有认为BLE广告数据包的大小是固定的31个字节,但至少对于hcitool是这样。如果您特别将传出大小设置为小于1E的某个内容,则它不起作用。

5
没有。这些答案都不正确且不干净。

1) BLE 有一个单独的命令集。必须使用“LE Set Advertising Data”命令(见7.8.7卷2第E部分)。

2) LE Set Advertising Data 比上述解释复杂得多。至少有两个1字节长度字段,数据包必须为32字节长度,并用零填充,但第一个长度字节不能为0x1e(31),而是有效使用部分的长度,其中包含一个或多个标头。每个标头仍然包含长度、一个AS类型字节(0x09表示设置本地名称)和名称。

设置LE本地名称:

hciconfig hci0 down
hciconfig hci0 up
hcitool -i hci0 cmd 0x08 0x0008 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
hciconfig hci0 leadv 0

0x0c:以下头部组的长度 0x0b:此头部的长度 0x09:完整名称的AD类型 其余0x0a长度为名称


2
上述给出的顺序是不正确的。hcitool -i hci0 cmd 0x08 命令必须跟随 hciconfig hci0 leadv 0 命令。这是因为 leadv 命令还将广告包数据设置为默认值 0x000。因此,在调用 "leadv" 后,您需要调用 hctitool -i hci0 cmd 0x08 .. 命令将打包数据重置为您的自定义值。 - Yechiel Labunskiy

4
请查看类似问题的此答案。它基本上描述了你如何下载巨大的Bluetooth Core Spec文档,并阅读其中提供的所有命令。如果你能找出正确的格式(并弄清楚这些命令实际上是做什么的!), 你可以使用hcitool命令执行这些命令。

主要注意事项: 我自己没有尝试过设置名称,但是浏览规范时,似乎在规范的第482页的“7.3.11写本地名称命令”一节中描述了这个过程。根据说明,该命令由以下内容组成:

OCF: 0x0013
Name (up to 248 bytes)

因此,我会尝试使用这样的命令:

hcitool -i hci0 cmd 0x08 0x0013 41 42 43

另一个提示:当您发出这样的命令时,请尝试运行hcidump &,以便命令在后台执行。然后,您可以输入实验性的hcitool命令(甚至是hciconfig命令),并查看有关执行的命令及其是否存在错误的注释详细信息。

使用上述提示,您还可以尝试执行hciconfig name abc以使用该命令行工具设置本地名称,同时在后台执行hcidump &。这应该向您显示要使用的正确hcitool命令值。


谢谢David,我尝试了一下,但是返回了“发送失败:操作不允许”。我猜测BT3和BT4命令之间存在差异。例如,它不能高达248字节,因为广告数据包只有28字节的空闲空间,所以这里存在明显的断开连接。 - ScottJenson
嗯,我认为本地名称不会在广告数据包中发送,因此其长度限制不应适用。 - davidgyoung
1
“发送失败:操作不允许”这个响应可能表明用于执行命令的Linux用户没有写入BLE设备的权限。请尝试使用 sudo hcitool -i hci0 cmd 0x08 0x0013 41 42 43 命令。 - davidgyoung
这似乎是当前4.0规范文件的828页上的内容。 然而,据我理解,这不是LE名称,而是BD/EDR名称,也就是蓝牙经典版,这并没有设置完整的本地名称或缩短的本地名称。引用 Write_Local_Name命令提供了修改BR/EDR控制器的用户友好名称的能力。请参见第446页的第6.23节。 - Dennis Nolte

2
似乎您需要使用两个命令而不是一个。iBeacon数据包含在“LE设置广告数据”数据中,并已在此帖子中提到。要查看BLE友好名称,您可以使用附加命令“LE设置扫描响应数据”,这需要接收器扫描您的设备(而不是被动读取广告数据包)。因此,您可以将Angelo的示例与此示例结合使用,将设备设置为iBeacon并设置“友好名称”,即扫描响应数据。
sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00
sudo hcitool -i hci0 cmd 0x08 0x0009 0c 0b 09 6c 69 6e 6b 6d 6f 74 69 6f 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

我使用一个带有BLE dongle的Ubuntu盒子,然后使用这个android BLE扫描应用程序来扫描信标,这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接