使用hcitool设置广告包

Sco*_*son 11 bluetooth hci bluetooth-lowenergy bluez ibeacon

关于如何将USB蓝牙4加密狗设置为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
Run Code Online (Sandbox Code Playgroud)

这个例子的问题是它是如此不透明,很难以任何更通用的格式使用它.我已经能够分开一点:

sudo hcitool -i hci0 cmd
Run Code Online (Sandbox Code Playgroud)

将hci命令发送到hci0设备

0x08 0x0008 
Run Code Online (Sandbox Code Playgroud)

设置广告包是神奇的,其他stackoverflow命令说"只是使用它,不要问

1e
Run Code Online (Sandbox Code Playgroud)

是以字节为单位的数据包后面的整个ENTIRE的长度

02 01 1a 1a
Run Code Online (Sandbox Code Playgroud)

是用于设置广告包的标志(详情请求)

ff 4c 00 ...
Run Code Online (Sandbox Code Playgroud)

是编码iBeacon信息的"公司特定数据"

我试图做的是将"FF ..."字节替换为用于设置NAME参数"04 09 41 42 43"的操作码(应将其设置为ABC),但这不起作用.

我很惊讶hcitool没有给我们一些关于如何设置广告包的例子,因为这在设置各种其他参数(如TEMP或POWER)时非常有用.有没有其他人有使用hcitool设置NAME之类的经验?

nom*_*mve 6

迟到的回复,但有人可能会觉得这很有用.我找到了它,因为我在使用hcitool时自己寻找解决方案.

如果你使用hcitool cmd --help它会告诉你这样的事情cmd <ogf> <ocf> ....它有助于查看蓝牙核心规范,以找出OGF和OCF的0x08和0x0008.专门Vol.2,E部分,7.8

对于LE控制器命令,OGF代码定义为0x08

并且对于0x0008的OCF

Advertising_Data_Length,Advertising_Data

所以基本上,使用0x08 0x0008,你说你正在设置(在LE控制器中)发送数据的长度.至于名称,由于BLE通告包的长度是31个字节(1E),因此需要发送整个31个字节.因此,如果你只有ABC作为名称,设置04 09 41 42 43是正确的,但这只是五个字节.对于31你需要添加0026次.小心你不要添加太多或太少.

另外,我没有BLE广告的印象.数据包的大小固定为31字节,但它们至少对于hcitool而言.当您专门将传出大小设置为小于的值时,它不起作用1E.


小智 6

没有.这些答案都没有正确和干净.

1)BLE有一个单独的命令集.必须使用"LE Set Advertising Data"命令(参见7.8.7 vol 2 E部分).

2)LE集广告数据比上面解释的要复杂得多.至少有2个1字节长度的字段,数据包必须是32字节长度,填充为零,但第一个长度字节不能是0x1e(31),而是包含一个或多个标题的重要使用部分的长度.每个标头仍包含一个长度,一个AS类型字节(设置本地名称为0x09)和名称.

SET LE LOCAL NAME:

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

0x0c:以下标头组的长度0x0b:此标头的长度0x09:AD完整名称的类型休息0x0a长度是名称

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

dav*_*ung 4

查看类似问题的答案。它基本上描述了如何下载巨大的蓝牙核心规范文档,并阅读它为您提供的所有命令。如果您能找出正确的格式(并弄清楚命令的实际用途!),您可以使用 hcitool 命令来执行这些命令中的任何一个。

主要警告:我没有尝试自己设置名称,但浏览一下规范,看起来规范第 482 页的“7.3.11 写入本地名称命令”部分对此进行了描述。据此,该命令包括:

OCF: 0x0013
Name (up to 248 bytes)
Run Code Online (Sandbox Code Playgroud)

所以我会尝试这样的命令:

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

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

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