在收发数据的时候 notify 发送数据的API返回值是发送成功,使用抓包器监听空中的数据包也确认数据发送了,但是APP始终没有收到notify的数据。
handle 是什么?
handle 本质:GATT 属性表里的对应uuid的编号,用于对应uuid。
BLE 设备作为 GATT Server 时,内部维护一张 Attribute Table。
表里每一行就是一个 Attribute,通常包含四部分:
Handle:2 字节,0x0001 ~ 0xFFFF,是这一行属性的唯一地址。
Type:UUID,说明这个属性是什么类型。
Value:实际数据。
Permissions:访问权限,比如是否允许读/写。
你可以把它理解成一张数据库表,如下:
| Handle | Type | Value | Permissions |
|---|---|---|---|
| 0x0010 | Service Declaration | 电池服务 UUID | 可读 |
| 0x0011 | Characteristic Declaration | 属性 + Value Handle | 可读 |
| 0x0012 | Characteristic Value | 当前电量 | 可读/Notify |
| 0x0013 | CCCD | 订阅状态 | 可写 |
UUID 告诉客户端“这是什么”,Handle 告诉协议栈“去操作哪一行”。ATT 报文里真正用来寻址的就是 Handle,而不是 UUID,并且一个完整的 特征值会占好几个 handle。上面的
Characteristic Declaration Handle
UUID = 0x2803
它的作用是声明这个特征有哪些属性,比如 Read、Write、Notify、Indicate。
Characteristic Value Handle
这是真正存数据的地方。
Read、Write、Notify、Indicate 操作的对象都是这个 Handle。
CCCD Handle
UUID = 0x2902
它不是数据本身,而是“订阅开关”,即使能/关闭CCCD
如何确认handle?
蓝牙分析仪
最快也是最方便的方法就是使用蓝牙分析仪抓包看看,只要连接成功后就可以查看到对应的Handle.
直接数
例程内notify的handle是Attribute表内的第11个