打印

【IoT】蓝牙 GAP 和 GATT 协议简析(转载)

[复制链接]
917|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
观海|  楼主 | 2018-10-26 12:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
版权声明:本文为博主原创**,未经博主允许不得转载。        https://blog.csdn.net/liwei16611/article/details/80958842




**背景:


理论知识是实践开发的基础,对于产品研发来说更是如此,理论结合实践才可以开发出满足市场需求的稳定产品。


1、基础简介


1.1、profile


profile 可以理解为一种规范,一个标准的通信协议,它存在于蓝牙从机中(服务端);


蓝牙组织规定了一些标准的 profile,例如 HID OVER GATT,防丢器,心率计等;


每个 profile 中会包含多个 service,每个 service 代表从机的一种能力。


1.2、service


service 可以理解为一个服务,在 BLE 从机中有多个服务,例如:电量信息服务、系统信息服务等;


每个 service 中又包含多个 characteristic 特征值;


每个具体的 characteristic 特征值才是 BLE 通信的主题,比如当前的电量是 80%,电量的 characteristic 特征值存在从机的 profile 里,这样主机就可以通过这个 characteristic 来读取 80% 这个数据。


1.3、characteristic


characteristic 特征值,BLE 主从机的通信均是通过 characteristic 来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。


1.4、UUID


UUID,统一识别码,我们刚才提到的 service 和 characteristic 都需要一个唯一的 uuid 来标识;


每个从机都会有一个 profile,不管是自定义的 simpleprofile,还是标准的防丢器 profile,他们都是由一些 service 组成,每个 service 又包含了多个 characteristic,主机和从机之间的通信,均是通过characteristic来实现。


沙发
观海|  楼主 | 2018-10-26 12:10 | 只看该作者
2、BLE GATT 简介


低功耗蓝牙 BLE 的连接是建立在 GATT (Generic Attribute Profile) 协议之上的;

GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

2.1、GAP 协议

详细介绍 GATT 之前,需要了解 GAP(Generic Access Profile),它在用来控制设备连接和广播;

GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互;

例如:

Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。

2.1.1、设备角色

GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral - 从机 - 服务端)和中心设备(Central - 主机 - 客户端)。

外围设备 - 从机:

这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备,例如小米手环;

中心设备 - 主机:

中心设备相对比较强大,用来连接其他外围设备。例如手机等;

2.1.2、广播数据

在 GAP 中外围设备通过两种方式向外广播数据:

Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复)

每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在;

扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如:设备的名字。

2.1.3、广播的网络拓扑结构

大部分情况下外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换;

也有些情况是不需要连接的,只要外设广播自己的数据即可,用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备;

因为基于 GATT 连接的方式的,只能是一个外设连接一个中心设备,使用广播这种方式最典型的应用就是苹果的 iBeacon。



使用特权

评论回复
板凳
观海|  楼主 | 2018-10-26 12:11 | 只看该作者
2.2、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 外设同时只能被一个中心设备连接;

一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了,当设备断开,它又开始广播;

中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。

2.2.1、GATT 连接的网络拓扑

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

2.2.2、GATT 通信事务

GATT 通信的双方是 C/S 关系,外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义;

中心设备是 GATT 客户端(Client),它向 Server 发起请求,需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应;

一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据;

但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙;

2.2.3、GATT 结构

GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的的。

Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合;

例如心率 Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service;

Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic,每个 Service 有一个 UUID 唯一标识,UUID 有 16bit 的,或者 128bit 的,16bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置;

以 Heart Rate Service 为例,可以看到它的官方通过 16bit UUID 是 0x180D,包含 3 个 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point,并且定义了只有第一个是必须的,它是可选实现的;

Characteristic在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。

与 Service 类似,每个 Characteristic 用 16bit 或者 128bit 的 UUID 唯一标识,你可以免费使用 Bluetooth SIG 官方定义的标准 Characteristic,使用官方定义的,可以确保 BLE 的软件和硬件能相互理解;

举个例子:

Heart Rate Measurement Characteristic,这是上面提到的 Heart Rate Service 必需实现的 Characteristic,它的 UUID 是 0x2A37。它的数据结构是,开始 8 bit 定义心率数据格式,接下来就是对应格式的实际心率数据;

和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据,这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。


使用特权

评论回复
地板
SarahHXC| | 2018-11-1 16:47 | 只看该作者
楼主有玩过 ST的bluenrg吗?求教~~

使用特权

评论回复
5
观海|  楼主 | 2018-11-5 12:53 | 只看该作者
楼上的没有

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

3882

帖子

1

粉丝