使用hcitool设置广告包

时间:2014-05-05 22:38:26

标签: bluetooth bluetooth-lowenergy ibeacon bluez hci

关于如何将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

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

sudo hcitool -i hci0 cmd

将hci命令发送到hci0设备

0x08 0x0008 

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

1e

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

02 01 1a 1a

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

ff 4c 00 ...

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

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

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

4 个答案:

答案 0 :(得分: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

0x0c:以下标头组的长度 0x0b:此标头的长度 0x09:AD输入完整名称 rest 0x0a length是名称

答案 1 :(得分:5)

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

如果您使用hcitool cmd --help,它会告诉您类似cmd <ogf> <ocf> ...的内容。有助于查看Bluetooth Core Specification以找出OGF和OCF的0x08和0x0008。专门Vol。 2,E部分,7.8

  

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

和OCF为0x0008

  

Advertising_Data_Length,Advertising_Data

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

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

答案 2 :(得分:3)

查看this answer类似的问题。它基本上描述了如何下载巨型Bluetooth Core Spec文档,并阅读它为您提供的所有命令。如果你能找到正确的格式(并找出命令实际执行的内容,你可以使用hcitool命令执行这些命令中的任何一个!)

主要警告:我自己没有尝试过设置名称,但是看了一下规范,看起来这个在第482页的规范第482页描述&#34; 7.3.11写本地名称命令&#34;。根据这个命令,命令包括:​​

OCF: 0x0013
Name (up to 248 bytes)

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

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

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

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

答案 3 :(得分:1)

看起来你需要使用两个命令而不是一个。 iBeacon数据包含在&#34; LE集广告数据&#34;数据并已在本文其他地方提到过。要查看BLE友好名称,您可以使用附加命令&#34; LE设置扫描响应数据&#34;,这需要接收器扫描您的设备(而不是被动地读取广告包)。因此,您可以将Angelo的示例与this one结合起来,将设备设置为iBeacon,并设置&#34;友好名称&#34;这是扫描响应数据

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加密狗的Ubuntu盒子,然后使用这个android BLE扫描应用程序扫描信标