【问题标题】:Using hcitool to set ad packets使用 hcitool 设置广告包
【发布时间】:2014-06-22 09:09:06
【问题描述】:

有一篇众所周知的博客文章介绍了如何将 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

向 hci0 设备发送 hci 命令

0x08 0x0008 

设置广告包只是魔术,其他stackoverflow命令都说“使用它,不要问

1e

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

02 01 1a 1a

是设置广告包的标志(详情请咨询)

ff 4c 00 ...

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

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

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

【问题讨论】:

  • 最终传输的广告数据包负载以“02 01 1a 1a”序列开头。因此,您尝试更改的“ff 4c”很好地位于有效负载内,因此更改不会导致不同的命令,而只会导致传输乱码。

标签: bluetooth bluetooth-lowenergy ibeacon bluez hci


【解决方案1】:

回复晚了,但有人可能会觉得这很有用。我在使用 hcitool 时自己寻找解决方案时发现了它。

如果您使用hcitool cmd --help,它会告诉您类似cmd <ogf> <ocf> ... 的信息。查看Bluetooth Core Specification 有助于了解 OGF 和 OCF 的 0x08 和 0x0008 是什么。特别卷。 2,E 部分,7.8

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

对于 0x0008 的 OCF

Advertising_Data_Length、Advertising_Data

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

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

【讨论】:

    【解决方案2】:

    没有。这些答案都不是正确和干净的。

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

    2) LE Set Advertising Data 比上面解释的要复杂得多。至少有 2 个 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 类型 rest 0x0a 长度是名字

    【讨论】:

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

    查看this answer 来回答类似问题。它基本上描述了如何下载巨大的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 命令),并查看有关执行了哪些(人类可读的)命令以及发生了哪些错误(如果有)的注释详细信息。

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

    【讨论】:

    • 谢谢大卫,我试了一下,但我回来了“发送失败:不允许操作”。我的猜测是 BT3 和 BT4 命令之间存在差异。例如,它不能最多为 248 字节,因为广告包只有 28 字节的可用空间,所以这里有明显的断开连接。
    • 好吧,我认为本地名称不是在广告包中发出的。所以它的长度限制不应该适用。
    • 响应“Send failed: Operation not allowed”可能表明执行该命令的Linux用户没有写入BLE设备的权限。试试sudo hcitool -i hci0 cmd 0x08 0x0013 41 42 43
    • 这似乎在当前 4.0 规范文件的站点 828 上。然而,据我了解,这不是 LE 名称,而是 BD/EDR 名称,又名蓝牙经典,这不是设置完整的本地名称或缩短的本地名称。 qoute Write_Local_Name 命令提供了修改 BR/EDR 控制器的用户友好名称的能力。请参阅第 446 页的第 6.23 节。
    【解决方案4】:

    看来您需要使用两个命令而不是一个。 iBeacon 数据包含在“LE Set Advertising Data”数据中,并在本文其他地方提到过。要查看 BLE 友好名称,您可以使用附加命令“LE Set Scan Response Data”,这需要接收器扫描您的设备(而不是被动地读取广告数据包)。因此,您可以将 Angelo 的示例与 this one 结合起来,将设备设置为 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 加密狗的 Ubuntu 盒子,然后使用此 android BLE 扫描应用程序扫描信标

    【讨论】:

      猜你喜欢
      • 2019-01-25
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      相关资源
      最近更新 更多