带你认识蓝牙 GATT协议
GATT 是蓝牙低功耗(BLE)中用于规范设备间服务(Service)、特征(Characteristic)等数据结构,并实现数据读写、通知等交互的核心协议。
GATT介绍
蓝牙GATT(通用属性配置)是低功耗蓝牙(BLE)中用于定义设备之间通信数据结构的协议。
通过服务
、特征
、属性
来实现设备间的数据传输。GATT使用属性协议(ATT)来传输数据,这些数据以短数据段的形式发送和接收,称为属性
对于GATT
而言,以应用为主所需要的了解的基本概念,主要就是GATT、GAP、ATT。
协议名称 | 介绍 |
---|---|
ATT | 个人开发者接触最多的就是ATT,比如读取某个数据,写某个数据。 |
GAP | 主要用来广播、扫描和发起连接 |
GATT | GATT用来规范attribute 属性中数据内容,并使用分组的概念对属性进行分类管理。 |
没有GATT,BLE也能跑,但是互联互通会出问题,兼容性差。
对于应用而言,蓝牙无非就是用来进行数据交互。例如,使用手机与蓝牙模块进行通信,那么手机就是client设备,蓝牙模块就是server设备。
GATT的结构
对于GATT server有很多分支,可想而知对于GATT有很多专有名词;应用程序也是对GATT server的参数进行修改配置。
GAP
了解GATT之前,需要了解GAP,它用来控制设备连接和广播。GAP使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
设备角色
GAP给设备定义了若干角色,其中主要有两个设备是:外围设备
和中心设备
。
- 外围设备: 这一般就是非常小的低功耗设备,用来提供数据,并连接到一个相对强大的钟信设备。
- 中心设备: 中间设备比较强大,用来连接其他外围设备。
广播数据
在GAP中外围设备通过两种方式向外广播数据:广播数据
和扫描回复
。这里广播数据是必需的,因为外设需要不停的向外广播,让中心设备知道他的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的消息。
广播流程
GAP广播工作流程如下:
外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太饿哦能够以扫描到。
广播的网络拓补结构
大部分情况下,外设通过广播来让中心设备发现自己,并GATT连接,从而进行更多的数据交换。
也有些情况是不需要连接的,只要外设广播自己的数据即可。用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。因为基于GATT连接的方式的,只能是一个外围设备连接一个中心设备。
广播模式的网络拓扑图如下:
GATT
GATT
的全称是普通属性协议,定义了两个BLE设备通过Service
和Characteristic
服务和特征的东西进行通信。
GATT
就是使用了ATT
协议,ATT
把Service``Characteristic
对应的数据保存在一个查找表中,此查找表使用16bit的ID作为每一项的索引。
一旦两个设备建立起了连接,GATT就开始起作用了,这也意味着,你必须先完成GAP协议。
这里需要说明的是,GATT连接,必须先经过GAP协议。 GATT连接需要特别注意的是:GATT连接是独占的。也就是一个BLE外设同时只能被一个中心设备连接。
一旦外设被连接,他就会马上停止广播,这样其他设备就无法发现他了,设备断开后,又继续广播
中心设备和外设需要双向通信的话,唯一的方法就是建立GATT
连接。
GATT连接的网络拓补
下图为GATT连接网络拓扑结构,一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设
。
一旦建立了连接,通信就是双向的了,对比前面的GAP广播的网络拓扑,GATT通信是双向的。如果让两个外设设备能通信,只能通过中心设备中转。
GATT通信事务
GATT通信的双方是C/S关系(客户端/服务器)。外设作为GATT服务端,它维持了ATT的查找表
以及service
和characteristic
的定义。中心设备时GATT的客户端,他向server发起请求。
所有的通知时间,都是由客户端发起,并且接收服务端的响应 一旦建立连接,外设将会给中心设备一个
连接间隔
,这样中心设备i就会在每个连接间隔尝试去连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,中心设备可能不会严格按照设定的间隔执行。 下图为外设(GATT服务端)与中心设备(GATT客户端)之间的数据交流流程,可以看到的时,每次都是中心设备发起请求:
GATT结构
开头说到GATT是建立在服务``特征``属性
上的。
GATT事务是寄哪里在嵌套的Profiles
、Services
和Characteristics
之上的。
-
profile 其并不是实际存在于BLE外设上的,,只是一个预先定义的
service
的集合。 -
Service
其是把数据分成一个个的独立逻辑
,包含一个或者多个Characteristics
。每个Service
都是由16bie的ID组成,这称为UUID唯一表示
。UUIO是16bit或者128bit的,16bit的UUID是官方认证的,需要购买。128bit是自定义的,随意设置。 官方通过一些标准的
Service
,完整列表在这里。 Service = 蓝牙设备的 “功能模块”,有一个蓝牙心率手环,它的核心功能是 “测心率”;UUID = 给 “功能模块” 贴的 “唯一身份证”;分为16bit的短身份证,以及128bit的长身份证。 -
Characteristics 在GATT事务中最低级别的是
Characteristics
,其是最小的逻辑数据单元,当然它可能包含一个组关联的数据。与service
类似,每个Characteristic
用16bit或者128bit的UUID唯一表示
。这里使用官方定义的Characteristic是免费的
上面说到的官方是Bluetooth SIG官方
相关文章
合宙主流通信模组梳理
合宙作为我第一家实习公司,其在行业上是一位佼佼者,我们合宙推出多种产品,满足了几乎所有客户对通信模组的需求。 并且,合宙有一个特色`Luatos`,是一种基于`lua`的开发脚本。它是一种针对嵌入式的脚本运行框架。针对资源较少的嵌入式环境进行了优化,极大提升了运行效率。 >但是对于习惯C的嵌入式开发者,就需要拿出时间去学习、熟悉该脚本 我一直认为`一个公司的销售不了解产品那一定会让去问开...
嵌入式存储器(ROM/RAM/Flash)知识梳理
作为嵌入式开发者,存储器是我们开发过程中最频繁的硬件组件之一。从微小的8位单片机到复杂的嵌入式Linux系统,每个设备都用到了各种类型的存储器。 概念 **存储器主要分为ROM和RAM**,RAM和ROM的最大区别是`RAM在断电以后保存的数据会自动消失,ROM不会消失`。 当然我们可以把所有的存储器按两种方式分类,`易失性`和`功能用途`。 按易失性划分(最核心分类) - **非易失...
一文搞懂DTU、RTU的区别和应用场景
>DTU是作为串口数据与IP数据转换的传输通道 >RTU是集数据采集、现场设备控制、数据传输于一体的单元 >二者核心差异在于是否具备“现场数据采集与设备控制功能” >随着各样的无线网络传输技术的出现,网关应运而生。网关能够适配更多协议标准 我们从一个房间走到另一个房间,必须要经过一扇门。同样,从一个网络向另一个网络发送消息,也必须经过一个“关口”,而`DTU`、`RTU`就是这样的`关口`。...