【问题标题】:Bluez blotoothctl scan vs hcitool scanBluez blotoothctl 扫描与 hcitool 扫描
【发布时间】:2020-06-04 17:07:16
【问题描述】:

我在 Raspberry Pi(Buster 和 Stretch)上运行 bluez 5.50。我有一个 ble 传感器设备,仅在按下传感器设备上的按钮时才发布数据。所以广告是异步的,中间没有周期性的广告(所有数据包都是唯一的,没有重复)。我遇到了 Bluez 的问题,尽管一旦收到数据包,Bluez 似乎在接下来的大约 11 秒内没有报告来自设备的任何其他数据包(偶尔间隔更短)。这是使用 bluetoothctl line 命令工具以及我自己的 c++ 应用程序(基于 bluez client/main.c 示例)。在这两种情况下,在开始扫描之前,我都会清除扫描过滤器,将传输设置为 le,并设置重复数据报告。相反,当运行 hcitool scan 时,我会看到来自传感器的所有数据包(它甚至似乎报告了在不同广告频道上广播的所有 3 个副本)。所以我的问题是,有没有办法通过 dbus api 获取那些丢失的广告,可能在某处进行一些额外的设置?如果没有,hci api 是否可以从 c++ 中使用,它应该起到作用吗?任何帮助表示赞赏,谢谢!

根据 Alex 的问题进行了编辑 -

你试过下载最新的 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(在根目录下),是的,硬件是 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

始终如您所说...

能否也提供 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 数据包中的数据是一个 little endian packet seq number 由传感器为每个新数据包递增。下一个字节表示一个 按钮向上/向下动作。您可以看到 bluetoothctl 报告的数据包编号为 05df, 05e5,05e9。在原始转储中,序列号位于顶行的末尾。那里 你可以看到所有的数据包都是有序的,报告了 1 到 3 次(我假设它是 报告它捕获的所有广告渠道)。所有数据包都存在 05df 到 05e9 在 hcidump 扫描中。最后是“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)

【问题讨论】:

    标签: linux bluetooth-lowenergy raspbian bluez hci


    【解决方案1】:

    你试过下载最新的 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
    

    能否也提供hciconfig -a的结果

    【讨论】:

    • 根据您的问题更新了原始帖子,谢谢!
    【解决方案2】:

    使用 BlueZ D-Bus API 处理重复的广告数据是一个持续的传奇,由于涉及内核和用户空间这一事实而变得复杂。 BlueZ 开发者邮件列表上的以下线程可能提供了最好的见解:https://marc.info/?l=linux-bluetooth&m=158225950522806&w=2

    在扫描信标时,我一直在使用 D-Bus API 的解决方法是,一旦我获得了来自它的数据,就发送到 remove the device。我似乎不会以这种方式错过数据。由于我没有连接到信标,因此我无需担心丢失该设备的配对数据。

    附带说明一下,hciconfig、hcitool 和 hcidump 等工具在 2017 年是 deprecated

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 2021-06-02
      • 2011-06-28
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2012-04-21
      • 2011-01-14
      相关资源
      最近更新 更多