BLE 主从设备建立连接以后,先执行发现服务和特征的过程(Discovery Procedure),然后对着指定特征执行数据收发。
本文以一个Nordic LED Button服务为例(如下),介绍服务和特征发现过程的协议细节。
1. 发现服务
对于主机而言,首先找到目标服务的句柄范围,然后再在句柄范围内找下面的特征。
发现服务有两个方案:
发现全部服务
发现指定UUID的服务
1.1 发现全部服务
发现一个服务的基本思路是搜索Primary Service的UUID(0x2800),如果找到,即可获得它的句柄范围。
第一次我们从0x0001开始搜索,找到一个服务后,从该服务的句柄末尾开始继续搜索,可以找到第二个服务的句柄范围。
反复执行发现服务操作,就可以依次找到全部服务的句柄范围。
执行发现服务时,GATT协议层主机会产生一个请求(Read By Group Type Request),从机收到后返回一个响应(Read By Group Type Response)。
(为了说明一些问题,这个图片不对应上面的Nordic LED Button服务)
图中,请求包中包含了起始和末尾的句柄,第一次发现默认是0x0001~0xFFFF。
响应帧中包含了两个服务的UUID,代表它发现的两个服务。(为啥一次性发现两个?原因未知,它仅限于Generic Access和Generic Attribute)