一、概要
ATT 属性协议规定了在 BLE 中的最⼩数据存储单位,⽽ GATT 规范则定义了如何⽤特性值
和描述符表示⼀个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备
拥有哪些服务和数据。。
gatt规程可分为三种基本类型
1、发现规程
2、客户端发起规程
3、服务器发起规程,
4、MTU规程
GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播
1.1、发现服务
发现服务有三种方式、
1、发现首要服务
2、按服务UUID发现首要服务
3、查找包含服务
1.1.1、发现首要服务
当客户端连接上后(GAP),首要需要获得首要服务上的设备功能,于是客户端使用handler递增的方式进行服务查找,当服务器把客户端设定的首要服务查找到并且回复给客户端后,那么这个handler对应的服务就位客户端设定的首要服务。
1.1.2、按照服务UUID发现首要服务
客户端将UUID对应的handler服务发送给服务器后,服务器回应客户端的首要服务请求的过程。
1.1.3、查找包含服务
一旦发现了首要服务后,并可以得到次要服务以及其他的引用服务,
主意:并不是所有的profile都是有client发起的,对于通知,指示profile是有server发起的。
客户端发起profile:读/写属性,读/写特征属性描述符
服务端发起profile:notify and indicate
二、gatt结构
PROFILE: profile并不是蓝牙协议栈上的东西,它只是一个被SIG通过预先设定的server的一个集合,比如心率profile就结合了heart rate server和device information server。
SERVER: server是将数据拆分为多个独立的逻辑项,它包含一个或者多个characteristic,没一个server有一个UUID唯一表示,UUID可为16bit或者32bit,16bit是官方经过认证的,需要花钱购买,32bit的为自定义的。
CHARACTERISTIC: characteristic是描述最小逻辑数据单元,它包含一组关联数据,比如温度值,三轴值等。
举个栗子:当然这里只是假设,纯粹猜测举的栗子
profile = 心率计
server0 = 心跳服务
characteristic0 = 13;//当前心率
characteristic1 = 25;//xxx
…
charactersticn =
server1 = 设备信息服务
。。。。。
servern = 设备名服务
总结:
1、gatt是定义众多profile的实现层,它的实现基础为att。
2、gatt通过查询att的属性数据库(以遍历式,uuid专项查找等方式)查找到相关的服务。
3、profile由一个或者多个不同UUID的server组成,一个server由一个或者多个characterstic(信息项)组成。
/***********************理论部分结束 **********************************/
推荐协议栈:btstack
或者android正在使用的bluedroid