You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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没有把这个服务加载到自己的管理列表里。

解决步骤

  1. 重新连接设备,强制刷新服务列表
    先断开设备连接,再重新连接,连接后切换到GATT菜单再查看属性:
bluetoothctl
disconnect 64:B7:08:3C:1E:E2
connect 64:B7:08:3C:1E:E2
menu gatt
list-attributes

重新连接时Bluez会重新扫描设备的GATT服务,大概率能找到00002a00这个UUID。

  1. 手动强制扫描所有服务
    如果重新连接无效,用discover-services命令让Bluez主动请求设备的所有GATT服务:
bluetoothctl
connect 64:B7:08:3C:1E:E2
menu gatt
discover-services
list-attributes

这个命令会绕过缓存,直接从设备获取完整的服务列表。

  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:15:57