我在 Raspberry Pi(Buster 和 Stretch)上运行 bluez 5.50。我有一个 ble 传感器设备,仅当按下传感器设备上的按钮时才会公布数据。因此,广告是异步的,并且中间没有定期广告(并且所有数据包都是唯一的,没有重复)。我在使用 Bluez 时遇到了问题,一旦收到数据包,Bluez 似乎在接下来的大约 11 秒内不会报告来自设备的任何其他数据包(偶尔间隔会更短)。这是使用 bluetoothctl 线路命令工具以及我自己的 C++ 应用程序(基于 bluez client/main.c 示例)。在这两种情况下,在开始扫描之前,我都会清除扫描过滤器,将传输设置为文件,并将重复数据报告设置为打开。相反,当运行 hcitool scan 时,我看到来自传感器的所有数据包(它甚至似乎报告了在不同广告频道上广播的所有 3 个副本)。所以我的问题是,有没有办法通过 dbus api 获取那些丢失的广告,可能在某处进行一些额外的设置?如果没有,hci api 可以从 c++ 使用吗?它应该可以解决问题吗?任何帮助表示感谢,谢谢!
根据亚历克斯的问题编辑 -
您是否尝试过下载最新的bluez(5.53)https://git.kernel.org/pub/scm/bluetooth/bluez.git ?
还没有,只是想检查一下这是否是事先已知的。
您使用的是 hcitool scan 还是 sudo hcitool lescan?如果您正在运行 hcitool 扫描,您将拾取经典蓝牙(不是低能量数据包)。 hcitool 是一个已弃用的工具。我发现 sudo hcitool lescan 仅适用于 BLE 4.x 控制器。该功能在 5.x 控制器上失败。
hcitool lescan(在 root 下),是的,硬件是 Pi Zero/W 和 P3 所以 BLE 4.x 控制器(我假设)
您是否尝试过运行 sudo btmon 来查看扫描期间的所有 HCI 通信?
我有,但记不清我看到了什么,除了它与其他任何内容都不矛盾,即丢失数据包 w/ dbus api 与 hci
您能否提供使用bluetoothctl的代码,即:
$bluetoothctl
[bluetooth]# menu scan
[bluetooth]# clear
[bluetooth]# transport le
[bluetooth]# duplicated-data on
[bluetooth]# back
[bluetooth]# scan on
总是和你注意到的一模一样...
您还可以提供 hciconfig -a 的结果吗
--- Results (P Zero) -
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:79:2E:3F ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:55476 acl:126 sco:0 events:2012 errors:0
TX bytes:6956 acl:114 sco:0 commands:444 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'HubPi01'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x168
LMP Version: 4.1 (0x7) Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)
--- Results (P3) -
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:2B:A2:A3 ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:10995 acl:0 sco:0 events:390 errors:0
TX bytes:2145 acl:0 sco:0 commands:91 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'HubPi02'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x168
LMP Version: 4.1 (0x7) Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)
下面是大约 20 秒的扫描(编辑掉所有不相关的数据包),
我大约每 2 秒按下传感器上的按钮,然后
再按住 2 秒钟,然后松开。第一个块
来自bluetoothctl,第二个来自“hcidump --raw”(在第二个树莓派上)。前四个字节
在bluetoothctl数据包数据是一个小端数据包序列号
传感器为每个新数据包递增。下一个字节表示
按钮向上/向下操作。可以看到bluetoothctl报告的数据包编号为05df,
05e5、05e9。在原始转储中,序列号位于顶行的末尾。那里
你可以看到所有数据包都按顺序报告了 1 到 3 次(我假设是
报告它捕获的所有广告渠道)。所有数据包均存在 05df 至
hcidump 扫描中的 05e9。最后是“hcitool lescan --duplicates”的输出,
我不太确定它是如何映射的......
------ bluetoothctl
.
[NEW] Device E2:15:00:01:73:96 E2-15-00-01-73-96
[CHG] Device E2:15:00:01:73:96 RSSI: -46
[CHG] Device E2:15:00:01:73:96 ManufacturerData Key: 0x03da
[CHG] Device E2:15:00:01:73:96 ManufacturerData Value:
df 05 00 00 10 a1 ac 8a b4 .........
[CHG] Device E2:15:00:01:73:96 RSSI: -45
[CHG] Device E2:15:00:01:73:96 ManufacturerData Key: 0x03da
[CHG] Device E2:15:00:01:73:96 ManufacturerData Value:
e5 05 00 00 10 e7 4f 67 6e ......Ogn
.
[CHG] Device E2:15:00:01:73:96 RSSI: -65
[CHG] Device E2:15:00:01:73:96 ManufacturerData Key: 0x03da
[CHG] Device E2:15:00:01:73:96 ManufacturerData Value:
e9 05 00 00 10 f4 f9 f8 7d ........}
---------- hcidump --raw
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 DF 05
00 00 10 A1 AC 8A B4 C3
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 DF 05
00 00 10 A1 AC 8A B4 BE
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E0 05
00 00 11 11 0F 3E 24 B6
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E1 05
00 00 10 F7 68 07 50 BE
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E1 05
00 00 10 F7 68 07 50 CF
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E1 05
00 00 10 F7 68 07 50 BA
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E2 05
00 00 11 1D 18 A8 2A BF
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E2 05
00 00 11 1D 18 A8 2A C0
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E2 05
00 00 11 1D 18 A8 2A B8
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E3 05
00 00 10 E2 29 C7 F7 BB
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E4 05
00 00 11 57 F0 5C 76 BD
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E4 05
00 00 11 57 F0 5C 76 C1
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E5 05
00 00 10 E7 4F 67 6E CA
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E6 05
00 00 11 77 63 92 CE C0
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E6 05
00 00 11 77 63 92 CE BA
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E6 05
00 00 11 77 63 92 CE BE
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E7 05
00 00 10 2D 52 48 C2 BD
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E8 05
00 00 11 EE 32 20 9D BD
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E8 05
00 00 11 EE 32 20 9D C1
> 04 3E 19 02 01 03 01 96 73 01 00 15 E2 0D 0C FF DA 03 E9 05
00 00 10 F4 F9 F8 7D BC
------- hcitool lescan --duplicates
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)
E2:15:00:01:73:96 (unknown)