下面这个图是BLE协议各层跟医院的各个科室的类比图:
跟医院类比,ATT层就是化验室,通过它可以得到各种检查结果──属性。这些检查结果之间有什么联系,它们组合起来体现了什么,化验室是不知道的,这些得由上层来负责。
通过ATT层可以读写对端设备的属性,但是属性之间有什么联系、各个属性怎么组合起来提供服务,由上层GATT负责。
读写对端设备的属性,就是ATT的关键词。
一、属性(Attribute)
属性结构如下:
属性就是一个值,
有那么多属性,这是哪一个属性?用Handle来表示;
这个属性是什么类型?是心跳、还是电量?用UUID来表示。
UUID可以用16位、32位、128位来表示(在BLE中只使用16位或128位),有一个转换公式:
即把32位UUID的低96位去掉,就得到32位的UUID;如果32位UUID的高16位全是0,那么它的低16位就是“16位的UUID”:
UUID可以取蓝牙组织规定的值,也可以自己定义。这些规定的值可参考以下链接:
https://www.jianshu.com/p/08f76e4fd811 // 整理了所有的UUID,存为GATT_UUID.pdf
https://www.bluetooth.com/specifications/assigned-numbers/
https://www.bluetooth.com/specifications/assigned-numbers/service-discovery/
https://www.bluetooth.com/specifications/gatt/declarations/
二、属性的读写
ATT层负责去获得对端设备的属性,去读写对端设备的属性,如何读取对端设备的属性呢?有下面6中操作
ATT层涉及两个角色:client、server。server这边提供属性,client可以从server这边读写属性
三、ATT层的数据格式
ATT层构造好数据后,由下层的L2CAP发给对端设备。L2CAP层是收发室,它怎么知道这些数据是发给对端设备的ATT层?
对于ATT层的数据,L2CAP层会设置chinnel ID为4: