Bluez Blotoothctl 扫描与 hcitool 扫描

Chr*_*sby 1 linux hci bluetooth-lowenergy raspbian bluez

我在 Raspberry Pi(Buster 和 Stretch)上运行 bluez 5.50。我有一个 ble 传感器设备,只有在按下传感器设备上的按钮时才会公布数据。所以广告是异步的,中间没有周期性的广告(并且所有数据包都是唯一的,没有重复)。我遇到了 Bluez 的问题,尽管一旦收到数据包,Bluez 似乎在接下来的大约 11 秒内不会报告来自设备的任何其他数据包(偶尔间隔会更短)。这是使用 bluetoothctl 行命令工具以及我自己的 c++ 应用程序(基于 bluez client/main.c 示例)。在这两种情况下,在开始扫描之前,我都会清除扫描过滤器,将传输设置为 le,并将重复数据报告设置为打开。反过来,运行 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 scan,则您正在选择蓝牙经典(不是低能量数据包)。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 vs hci

您能否提供使用bluetoothctl的代码,即:

$bluetoothctl
[bluetooth]# menu scan
[bluetooth]# clear
[bluetooth]# transport le
[bluetooth]# duplicated-data on
[bluetooth]# back
[bluetooth]# scan on
Run Code Online (Sandbox Code Playgroud)

总是如你所见...

能否也提供下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)
Run Code Online (Sandbox Code Playgroud)

下面是一个大约 20 秒的扫描(编辑掉所有不相关的数据包),我大约每 2 秒按下传感器上的按钮,然后再按住 2 秒,然后再松开。第一个块来自 bluetoothctl,第二个来自“hcidump --raw”(在第二个树莓派上)。bluetoothctl 数据包数据中的前四个字节是一个小端数据包序列号,由传感器为每个新数据包递增。下一个字节表示按钮向上/向下操作。您可以看到 bluetoothctl 报告的数据包编号为 05df、05e5、05e9。在原始转储中,序列号位于顶行的末尾。在那里你可以看到所有的数据包都是有序的,报告了 1 到 3 次(我假设它正在报告它捕获的所有广告渠道)。在 hcidump 扫描中,所有数据包都在 05df 到 05e9 之间。


------ 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)

Run Code Online (Sandbox Code Playgroud)

小智 5

您是否尝试过下载最新的 bluez (5.53) https://git.kernel.org/pub/scm/bluetooth/bluez.git

你在用hcitool scan还是sudo hcitool lescan?如果您正在跑步hcitool scan,则您正在使用蓝牙经典(不是低能量数据包)。hcitool是一个不推荐使用的工具。我发现sudo hcitool lescan它只适用于 BLE 4.x 控制器。该功能在 5.x 控制器上失败。

您是否尝试sudo btmon在扫描期间运行以查看所有 HCI 通信?

您能否提供使用 的代码bluetoothctl,即:

$bluetoothctl
[bluetooth]# menu scan
[bluetooth]# clear
[bluetooth]# transport le
[bluetooth]# duplicated-data on
[bluetooth]# back
[bluetooth]# scan on
Run Code Online (Sandbox Code Playgroud)

你能不能也提供一下结果 hciconfig -a