你有没有遇到过这种情况:新买的智能手环连不上手机,或者蓝牙耳机突然断连,重连后功能不全?很多时候问题不在硬件本身,而是出在蓝牙连接过程中的 GATT 配置环节。
什么是GATT?它为什么重要
GATT 全称是 Generic Attribute Profile(通用属性协议),是低功耗蓝牙(BLE)设备之间传输数据的核心机制。当你用手机连上一个智能体重秤,读取你的体脂数据,背后就是 GATT 在工作。它定义了数据如何组织、如何被读取或写入。
简单来说,GATT 把通信过程结构化:服务(Service)包含特征(Characteristic),每个特征可以有值和操作方式(比如只读、可写、支持通知)。比如心率计会有一个“心率测量”服务,里面有个可通知的特征,用来实时推送心跳数值。
连接时发生了什么
当你的手机搜索到一个 BLE 设备并点击连接,第一步是建立链路层连接,接着进入 GATT 发现阶段。这时候手机会主动“探查”设备暴露了哪些服务和特征。这个过程叫 Service Discovery,是 GATT 配置的基础。
如果这一步出错,比如设备没有正确声明服务 UUID,或者响应超时,手机就无法识别设备功能,看起来就像连上了却不能用。
常见配置问题与代码示意
开发中常见的坑是服务 UUID 写错。比如本该使用标准的心率服务 UUID 0x180D,结果误写成自定义的,导致客户端无法识别。
下面是一个典型的 GATT 服务声明片段,使用的是常见的嵌入式 BLE 协议栈:
{
"services": [
{
"uuid": "0x180F",
"characteristics": [
{
"uuid": "0x2A19",
"properties": ["read", "notify"],
"value": "35"
}
]
}
]
}
这段代码描述的是电池服务(Battery Service),其中特征 0x2A19 表示当前电量百分比。如果手机端没有正确订阅 notify 属性,就收不到电量变化的通知。
实际调试建议
普通用户遇到连接异常,可以尝试关闭再打开蓝牙,或者清除设备配对记录重新连接。这相当于重置 GATT 缓存,避免旧的错误配置残留。
开发者则推荐使用抓包工具,比如 nRF Sniffer,观察 GATT 交互流程是否完整。重点看服务发现阶段有没有返回预期的服务列表,写操作是否有正确的响应码。
有时候设备固件更新后服务结构变了,但手机 App 还按老方式请求,就会出现“连得上,读不了数据”的情况。这时候需要双方同步更新通信协议。