Skip to main content
 首页 » 编程设计

linux之BlueZ:从命令行发送 LE 定向广告

2024年02月20日17langtianya

我正在尝试从命令行发送定向广告,但我不知道该怎么做。我检查了 hciconfighcitoolbtmgmtbluetoothctl,但它们似乎都没有启用定向广告特定的 BLE 设备。当使用 hciconfig 检查我可以发送的广告类型时,我看到以下内容:-

leadv      [type]   Enable LE advertising 
                0 - Connectable undirected advertising (default) 
                3 - Non connectable undirected advertising 

有什么方法可以从命令行发送定向广告吗?

我使用的是在 Linux v4.15.0-36-generic 上运行的 BlueZ 版本 5.48,并连接了蓝牙 4.0 适配器。

请您参考如下方法:

您至少可以使用原始 HCI 命令来执行此操作,您可以使用 hcitool 输入这些命令。您需要的关键 HCI 命令是“LE 设置广告参数命令”(ogf=0x08、ocf=0x0006)。以下是将类型 2 通告设置为对等地址 66:55:44:33:22:11 的示例。

sudo hcitool -i hci0 cmd 0x08 0x0006 A0 00 A0 00 02 01 00 11 22 33 44 55 66 07 00 

第一个 A0 00 是最小广告间隔 (0x00A0 x 0.625ms = 100ms),第二个是最大广告间隔(您实际上可能希望将它们分开一点)。然后是类型(02)、自己的地址类型(01表示随机)、远程地址类型(00表示公共(public))、对等地址、 channel 映射(07表示在 channel 37、38和39上做广告)和过滤策略(00表示允许全部)。更多详细信息可以阅读,例如摘自蓝牙规范,版本 5.0,第 2 卷,E 部分,第 7.8 章(可从 https://www.bluetooth.com/specifications/bluetooth-core-specification 下载)。

注意使用该命令时广告一定不能处于事件状态,否则会失败。

另请注意,您在问题中提到的一些工具可能会将自己的默认值强加给这些参数,例如将广告间隔更改为更大的值。因此,使用原始 HCI 命令启用广告也是最安全的,这很简单:

sudo hcitool -i hci0 cmd 0x08 0x000a 01 

为了完整起见,下面是一组使用供应商特定负载启动定向广告的命令(在本例中为 Apple,未经许可您显然不应使用它)。广告负载设置为 0x08 0x0008。

sudo hciconfig hci0 up 
sudo hcitool -i hci0 cmd 0x08 0x0008 0b 09 ff 4c 00 30 31 32 33 34 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
sudo hcitool -i hci0 cmd 0x08 0x0006 A0 00 A0 00 02 00 01 11 22 33 44 55 66 07 00 
sudo hcitool -i hci0 cmd 0x08 0x000a 01 

您可以在发出这些或任何其他命令时使用 btmon(BlueZ 附带)监控 HCI 接口(interface)。它可以很好地解析数据包,因此您可以轻松地看到编辑原始命令如何改变含义。它还会突出显示它注意到的任何损坏的 HCI 命令。