BLE中GATT的服务和特征发现机制

发布时间 2023-08-15 10:38:17作者: 不回本不改名

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