我是 BLE/蓝牙的初学者。我正在尝试与启用 BLE 的设备进行通信,该设备使用 CH9141K BLE 转串行桥。我已经让我的主机应用程序使用 python 的 bleak 库成功与设备通信。
到目前为止,我通过 MAC 或本地名称(或 MacOS 上的 uuid)连接直接联系设备,工作正常。
我现在想要扫描设备,因为用户很可能不知道设备的 MAC 或本地名称。 (MacOS隐藏MAC,本地名称可以更改。)
python3 discover.py
(来自 bleak 包的示例)报告了这一点:
AdvertisementData(local_name='device ', manufacturer_data={51212: b'1\x00\x00\x00\x00\x00'}, tx_power=0, rssi=-53)
我有点困惑,BLE 设备不是必须宣传它提供的服务吗?我将其与 MicroPython aioble 库 (temp_sensor.py) 中的示例进行了比较,该库返回其提供的服务的 service_uuids。
我的计划是首先尽可能高效地发现 CH9141K 设备,然后监听每个设备是否返回对我正在寻找的设备有效的数据包。
如果我使用
service_explorer.py
(再次,来自惨淡的例子)我得到:
2024-08-21 17:31:21,970 __main__ INFO: connecting to device...
2024-08-21 17:31:23,641 __main__ INFO: connected
2024-08-21 17:31:23,641 __main__ INFO: [Service] 0000180a-0000-1000-8000-00805f9b34fb (Handle: 14): Device Information
2024-08-21 17:31:23,686 __main__ INFO: [Characteristic] 00002a23-0000-1000-8000-00805f9b34fb (Handle: 15): System ID (read), Value: bytearray(b'\x13\xdey\x00\x00\x10S\\')
2024-08-21 17:31:23,716 __main__ INFO: [Characteristic] 00002a24-0000-1000-8000-00805f9b34fb (Handle: 17): Model Number String (read), Value: bytearray(b'CH9141')
2024-08-21 17:31:23,746 __main__ INFO: [Characteristic] 00002a25-0000-1000-8000-00805f9b34fb (Handle: 19): Serial Number String (read), Value: bytearray(b'190420000000')
2024-08-21 17:31:23,791 __main__ INFO: [Characteristic] 00002a26-0000-1000-8000-00805f9b34fb (Handle: 21): Firmware Revision String (read), Value: bytearray(b'VER1.0')
2024-08-21 17:31:23,821 __main__ INFO: [Characteristic] 00002a27-0000-1000-8000-00805f9b34fb (Handle: 23): Hardware Revision String (read), Value: bytearray(b'VER1.0')
2024-08-21 17:31:23,851 __main__ INFO: [Characteristic] 00002a28-0000-1000-8000-00805f9b34fb (Handle: 25): Software Revision String (read), Value: bytearray(b'VER1.0')
2024-08-21 17:31:23,895 __main__ INFO: [Characteristic] 00002a29-0000-1000-8000-00805f9b34fb (Handle: 27): Manufacturer Name String (read), Value: bytearray(b'WCH')
2024-08-21 17:31:23,925 __main__ INFO: [Characteristic] 00002a50-0000-1000-8000-00805f9b34fb (Handle: 29): PnP ID (read), Value: bytearray(b'\x019\x07\x00\x00\x10\x01')
2024-08-21 17:31:23,938 __main__ INFO: [Service] 0000fff0-0000-1000-8000-00805f9b34fb (Handle: 31): Vendor specific
2024-08-21 17:31:24,001 __main__ INFO: [Characteristic] 0000fff1-0000-1000-8000-00805f9b34fb (Handle: 32): Vendor specific (read,notify), Value: bytearray(b'')
2024-08-21 17:31:24,031 __main__ INFO: [Descriptor] 00002902-0000-1000-8000-00805f9b34fb (Handle: 34): Client Characteristic Configuration, Value: bytearray(b'')
2024-08-21 17:31:24,061 __main__ INFO: [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 35): Characteristic User Description, Value: bytearray(b'UART DATA')
2024-08-21 17:31:24,061 __main__ INFO: [Characteristic] 0000fff2-0000-1000-8000-00805f9b34fb (Handle: 36): Vendor specific (write-without-response,write), Max write w/o rsp size: 197
2024-08-21 17:31:24,121 __main__ INFO: [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 38): Characteristic User Description, Value: bytearray(b'BLE DATA')
2024-08-21 17:31:24,151 __main__ INFO: [Characteristic] 0000fff3-0000-1000-8000-00805f9b34fb (Handle: 39): Vendor specific (read,write,notify), Value: bytearray(b'')
2024-08-21 17:31:24,181 __main__ INFO: [Descriptor] 00002902-0000-1000-8000-00805f9b34fb (Handle: 41): Client Characteristic Configuration, Value: bytearray(b'')
2024-08-21 17:31:24,211 __main__ INFO: [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 42): Characteristic User Description, Value: bytearray(b'BLE CONFIG')
2024-08-21 17:31:24,211 __main__ INFO: [Service] 0000ffe0-0000-1000-8000-00805f9b34fb (Handle: 43): Vendor specific
2024-08-21 17:31:24,211 __main__ INFO: [Characteristic] 0000ffe1-0000-1000-8000-00805f9b34fb (Handle: 44): Vendor specific (notify)
2024-08-21 17:31:24,241 __main__ INFO: [Descriptor] 00002902-0000-1000-8000-00805f9b34fb (Handle: 46): Client Characteristic Configuration, Value: bytearray(b'')
2024-08-21 17:31:24,271 __main__ INFO: [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 47): Characteristic User Description, Value: bytearray(b'UART DATA')
2024-08-21 17:31:24,271 __main__ INFO: [Characteristic] 0000ffe2-0000-1000-8000-00805f9b34fb (Handle: 48): Vendor specific (write-without-response,write), Max write w/o rsp size: 197
2024-08-21 17:31:24,301 __main__ INFO: [Descriptor] 00002901-0000-1000-8000-00805f9b34fb (Handle: 50): Characteristic User Description, Value: bytearray(b'BLE DATA')
2024-08-21 17:31:24,301 __main__ INFO: disconnecting...
2024-08-21 17:31:24,303 __main__ INFO: disconnected
...尽管这会连接到设备以迭代服务。
所以问题是,如何有效地过滤提供特定服务的设备,或者是否可以连接到所有发现的设备进行快速浏览?或者我在 BLE/Bleak 中缺少一个选项吗?我至少需要知道我正在处理 CH9141 设备,最好看看它也提供服务 0xFFF0。连接后这两个都很容易找到。
此设备仅通告 DIS,几乎每个设备都会通告 DIS,并且它通过使用未分配的 16 位服务 ID 违反了规范。他们选择了 0xFFF0 和 0xFFE0,我想只是希望他们不会与任何人相撞……这不是很稳健,但如果他们的范围非常短,我相信他们几乎总是能逃脱惩罚,这就是为什么他们这样做而不是支付获得自己的标识符所需的费用。但这并不是设备的具体标识。
通常,在搜索此类设备时,您会查看其广告,看看它是否可能是您想要的设备,然后连接以验证可能的设备。连接后,CBPeripheral ID 将非常稳定(我见过它们发生变化,但很少见),因此您将来可以使用它。
这种启发式、多步骤的方法非常常见。即使我控制设备固件并且可以将我想要的任何内容放入广告包中,我也做到了。