【蓝牙协议栈】【BLE】【ATT】低功耗蓝牙之属性协议介绍

2024-04-04 07:36

本文主要是介绍【蓝牙协议栈】【BLE】【ATT】低功耗蓝牙之属性协议介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论

2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!

目录

1. ATT概念

2. ATT部分术语

2.1 属性类型(Attribute type)

2.2 属性句柄(Attribute handle)

2.3 属性句柄组(Attribute handle grouping)

2.4 属性值(Attribute value)

2.5 属性权限(Attribute permissions)

2.6 控制点属性(Control-point attributes)

2.7 协议方法(Protocol methods)

2.8 交互 MTU(Exchanging MTU size)

2.9 长属性值(Long attribute values)

2.10 原子操作(Atomic operations)


1. ATT概念

ATT,Attribute Protocol,用于发现、读、写对端设备属性的协议(针对 BLE设备),ATT分为两个角色:Server/Client,ATT允许设备作为服务端提供拥有关联值的属性集,让作为客户端的设备来发现、读、写这些属性;同时服务端能主动通知客户端。 整个 ATT协议在整个蓝牙协议栈中的位置如下:

在 L2CAP协议层之上,响下是基于 L2CAP的数据传输机制来通信!对了 BLE来说ATT有固定的 L2CAP CID,也就是 0x0004,如图所示:

向上为 GATT提供一些数据的交互方式,支持 GATT client跟 server之间 Feature的交互!

2. ATT部分术语

2.1 属性类型(Attribute type)

通过 UUID(universally unique identifier)来标识,说起 UUID一般分为16bit/32bit/128bit的 UUID,在 ATT协议中,32bit的 UUID必须转换为 128bit的 UUID! 另外,16bit的UUID是通过加一个128 bit的base uuid来转换为128bit的UUID,base UUID为:00000000-0000-1000-8000-00805F9B34FB,只所以本来 128bit的 UUID,大部分却采用 16 bit来发送数据,主要是为了提搞传输速率以及减少交互次数!

2.2 属性句柄(Attribute handle)

采用 16bit的值用于标识一个属性,范围是 0x0000~0xffff,0x0000是保留数值,0xffff是最大数值,所以我们一般不用!

2.3 属性句柄组(Attribute handle grouping)

Grouping是一由高层协议定义的一组属性,他们位于其他属性组之前,客户可以请求第一个和最后一个与属性组关联的 Handle

2.4 属性值(Attribute value)

Attribute value是一个字节数组,长度可能是固定的也可能是可变的,例如:可能是1个字节的值、或者4个字节的int、或者可变长度的字符串。一个attribute包含的attribute value长度可能大于一个PDU的长度,所以会分成多个PDU传输。Attribute value数组的编码由attribute type决定 在request、response、notification、indication中传输attribute value时,PDU中时没有attribute value length这个字段的,attribute value length是可以通过PDU数据包的长度计算出来的,这意味着: (1)在一个request、response、notification、indication中只能有一个attribute value,除非server和client都可以通过attribute type确attribute value的长度。 (2)在一个request、response、notification、indication中只有attribute value字段的长度是可变的 (3)bearer protocol (e.g. L2CAP)会保留数据包的边界 注意:有些response包含多个attribute value,但是这些attribute value的长度都是attribute type定义好的固定长度。

2.5 属性权限(Attribute permissions)

Attribute permissions是access permissions、encryption permissions、authentication permissions和authorization permissions的组合。 (1)access permissions用来表示attribute是否允许client进行读写,取值包括:Readable、Writeable、Readable and writable; (2)encryption permissions用来表示是否加密,取值包括:Encryption required、No encryption required (3)authentication permissions用来表示当client访问attribute value时是否需要一个已认证的物理链路,同样也表示当server向client发送notification和indication时是否需要一个已认证的物理链路,取值包括:Authentication Required、No Authentication Required (4)authorization permissions用来表示当client访问attribute value时是否需要授权,取值包括:Authorization Required、No Authorization Required

注意: (1)如果server设置authentication permissions为Authentication Required,但是client的链路没有通过认证,当client访问attribute value时,会收到错误码:«Insufficient Authentication»,此时client需要进行链路认证,认证成功后才能访问attribute value (2)如果server设置encryption permissions为Encryption required,但是client的链路没有加密,当client访问attribute value时,会收到错误码:«Insufficient Encryption»,此时client需要进行链路加密,加密成功后才能访问attribute value (3)如果server设置encryption permissions为Encryption required,client的链路已经加密,但是encryption key size小于要求的长度,当client访问attribute value时,会收到错误码:«Insufficient Encryption Key Size»,此时client需要用符合长度要求的link key进行加密,加密成功后才能访问attribute value

2.6 控制点属性(Control-point attributes)

不可读,但是可写,可通知(Notified)和可指示(Indicated)的属性被称为Control-Point Attribute高层协议可使用该属性来使能设备特定过程,比如设备上一个给定过程的命令或指示已经完成.

2.7 协议方法(Protocol methods)

ATT使用 Protocol Methods来发现、读、写、通知、指示属性,方法可分为如下几种 Request/Response/Command/Notification/Indication/Confirmation,如下图所示,这个我们会在后续详细介绍

2.8 交互 MTU(Exchanging MTU size)

ATT_MTU定义了 Client和 Server之间数据包的最大值;其默认值由高层协议来定义,Client和 Server可通过 Exchange MTU Request and Response PDUs来交换最大数据包然后均使用交换值中的最小值进行通信,同时作为 Server和Client的设备应该使用相同的 Client Rx MTU和 Server Rx MTU,每个 ATT Bearer均有其 ATT_MTU;当一个设备拥有多个 ATT Bearer时,不同 ATT Bearer的 ATT_MTU可能不同

2.9 长属性值(Long attribute values)

(1)一个数据包最大可以发送的attribute长度是ATT_MTU-1个字节,至少Attribute Opcode要占一个字节,如果attribute value的长度大于ATT_MTU-1个字节,则称为Long Attribute (2)read长度大于ATT_MTU-1个字节Attribute,需要使用read blob request,使用read request可能读取到前面的ATT_MTU-1个字节 (3)write长度大于ATT_MTU-3个字节Attribute,使用prepare write request和execute write request,使用write request可能写入前面的ATT_MTU-3个字节 (4)在ATT协议中无法确定一个attribute的长度是否可以大于ATT_MTU-3,在上层协议中将声明给定属性的最大长度可以大于(ATT_MTU-3)字节 (5)attribute value最大长度是512个字节

2.10 原子操作(Atomic operations)

Server应该将 Client的每个请求或命令视为不受影像的原子操作,如果一个链路由于某种原因断开,高层协议应当对属性值得修改负责!Long Attribute不能被单一的原子操作读、写!

这篇关于【蓝牙协议栈】【BLE】【ATT】低功耗蓝牙之属性协议介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875181

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir