BLE中GATT的服务和特征发现机制
BLE中GATT的服务和特征发现机制
在BLE中,GATT客户端发现服务端服务的过程与经典蓝牙不同,经典蓝牙会有专门的SDP协议来完成。而BLE中,这个过程会直接在GATT层完成。直接在GATT层完成服务和特征的发现。
相关ATT的协议
GATT层协议基于ATT协议,因此一些Attribute的读写也是用的ATT层的接口,这里先介绍下和服务特征发现有关的ATT层接口
- Read By Type Request
- Read By Type Response
上述的req和resp是通过attribute Type(也就是UUID)来获取Attribute。
- Read by Group Type Request
- Read by Group Type Response
上述的req和resp是通过attribute group Type(也是UUID)来获取Attribute。这里通用的type和group type没有太大差别,只是在后面GATT中一个用于服务发现,一个用于特征发现。
更多关于ATT层协议PDU类型的说明请参考BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 3, Part F 3.4 ATTRIBUTE PROTOCOL PDUS
服务发现
到了GATT层,当主从设备完成基本的连接,和MTU交换后便由客户端发起服务发现过程。该过程如上图所示,客户端启动《主要服务发现》过程,向服务端询问所有的服务。服务端随后将自己主要服务的UUID返回给客户端。随后客户端继续询问,直到服务端将所有服务的UUID都返回给客户端,这是客户端再询问服务端就直接返回Error Respond终止该过程。
特征发现
特征发现的过程和服务发现过程类似
上述为服务和特征的主要的发现过程,另外还有一些辅助流程。这里不作过多说明,详情可以阅读spec原文BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 3, Part G 4.4 PRIMARY SERVICE DISCOVERY
抓包
为了更直观的了解服务和特征的发现过程,如下是蓝牙抓包演示。
服务发现
- request
可以看到,服务发现是直接从handle1到max handle。
- respond
随后返回通用的GAP 服务
特征发现
特征发现和服务发现类似
- request
- respond