前言

对于Android开发Ble(低功耗)就要和GATT打交道了,那GATT是什么,假如你去查阅资料会发现还有个ATT,然后有不少晦涩的文字描述,不小心就绕进去了。在Ble通讯中,必然有中心设备(主设备)和外围设备(从设备),就是这两个家伙做交流了,一切围绕这二者,但是在此不做晦涩的具体的描述,一方面是自己总结记录,另一方面是分享交流,如有错误之处望各位指出。

 

一、GATT层次结构

android蓝牙 apple android蓝牙通信协议_特征值

先上一张图,刚接触的会想这什么玩意儿,待我细细道来。首先GATT协议是一个树状结构,最顶层是Profile;第二层是Service,Profile里面有多个Service;第三层是Characteristic,一个Service也可包含多个Characteristic;第四层就是Characteristic内部结构了,包含着一个Properti、一个Value、一个或多个Descriptor。到此就有个大致的层次结构了,有了这个概念才好往下深入。

 

二、成员作用职责

1、Profile

Profile规格规定了交换配置文件数据的架构。此架构定义了配置文件所用的基本元素,例如服务和特征。该层级的最高层是配置文件(profile)。配置文件由实现用例所需的一个或多个服务组成。服务由特征或有关其它服务的引用组成。每一个特征包括一个值,还可能包括有关该值的可选信息。服务、特征以及特征的组件(即特征值和特征描述符)构成了配置文件数据,并全部存储在服务器的属性中。没错,上面这是摘抄的,说简单点就是协议规范,各个蓝牙兼容都靠这个规范,使用标准的Profile就不需要过多关注它了。

2、Service

服务分管不同的数据处理,例如有电池电量的,有心率的,它不参与具体的数据交互,承担的是功能分区的职责。每个服务都有一个UUID进行区分。

3、Characteristic

特征是直接参与数据交互的成员之一。特征也有一个UUID进行标识,通过UUID获取到特征,修改特征里面的Value达到通讯目的。这样的通讯模式和观察者模式相似,当Value有改变的时候会通知监听这个特征的观察者,告诉它数据有改变,观察者去获取数据就完成了一次通讯,具体的实现往后详述。

4、Descriptor

对特征值的描述,是用来定义特征值的已定义属性。例如:描述符可以指定可读的描述,特征值的可接受范围或者特征值特定的度量单位。这个东西用的不是很多,假如中心设备收不到数据,那么就看看是不是Descriptor没有设置可通知。

5、Advertising

广播,外围设备让自身可以被发现的手段,只有发出广播了,才能通过Ble扫描到,一旦设备连接上,广播就会停止。

 

三、中心设备和外围设备

在使用手机与智能家居互联的场景中,手机是中心设备,众多智能家居作为外围设备,这个谁做中心设备还是外围设备没有绝对的规定,要看适不适合应用场景。

中心设备特点:主动发起连接,能同时连接7个外围设备。

外围设备特点:不能主动发起连接,发送广播。

对比一下这两个特点,在实际运用就能确定要作为哪一方了,现在的智能手机可以同时作为中心设备和外围设备。在讲到特征值的时候,说这是数据交互的方式之一,这种是基于连接的方式,另外一种数据传输方式就是通过广播了,广播中附带着数据包,中心设备不连接就可以拿到广播数据包做处理,多用于广播设备的一些信息,可以快速识别设备。