蓝牙协议层 GATT ,GAP,ATT 之间的关系

一、ATT (attribute protocol),数据交互协议

ATT是由一群ATT命令组成,就是上文所述的request(请求)和response(响应)命令,ATT也是蓝牙空口包中的最上层,也就是说,ATT就是大家对蓝牙数据包进行分析的最多的地方。

ATT命令,正式称谓ATT PDU(Protocol Data Unit,协议数据交互单元)包括4类:读,写,notify(通知)和indicate(指示)。这些命令又可以分成两种:如果它需要response,那么会在相应命令后面加上request;相反,如果它只需要ACK而不需要response,那么它的后面就不会带request。这里要特别强调一点,ATT所有命令都是“必达”的,也就是说每个命令发出去之后,会立马等ACK信息,如果收到了ACK包,发送方认为命令完成;否则发送方会一直重传该命令直到超时导致BLE连接断开。换句话说,只要你的BLE连接没有断开,那么你之前发送的数据包,不管它是用什么ATT PDU来发送的,它肯定被对方收到了。我估计很多人对此会产生疑问,因为他们经常碰到丢包的情况,其实大家经常碰到的“丢包”,不是空中把包丢了或者包在空中被干扰了,而是大家发送的代码写得有问题,导致你要发送的包没有被安全送达到协议栈射频FIFO中,从而出现所谓的“丢包”。以后大家碰到丢包情况,请先检查你的代码,保证你的数据包正确完整安全地送达到协议栈射频FIFO中,只要数据包放到了协议栈射频FIFO中,蓝牙协议栈就能保证该数据包“必达”对方。既然每个ATT命令都必达对方,那么还需要request类型的命令做什么?如果一个命令带有request后缀,那么发起方就可以收到命令的response包,这个response包在应用层是有回调事件的,而前述的ACK包在应用层是没有回调事件的。换句话说,不带request的命令,虽然协议栈底层确保了该命令必达对方,但应用层其实并不知道(私有实现方法除外),当你需要实现一个通信序列的时候,这种命令就显得不足了。而采用request/response方式的命令对,request命令发出去之后,必须等到相应的response命令回复才能进行下一步操作,比如发送下一个request命令,这样应用层可以严格按照规定逻辑执行一系列的操作,这个在很多应用场合是非常有用的。Request/response命令对还有一个副作用:大大降低通信的有效速率(吞吐率),因为request/response命令必须在不同的连接间隔中出现,也就是说,你在间隔1中发送了一个request命令,那么response包必须在间隔2或者稍后间隔中回复,而不能在间隔1中回复,这就导一个数据包的发送需要跨两个连接间隔甚至更多。而不带request后缀的ATT命令就没有这个限制,ACK可以在同一个连接间隔中回复,这样一个连接间隔中可以同时发出多个数据包,这样将大大提高通信速率。

二、GAP(Generic Access Profile),通用访问规范

Ble 协议栈中的 GAP 层负责处理设备访问模式,包括这杯发现、建立连接、终止连接、初始

化安全管理,和设备配置,所以会在 ble 协议栈红发现有不少函数均是以 GAP 为前缀,这些

函数会负责以上的内容。

GAP 层总是作为下面四个钟角色之一

☆Broadcaster 广播者——不可以连接的一直在广播的设备;

☆Observer 观测者——可以扫描广播设备,但不能发起建立连接的设备;

☆Peripheral 从机——可以被连接的广播设备,可以在单个链路层连接中中作为从机

☆Central 主机——可以扫描广播设备并发起连接,在单个链路层或多链路层中作为主机,

在 TI 的 ble 协议栈中,一个主机可以连接三个从机。在典型的蓝牙低功耗系统中,从机设备广播特定的数据,来是主机知道他是一个可以连接的设备,广播内容包括设备地址以及一些额外的数据,如设备名、服务等。主机收到广播数据后,会向从机发送扫描请求 Scan Request,然后从机将特定的数据回应给主机,称为扫描回应 Scan Response。主机收到扫描回应后,便知道这是一个可以建立连接的外部设备,这就是设备发现的全过程。此时,主机可以向从机发起建立连接的请求。

从机可以通过向主机发送“连接参数更新请求”来改变连接设置,主机接收到请求后,可以选择接受或者拒绝这些新的参数。连接可以被主机或者从机以任何原因主动终止。当一方发起终止链接时,另一方必须响应。然后两个设备才能退出连接状态。

GAP 层也处理 BLE 连接中的安全管理。只有已认证的连接中。特定的数据数据才能被读写,一旦连接建立,两个设备进行配对,,当配对完成后,形成加密连接的密钥,在典型的应用中,外设请求集中器提供密钥来完成配对工作。密钥是一个固定的值,如 000000,也可以随机生成一个数据提供给使用者,当主机设备发送正确的密钥后,两设备交换安全密钥并加密认证链接。

在许多情况下,同一对外设和主机会不时的连接和断开, ble 的安全有一项特性允许两

个设备之间建立长久的安全密钥信息,这种特性称为绑定,他允许两设备连接时快速的完成

加密认证,而不需要每次连接时执行配对的完整过程。

三、GATT(Generic Attribute Profile),通用属性配置文件

GATT 层是传输真正数据所在的层。 包括了一个数据传输和存储框架以及其基本操作。

GTTA 定义了两类角色:服务器(server) 和客户端(client) ,GATT 角色无需和 GAP 角色绑定, 但是可能由更高层的规范进行指定。

除了 GAP 定义了角色之外, BLE 还定义了另外 2 种角色: GATT 服务器和 GATT 客

户端, 它们完全独立于 GAP 的角色。 提供数据的设备称为 GATT 服务器, 访问 GATT 服

务器而获得数据的设备称为 GATT 客户端。在应用中, 外围设备作为服务器, 集中器作为客户端。

注意: 一个设备可以同时作为服务器和客户端。

两个设备应用数据的通信是通过协议栈的 GATT 层实现,从 GATT 角度来看,当两个设

备建立连接后,他们处于下面两种角色之一;

△GATT 服务器——他是为 GATT 客户端提供数据服务的设备。

△GATT 客户端——他是从 GATT 服务器读写应用数据的设备。

需要特别注意的是, GATT 角色中的客户端和服务器的概念与链接中的主机和从机完全独立,主机可以是 GATT 客户端也可以是 GATT 服务器。

一个 GATT 服务器中可包含一个或者多个 GATT 服务, GATT 服务是完成特定功能的一些

列数据的集合,Characteristic 特征值是服务用到的值,以及其内容和配置信息, GATT 定义了在 BLE 连接中发现、读取和写入属性的子过程。 GATT 服务器上的特征值机器内容和配置信息(称为

描述符)存储于属性表中,属性表是一个数据库,包含了称为属性的小块数据。

四、ATT和GATT的关系

ATT主要是规定了"属性"的定义,GATT则是将这些"属性"包装成我们上面所讲的服务、特征值等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值