为何gatttool可读取Bluetti D100P的UUID而bluetoothctl无法读取?
问题描述
我正尝试使用bluetti_mqtt连接我的Bluetti D100P,但该工具无法找到设备名称,因此我怀疑设备使用了其他UUID。在Ubuntu 22.04系统下,我使用bluetoothctl查找UUID 00002a00-0000-1000-8000-00805f9b34fb,执行list-attributes和attribute-info命令均未找到该属性,输出如下:
[D100P2431000175773:/service0001/char0002]# list-attributes Primary Service (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0001 00001801-0000-1000-8000-00805f9b34fb Generic Attribute Profile Characteristic (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0001/char0002 00002a05-0000-1000-8000-00805f9b34fb Service Changed Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0001/char0002/desc0004 00002902-0000-1000-8000-00805f9b34fb Client Characteristic Configuration Primary Service (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028 0000ff00-0000-1000-8000-00805f9b34fb Unknown Characteristic (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0029 0000ff01-0000-1000-8000-00805f9b34fb Unknown Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0029/desc002b 00002901-0000-1000-8000-00805f9b34fb Characteristic User Description Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0029/desc002c 00002902-0000-1000-8000-00805f9b34fb Client Characteristic Configuration Characteristic (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char002d 0000ff02-0000-1000-8000-00805f9b34fb Unknown Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char002d/desc002f 00002901-0000-1000-8000-00805f9b34fb Characteristic User Description Characteristic (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0030 0000ff03-0000-1000-8000-00805f9b34fb Unknown Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0030/desc0032 00002901-0000-1000-8000-00805f9b34fb Characteristic User Description Descriptor (Handle 0x0000) /org/bluez/hci0/dev_64_B7_08_3C_1E_E2/service0028/char0030/desc0033 00002902-0000-1000-8000-00805f9b34fb Client Characteristic Configuration [D100P2431000175773:]# attribute-info 00002a00-0000-1000-8000-00805f9b34fb Attribute 00002a00-0000-1000-8000-00805f9b34fb not available
但使用gatttool连接设备后,却能找到该UUID并读取其值,输出如下:
gatttool -b 64:B7:08:3C:1E:E2 -I [64:B7:08:3C:1E:E2][LE]> connect Attempting to connect to 64:B7:08:3C:1E:E2 [64:B7:08:3C:1E:E2][LE]> characteristics handle: 0x0002, char properties: 0x20, char value handle: 0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a01-0000-1000-8000-00805f9b34fb handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a04-0000-1000-8000-00805f9b34fb handle: 0x001b, char properties: 0x02, char value handle: 0x001c, uuid: 00002aa6-0000-1000-8000-00805f9b34fb handle: 0x0029, char properties: 0x12, char value handle: 0x002a, uuid: 0000ff01-0000-1000-8000-00805f9b34fb handle: 0x002d, char properties: 0x0e, char value handle: 0x002e, uuid: 0000ff02-0000-1000-8000-00805f9b34fb handle: 0x0030, char properties: 0x12, char value handle: 0x0031, uuid: 0000ff03-0000-1000-8000-00805f9b34fb [64:B7:08:3C:1E:E2][LE]> char-read-uuid 00002a00-0000-1000-8000-00805f9b34fb handle: 0x0016 value: 44 31 30 30 50 32 34 33 31 30 30 30 31 37 35 37 37 33
请问为何gatttool可以读取该UUID,而bluetoothctl却无法找到?我是否遗漏了某些操作步骤?
解答
核心原因
bluetoothctl和gatttool的工作逻辑本质不同:
gatttool是直接与蓝牙设备底层通信,会主动扫描设备的所有GATT属性,不依赖Bluez守护进程的缓存或已发现服务列表;bluetoothctl依赖Bluez(bluetoothd)已经发现并加载到管理列表的服务,而Bluez默认可能不会自动发现某些标准服务(比如00002a00对应的设备名称服务),或者缓存的服务列表不全。
从你的gatttool输出能看到,00002a00属于未被bluetoothctl列出的服务(对应handle 0x0015的特征),说明Bluez没有把这个服务加载到自己的管理列表里。
解决步骤
- 重新连接设备,强制刷新服务列表
先断开设备连接,再重新连接,连接后切换到GATT菜单再查看属性:
bluetoothctl disconnect 64:B7:08:3C:1E:E2 connect 64:B7:08:3C:1E:E2 menu gatt list-attributes
重新连接时Bluez会重新扫描设备的GATT服务,大概率能找到00002a00这个UUID。
- 手动强制扫描所有服务
如果重新连接无效,用discover-services命令让Bluez主动请求设备的所有GATT服务:
bluetoothctl connect 64:B7:08:3C:1E:E2 menu gatt discover-services list-attributes
这个命令会绕过缓存,直接从设备获取完整的服务列表。
- 调整Bluez配置,优化服务发现
修改/etc/bluetooth/main.conf配置文件,确保以下设置:
AutoEnable=true DiscoverableTimeout=0
然后重启Bluez服务:
sudo systemctl restart bluetooth
这个配置能让Bluez更积极地发现和加载设备的GATT服务。
针对bluetti_mqtt的额外说明
bluetti_mqtt找不到设备名称,大概率是因为它依赖Bluez的服务列表。按照上面的步骤让Bluez加载00002a00服务后,工具应该就能正常读取设备名称了。如果还是不行,你可以手动指定设备的MAC地址或UUID给bluetti_mqtt,绕过名称查找的步骤。
内容的提问来源于stack exchange,提问作者Martin Bo
相关产品推荐
相关产品推荐

