蓝牙相关学习:5.BLE协议属性协议层(ATT)
属性协议层
- 属性协议
- 数据的结构
- 1.Attribute Handle
- 2.Attribute Type
- 2.1.分类
- 2.2.取值范围
- 2.3.长度
- 3.Attribute Value
- 4.Attribute Permissions
- ATT的空中包结构
- 1.通讯规则
- 2.PDU 格式
- 2.1.Opcode
- 2.1.1.错误
- 2.1.2.交换MTU
- 2.1.3.查找信息
- 2.1.4. 读属性
- 2.1.5. 写属性
- 2.1.6. 队列写属性
- 2.1.7. 通知属性
- 2.2.Attribute Parameters
- 2.2.1.长度
- 2.2.2.为什么支持最大写入数据有20B的说法?
- 2.3.Authentication Signature
- 参考地址
属性协议
属性协议(Attribute Protocol)简称ATT。它是GATT和GAP的基础。
这一层的关键词是Attribute(属性)。一个属性其实就是一条数据,属性是BLE数据提供单元,也是蓝牙空中传播数据的最上层,BLE开发过程中接触最多的就是这一层。
ATT层规定了ATT_MTU值,如果属性值很长,超过了ATT_MTU限制,将使用特殊的读写方法进行操作。
如果没有MIC,ATT_MTU 将是 0B - 27B/251B
如果有MIC,ATT_MTU 将是 0B - 23B/247B
数据的结构
这里的数据的结构,指的是一条属性在存储器中定义的数据结构
1.Attribute Handle
属性句柄(Attribute Handle)犹如指向属性实体的指针,对端设备可通过属性句柄来访问该属性
属性句柄值的范围:0x0001~0xFFFF
2.Attribute Type
作用是用以区分当前属性是服务项或是特征值等,它用UUID来表示。
UUID(universally unique identifier,通用唯一识别码)是一个软件构建标准,并非BLE独有的概念,一个合法的UUID,一定是随机的、全球唯一的,不应该出现两个相同的UUID。
2.1.分类
BLE的属性类型主要有四个大类:
Primary Service(首要服务项):0x2800
Secondary Service(次要服务项):0x2801
Include(包含服务项):0x2802
Characteristic(特征值):0x2803
转自:https://blog.csdn.net/chengbaojin/article/details/108142146
特性扩展性质 «Characteristic Extended Properties»: 0x2900
特性用户描述 «Characteristic User Description» : 0x2901
客户端特性配置«Client Characteristic Configuration» : 0x2902
服务器特性配置«Server Characteristic Configuration»: 0x2903
特性表示格式 «Characteristic Presentation Format»: 0x2904
特性聚合格式 «Characteristic Aggregate Format» : 0x2905
特性用户描述描述符:
给用户进行配置的描述性的东西,它用一个字符串与某一特性相关联
客户端特性配置描述符 :
支持通知或者指示的特性必须使用客户端配置描述符
服务器特性配置描述符
所要广播的数据是什么呢?就是特性值,也就是特性值声明中的属性值
2.2.取值范围
0x1800 – 0x26FF :服务项类型
0x2700 – 0x27FF :单位
0x2800 – 0x28FF :属性类型
0x2900 – 0x29FF :描述符类型
0x2A00 – 0x7FFF :特征值类型
假如UUID=0x1800,就表示它是一个首要服务项。
2.3.长度
UUID是16个字节的字符串,为什么这里只使用了2字节?
因为这些是常用的UUID,为了减少传输的数据量,BLE协议做了一个转换约定,给定一个固定的16字节模板,只设置2个字节为变化量,其他为常量,2字节的UUID在系统内部会被替换,进而转换成标准的16字节UUID。UUID模板为:
0000XXXX-0000-1000-8000-00805F9B34FB
其中从左数第3、4个字节“XXXX”就是变化位,其他为固定位。
如:UUID=0x2A00在系统内部会转换成00002A00-0000-1000-8000-00805F9B34FB。
反之,如果一个特征值的UUID是16字节的,在系统内部它的属性类型也可能写成第3、4字节组成的双字节,比如UUID=1234ABCD-0000-1000-8000-00805F9B34FB,它的属性类型在内部表示为ABCD。
主机端扫描到该属性类型,会将其当做是“用户自定义”的类型,然后从其他位置获取该UUID的真实值。
3.Attribute Value
值
4.Attribute Permissions
属性权限/属性许可,作用是保护Attribute Value
Attribute Permissions不会直接在空中包中体现,而是隐含在ATT命令的操作结果中。
转:https://www.cnblogs.com/yongdaimi/p/11983220.html
权限属性:
访问权限(Access Permission)- 只读、只写、读写
禁止访问权限( No Access )- 禁止读或者写
加密权限(Encryption Permission) – 加密、不加密
认证权限(Authentication Permission) – 需要认证、无需认证
授权权限(Authorization Permission) – 需要授权、无需授权
签名权限(Signed Permission)- 签名后才能读或者写,这个用得比较少
访问(Access)权限好理解,如果是只读权限,就不能对其写数据,其他类似。
加密(Encryption)权限也好理解,就是对数据进行加密。
认证(Authentication)是指相互确认对方身份。完成认证流程的两个设备,双方建立信任关系,二者之间的通信通道即可以认为是安全的。BLE中,“认证”过程就是配对。
授权(Authorization)是指对授信设备开放权利。
ATT的空中包结构
1.通讯规则
命令,客户端发送给服务端,不要求服务端回复
请求,客户端发送给服务端,要求服务端回复
响应,客户端发送了一个请求,服务端用此响应
通知,服务端发给客户端的数据,不要求客户端回复
指示,服务端发给客户端的数据,要求客户端回复
确认,服务端发给客户端的数据,客户端用此进行回复
2.PDU 格式
2.1.Opcode
Opcode PDU :代替某种命令,通过的PDU携带的Attribute Parameters格式不同,下面详细说明。bit 0-5位表示。
Command:表示PDU Type 是否是命令(Command )。bit 6表示。
Authentication Signature标识位:
如果Attribute Opcode中身份验证签名标记位为0,则 Information Payload不含有Authentication Signature;
如果Attribute Opcode中身份验证签名标记位为1,则 Information Payload含有Authentication Signature。
bit 7 表示。
Opcode | PDU | 描述 |
---|---|---|
0x01 | Error Response | 错误 |
0x02 | Exchange MTU Request | 交换MTU |
0x03 | Exchange MTU Response | 交换MTU |
0x04 | Find Information Request | 查找信息 |
0x05 | Find Information Response | 查找信息 |
0x06 | Find By Type Value Request | 查找信息 |
0x07 | Find By Type Value Response | 查找信息 |
0x08 | Read By Type Request | 读属性 |
0x09 | Read By Type Response | 读属性 |
0x0A | Read Request | 读属性 |
0x0B | Read Response | 读属性 |
0x0C | Read Blob Request | 读属性 |
0x0D | Read Blob Response | 读属性 |
0x0E | Read Multiple Request | 读属性 |
0x0F | Read Multiple Response | 读属性 |
0x10 | Read by Group Type Request | 读属性 |
0x11 | Read by Group Type Response | 读属性 |
0x12 | Write Request | 写属性 |
0x13 | Write Response | 写属性 |
0x14 | Write Command | 写属性 |
0x15 | Signed Write Command | 写属性 |
0x16 | Prepare Write Request | 队列写属性 |
0x17 | Prepare Write Response | 队列写属性 |
0x18 | Execute Write Request | 队列写属性 |
0x19 | Execute Write Response | 队列写属性 |
0x1B | Handle Value Notification | 通知属性 |
0x1D | Handle Value Indication | 通知属性 |
0x1E | Handle Value Confirmation | 通知属性 |
2.1.1.错误
Error Response
如果属性PDU的操作码无效,或属性句柄无效,将返回错误响应PDU。在PDU的Parameter字段中,包含了错误编码。
2.1.2.交换MTU
Exchange MTU Request
客户端设备向服务端设备发送交换MTU请求,提供客户端设备的MTU值。服务端设备获知客户端的MTU值,并返回自己的MTU值。两端设备都将设置较小的MTU值作为新的MTU值。
Exchange MTU Response
如果两端设备没有交换MTU,则使用默认的MTU值处理属性事务。
2.1.3.查找信息
Find Information Request
查找信息请求,包含两个参数:起始属性句柄和结束属性句柄,用于获取服务端设备属性句柄处于该参数区间内的属性。
Find Information Response
查找信息响应,包含指定句柄区间内的属性UUID。如果区间内有多个属性,则返回多个响应。
Find By Type Value Request
按类型值查找请求,是在查找信息请求的基础上,加上了属性类型和属性值两个参数,这样能够更加精确的找到目标属性。
Find By Type Value Response
按类型值查找响应,包含了满足条件的属性句柄列表。
2.1.4. 读属性
Read By Type Request
按类型读请求,包含三个参数:起始属性句柄、结束属性句柄和属性类型。
Read By Type Response
按类型读响应,包含了满足条件的属性的“句柄-值”对的列表。
Read Request
读请求,包含一个参数:属性句柄。
Read Response
读响应,返回满足条件的属性值。
Read Blob Request
读片段(blob)请求,用于读取一个长包属性的值,它包含两个参数:属性句柄和偏移量。以不同的偏移量作为参数,多次执行该请求可以读取长包属性的完整值。
Read Blob Response
读片段响应,包含了长包属性值的指定偏移量片段。
Read Multiple Request
读多次请求,用于读取多个给定句柄的属性值,它包含一个参数:句柄列表。
Read Multiple Response
读多次响应,包含了多个指定句柄的属性值。
Read by Group Type Request
按组类型读请求,用于读取指定组类型的属性值,组类型是由ATT层之上的协议层设定的。它包含三个参数:起始属性句柄、结束属性句柄和属性组类型。
Read by Group Type Response
按组类型读响应,包含了满足条件的属性值列表。
2.1.5. 写属性
Write Request
写请求,将待写数值写入指定的属性值,包含两个参数:属性句柄和数值。
Write Response
写响应,表示写请求执行成功,不含任何参数。
Write Command
写命令,将待写数值写入指定的属性值,包含两个参数:属性句柄和数值。它不会触发一个写响应。
Signed Write Command
签名的写命令,与上面的写命令类似,指示包含了额外的参数:认证签名。典型应用是写控制点属性。
2.1.6. 队列写属性
队列写是指利用一个先进先出的队列,缓存多个属性值的写操作,然后在一个原子操作中完成所有的值写入操作。
队列写专门用于长包属性的写操作,现将一个长数据分成多个部分并记录偏移量,然后通过队列缓存,等数据发送完毕,再按照收到的顺序,一次性将整个长数据写入属性值。
Prepare Write Request
准备写请求,用于发送一个长数据片段,它包含三个参数:属性句柄、偏移量和待写入数据。
Prepare Write Response
准备写响应,收到准备写请求以后,缓存收到的数据。
Execute Write Request
执行写请求,对前面缓存的数据执行写操作,它包含一个参数:标志位。如果标志位为1,则执行写操作,如果为0,则取消前面的缓存数据。
Execute Write Response
执行写响应,根据执行写请求的标志位,执行或取消写操作。
2.1.7. 通知属性
Handle Value Notification
发送数值通知,它包含两个参数:属性句柄和属性值。它不需要客户端收到后返回响应。
Handle Value Indication
发送数值指示,它包含两个参数:属性句柄和属性值。它需要客户端收到后返回确认。
Handle Value Confirmation
发送数值确认,它不包含参数,客户端发出该确认消息表示收到了数值指示。
2.2.Attribute Parameters
2.2.1.长度
首先,参数数据长度和ATT_MTU有关
一般情况下L2CAP层有MIC,ATT_MTU 将是 0B - 23B/247B
23B 是 BLE 4.0/4.1支持下的最大长度;247B是 BLE 4.2/5.0支持的最大长度。同时 BLE 4.2/5.0 也是支持23B的,是否支持247B也和物理层有关。
其次,X 也是个变值,它和 Authentication Signature有关,如果存在Authentication Signature,那么Attribute Parameters的最大长度就是 ATT_MTU - 13B (Opcode 占用一个字节) ,如果没有Authentication Signature,那么最大长度将是 ATT_MTU - 1B。
2.2.2.为什么支持最大写入数据有20B的说法?
首先明确一点就是,这种说法来源于BLE 4.0/4.1或者 BLE 4.2/5.0 支持修改23B的这种情况。
如果ATT_MTU 是23B,并且没有Authentication Signature的场景下,Attribute Parameters是22B。
而我们真正使用Attribute Parameters写数据的情景,并不是整个Attribute Parameters都用来传输数据。这和Opcode的写属性有关。
当Opcode = 0x12(Write Request),它重新定义了Attribute Parameters的结构,如下:
Attribute Data 是写数据的时候,真正的数据部分,这就是20B的由来。
2.3.Authentication Signature
身份验证签名 0B/12B
参考地址
抄大佬的,做的学习笔记,如有错误欢迎指正
转:BLE 5协议栈-属性协议层(ATT):https://www.cnblogs.com/yeshenmeng/p/10819339.html
转:五 蓝牙低功耗(BLE)协议栈 之 ATT层:https://blog.csdn.net/chengbaojin/article/details/108142146
转:蓝牙BLE: ATT协议层中属性(Attribute):https://www.cnblogs.com/yongdaimi/p/11984359.html
转:http://www.sunyouqun.com/2017/04/page/2/
蓝牙相关学习:5.BLE协议属性协议层(ATT)相关推荐
- 蓝牙相关学习:4.2.BLE空口包结构 - PDU
PDU PDU 基本数据结构 LL Header 广播包(广播报文) Advertising Header PDU Type Advertising PDU Scanning PDU Initiali ...
- 蓝牙相关学习:4.1.BLE空口包结构
BLE空口包结构 4.0 - 5.1 Uncoded PHY 空口包格式 Preamble (前导) Access Address (AA) 广播包 数据包 PDU CRC 5.1 Coded PHY ...
- 蓝牙相关学习:3.BLE协议物理层
物理层 频段 调制 信道 跳频 参考地址 Physical Layer 简称 PHY(物理层) 由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band) 频段 B ...
- NS2相关学习——完成一个新的协议(1)
接下来要进入对我来说老大难的环节了,从表面的TCL慢慢进入到后端的C++,一起加油学习吧~ 在本节学习中,将给出一个在ns中实现新的协议的例子.但是可以想见的是,如果由我们自己来完成这个工作,势必要对 ...
- 低功耗蓝牙学习笔记-属性协议
什么是属性协议? 属性协议(Attribute Protocol)简称ATT: 属性协议既包含了关于属性的定义,也包含了属性的操作方法,既属性协议包含了通信协议的内容,属性协议通讯操作的对象是属性实例 ...
- android ble 蓝牙绑定流程,android BLE蓝牙开发
蓝牙BLE设备是目前比较热门的设备.由于BLE有低功耗等特点,被广泛应用到身边的电子产品上.如智能手表.手环.防丢器等各种产品上.最近研究一下android上的ble应用开发.跟大家分享一下相关的内容 ...
- 蓝牙 4.0 ATT属性协议
转自:https://mp.weixin.qq.com/s?__biz=MjM5MzM4MDM3Mw%3D%3D&chksm=b28fa48285f82d94f2b1ac8a7486a9c75 ...
- 蓝牙的ATT协议(属性协议)和GATT协议
蓝牙协议分为 ATT(属性协议) 主要定义了属性 和 GATT将"属性"分装为服务和特征值 . ATT :attribute 包含四个字段,类型,句柄,权限,值 类型:由一个128 ...
- 蓝牙核心规范(V5.2)7.5-深入详解之ATT(属性协议)
蓝牙篇之蓝牙核心规范(V5.2)深入详解汇总 目录 ATT协议和服务器.客户端直接的关系 1.ATT协议速读 2.ATT协议
- Android BLE(1)---蓝牙通讯学习
Android BLE蓝牙通讯学习 在app应用的开发过程中,一般和蓝牙接触的不多,但是随着智能穿戴设备的发展,穿戴设备和手机关联的app越来越多,之前也是没怎么接触过这一块的东西,正好最近需要做一个 ...
最新文章
- 【渝粤题库】广东开放大学 商务翻译实务 形成性考核
- boost学习之boost::lock_guard源码分析
- OSChina 周五乱弹 ——变态要从娃娃抓起
- 【linux】web socket
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
- 傅里叶变换和拉普拉斯变换
- 四叉树——图片应用实例
- c语言循环接收按键,C语言中,如何用键盘输入来退出循环
- android x86 win8 双系统,win8.1安卓双系统安装教程:安卓win8.1二合一双系统安装步骤...
- 关于“嵌入式系统设计师”的了结。
- IntelliJ IDEA2021.1中英文菜单对照
- 手机中的RAM和ROM分别对应电脑的内存和硬盘
- 简单模拟医院叫号系统
- 零基础入门网络安全最直线距离的学习路线
- Python Flask项目部署
- 一刀工具箱 - 密码生成器
- matlab画图高级,[转载]Matlab绘图系列之高级绘图
- Excel2002制作自动记录考勤表(转)
- matlab双对数纵坐标,双对数坐标的两个坐标轴上的数值是什么样的对应关系?
- mysql数据库:Xtrabackup安装以及应用
热门文章
- Excel用SQL合并多个工作表
- 安全漏洞之host头攻击漏洞
- Java使用aspose合并两个PDF文件
- a113 智能音箱芯片方案_智能音箱九大芯片方案商及其生产厂商和代表作品介绍...
- 【甄选靶场】Vulnhub百个项目渗透——项目十:stapler-1(文件上传,多方式提权)
- OKR | 我们的目标是称霸全国!
- 学习软件测试有哪些优势?
- CAD创建以及自动加载脚本文件*scr
- 内网渗透靶场(上)加入目标网段,抓取管理员密码 #zkaq
- Ubuntu 18.04 ibus安装配置中文拼音输入法