BLE进击的小学生蓝牙BLE

BLE蓝牙知识---GATT Profile

2017-02-28  本文已影响2758人  75cec28807b7

一. 引言

现在低功耗蓝牙(BLE)连接都是建立在GATT(Generic Attribute Profile)协议之上。GATT是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

二. GAP

详细介绍GATT之前,需要了解GAP(Generic Access Profile),它在用来控制设备和广播。GAP使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如Beacon设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。

1. 设备角色

GAP给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。

2. 广播数据

在GAP中外围设备通过两种方式向外广播数据:Advertising Data Payload(广播数据)和Scan Response Data(扫描回复),这里包含一些设备额外的信息,例如设备的名字。

3. 广播流程

GAP的广播工作流程如下图所示。



从图中我们可以清晰看出广播数据和扫描回复数据是怎么工作的。外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太容易扫描到。

4. 广播的网络拓扑结构

大部分情况下,外设通过广播自己来让中心设备发现自己,并建立GATT连接,从而进行更多的数据交换。也有些情况是不需要连接的,只要外设广播自己的数据即可。用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。因为基于GATT连接的方式的,只能是一个外设连接一个中心设备。使用广播这种方式最典型的应用就是苹果的iBeacon。广播工作模式下的网络拓扑图如下:


GATT

GATT的全名是Generic Attribute Profile,他定义两个BLE设备通过叫做Service和Characteristic的东西进行通信。GATT就是使用了ATT(Attribute Protocol)协议,ATT协议把Service,Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用16bit ID作为每一项的索引。
一旦两个设备建立起了连接,GATT就开始起作用了,这也 意味着,你必需完成前面的GAP协议。这里需要说明的是,GATT连接,必须先经过GAP协议。实际上,我们在Android开发中,可以直接使用设备的MAC地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。
GATT连接需要特别注意的是:GATT连接是独占的。也就是一个BLE外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就是一个BLE外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
中心设备和外设需要双向通信的话,唯一的方式就是建立GATT连接。

1. GATT连接的网络拓扑

下图展示了GTT连接网络拓扑结构。这里很清楚的显示,一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设。



一旦建立了连接,通信就是双向的了,对比前面的GAP广播的网络塔扑,GAP通信是单向的。如果你要让两个设备外设能通信,就只能通过中心设备中转。

2. GATT通信事务

GATT通信的双方是C/S关系。外设作为GATT服务端(Server),它维持了ATT的查找表以及service和characteristic的定义。中心设备是GATT客户端(Client),他向Server发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slava)的响应。
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。

下图展示一个外设(GATT服务端)和中心设备(GATT客户端)之间的数据交流流程,可以看到的是,每次都是主设备发起请求:


3. GATT结构

GATT事务是建立在嵌套的Profiles,Services和Characteristics之上的,如下如所示:


上一篇 下一篇

猜你喜欢

热点阅读