【问题标题】:Bluez: Scanning and listing BLE profiles of devices before connection?Bluez:在连接之前扫描并列出设备的 BLE 配置文件?
【发布时间】:2022-11-03 13:25:43
【问题描述】:

我对蓝牙开发很陌生,但目前正在通过开发一些基本的 python 脚本来建立我的理解。 我正在使用 Bluez 5.58、python 3.9 和 dbus。

到目前为止,我能够扫描和连接到设备以及在连接后监控属性,我使用https://www.bluetooth.com/blog/the-bluetooth-for-linux-developers-study-guide/ 作为大部分项目的指南。

现在,我正在尝试找到一种方法来列出已发现设备的 BLE 配置文件,然后再决定在 cmdline 中连接到哪个设备,例如:

设备名称:[[BLEprofiles],bdaddr1]

设备名称:[[BLEprofiles],bdaddr2]

我对 BLE 配置文件很陌生,但据我了解,它们是“特定用例的标准服务集合”,描述了属性表的角色、要求和结构。 正如我发现的那样,使用 bluez 和 dbus 似乎没有任何直观的方法可以在连接之前列出配置文件并检查兼容性。 SDPtool 似乎对此很有用,但 Bluez 5+ 不支持。

我的第一个想法是使用标准的 SIG UUID (https://www.bluetooth.com/specifications/assigned-numbers/) 来匹配,但这似乎也需要与 bluez 和 dbus 连接。 在能够判断它是否适合用例之前必须连接到设备似乎是相当倒退的。例如,如果我想将手机连接到扬声器以播放音频但不知道扬声器的名称,我想查看哪些设备支持 A2DP 或类似的音频配置文件。

可以在不连接的情况下在 dbus/bluez 中列出 BLE 配置文件吗? 如果需要连接,实现列表的最佳方式是什么?

谢谢你的帮助!

【问题讨论】:

    标签: bluetooth bluetooth-lowenergy android-bluetooth dbus bluez


    【解决方案1】:

    当 BlueZ 发现新设备时,它会发送InterfacesAdded 信号。以下是包含具有 UUID f0cd1400-95da-4f4b-9ac8-aa55d312af0c 的自定义服务的设备的数据示例

    BlueZ 具有过滤在发现过程中找到的设备的功能。这些过滤器之一是广告服务 UUID。这是通过setDiscoveryFilter 方法完成的。

    这允许 BlueZ 要么只报告需要 UUID 的广告服务的设备,要么您可以查看所有设备上的服务 UUID 并从中选择一个设备。

    ‣ Type=signal  Endian=l  Flags=1  Version=1 Cookie=668
      Sender=:1.12  Path=/  Interface=org.freedesktop.DBus.ObjectManager  Member=InterfacesAdded
      UniqueName=:1.12
      MESSAGE "oa{sa{sv}}" {
              OBJECT_PATH "/org/bluez/hci0/dev_C7_18_1E_21_F4_87";
              ARRAY "{sa{sv}}" {
                      DICT_ENTRY "sa{sv}" {
                              STRING "org.freedesktop.DBus.Introspectable";
                              ARRAY "{sv}" {
                              };
                      };
                      DICT_ENTRY "sa{sv}" {
                              STRING "org.bluez.Device1";
                              ARRAY "{sv}" {
                                      DICT_ENTRY "sv" {
                                              STRING "Address";
                                              VARIANT "s" {
                                                      STRING "C7:18:1E:21:F4:87";
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "AddressType";
                                              VARIANT "s" {
                                                      STRING "random";
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Name";
                                              VARIANT "s" {
                                                      STRING "Aranet4 0578A";
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Alias";
                                              VARIANT "s" {
                                                      STRING "Aranet4 0578A";
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Paired";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Trusted";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Blocked";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "LegacyPairing";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "RSSI";
                                              VARIANT "n" {
                                                      INT16 -71;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Connected";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "UUIDs";
                                              VARIANT "as" {
                                                      ARRAY "s" {
                                                              STRING "f0cd1400-95da-4f4b-9ac8-aa55d312af0c";
                                                      };
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "Adapter";
                                              VARIANT "o" {
                                                      OBJECT_PATH "/org/bluez/hci0";
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "ManufacturerData";
                                              VARIANT "a{qv}" {
                                                      ARRAY "{qv}" {
                                                              DICT_ENTRY "qv" {
                                                                      UINT16 1794;
                                                                      VARIANT "ay" {
                                                                              ARRAY "y" {
                                                                                      BYTE 33;
                                                                                      BYTE 4;
                                                                                      BYTE 4;
                                                                                      BYTE 0;
                                                                                      BYTE 0;
                                                                                      BYTE 9;
                                                                                      BYTE 15;
                                                                              };
                                                                      };
                                                              };
                                                      };
                                              };
                                      };
                                      DICT_ENTRY "sv" {
                                              STRING "ServicesResolved";
                                              VARIANT "b" {
                                                      BOOLEAN false;
                                              };
                                      };
                              };
                      };
                      DICT_ENTRY "sa{sv}" {
                              STRING "org.freedesktop.DBus.Properties";
                              ARRAY "{sv}" {
                              };
                      };
              };
      };
    

    【讨论】:

    • 是的,这有效!似乎我只需要退后一步思考基本原理,而不会迷失在蓝牙迷宫中!非常感谢 :)