本文以 BLE Central 工程为例,解析 CH592 作为主机时是如何发现从机的服务和特征值。

一个Gatt包含多个服务(Service);一个服务包含多个特征(Characteristic);一个特征包含多个描述符;

Service、Characteristic、Descriptor,这三部分都由UUID作为唯一标示符。

Service中的Characteristic是手机与BLE终端交换数据的关键。

蓝牙连接成功之后,数据的传输是对特征值(Characteristic)这个参数进行读,写,通知等操作;

为了方便管理,我们可能有不止一个特征值,我们可以根据需要创建多个特征值,比如一个特征值是记录环境温度的值,一个特征值是记录设备的温度值,等等。为了说明方便,每个特征值都有他的属性,所以我们还会见到其他一些描述,例如权限(permission),值(value),描述(descriptor)。

1、多个特征值句柄如何发现

主机通过“从机服务的 UUID”发现从机相对应的服务,再通过分别发送“特征值的 UUID”
依次获取到特征值句柄。
由于有些特征值句柄是获取不到的(只写属性的无法读取到句柄 handle值)。

 2、如何获取 无法通过主动获取的方式获得特征值句柄

例如 char3 的特征值句柄获取不到,我们可以通过获取到 char1 的特征值句柄,再进行偏移
计算获得 char3 的特征值句柄。
假设 char1 的特征值句柄是 0x23,通过查询属性表可知 char1 的 value 位置与 char3 的 value
位置相差 6,则 char3 的特征值句柄=0x23+6=0x29。

 

 通过查询属性表可知 char4 的 configuration位置与 char1 的 value
位置相差 10,则 char4 的特征值句柄=0x23+6=0x2d,也可以与上图对应。