蓝牙协议层 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则是将这些"属性"包装成我们上面所讲的服务、特征值等。

 

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值