安卓蓝牙ATT协议介绍

news2024/11/18 23:46:33

介绍

ATT,Attribute Protocol,用于发现、读、写对端设备的协议(针对BLE设备)
ATT允许蓝牙远程设备(比如遥控器)作为服务端提供拥有关联值的属性集,让作为客户端的设备(比如手机、电视)来发现、读、写这些属性;同时服务端能主动通知客户端
ATT定义了两种角色: 服务端(Server)和客户端(Client),一个设备可以同时拥有Server和Client;而一个Server可以支持多个Client。
ATT中的属性包含下面三个内容

- Attribute Type       :UUID(Universally Unique IDentifier)来定义 
- Attribute Handle     : 用来访问Attribute Value 
- A set of Permissions  : 控制是否该Attribute可读、可写、属性值是否通过加密链路发送

相关概念

Attribute Type

Attribute Type由UUID唯一指定,UUID是一个128-bit值。但在使用过程中,为了提高效率,使用的是16-bits Attribute UUID,其他bit都是固定值。

128-bit UUID        = 16-bit Attribute UUID*2^96 + Bluetooth_Base_UUID
Bluetooth_Base_UUID = 00000000-0000-1000-8000-00805F9B34FB

更简单的办法如下(xxxx代表十六进制的16-bit UUID)

0000xxxx-0000-1000-8000-00805F9B34FB

TIP: 16-bit Attribute UUIDs与SDP 16-bit UUIDs相同,参考《16-bit UUID Numbers Document.pdf》

Attribute Handle

Attribute Handle是由Server分配的一个唯一且非零16-bit值,用于检索Attribute。

0x0000 : 保留 
0xFFFF : 最大Attribute Handle

Attribute Handle Grouping

Attribute Handle Grouping是一组由高层协议定义的属性,他们位于其他属性之前。
可以这么理解:ATT只是提出Grouping概念,并没有具体说明他怎么实现,而它由高层协议来定义,作用是方便组织、管理、访问很多Attribute。

Attribute Value

Attribute Value以字节为最小单位,可以是1byte的数值,4byte数值、字符串等待,当属性值太长时,可通过多个PDUs发送

Attribute Permissions

属性都有一组与之相关联的Permission Values,一个属性的权限由高层协议定义,并对ATT不可见。也就是说ATT只说明了属性可以被附加上什么权限,而不针对具体某个Attribute需要某种权限。
当访问一个安全属性需要一个认证的链路,而Client没有足够的权限,Server则响应一个Error Code(Insufficient Authentication),Client收到Error Code后应该尝试认证该链路,成功后即可访问该安全属性
当访问一个安全属性需要一个加密的链路,而链路没有加密,Server则响应一个Error Response(Insufficient Encryption),Client收到Error Response后应该尝试加密该链路,成功后即可访问该安全属性
当访问一个安全属性需要一个加密的链路,链路有加密,但是对于所需要的安全级别来说加密Key Size太短
Server则响应一个Error Code(Insufficient Encryption Key Size),Client收到Error Response后应该尝试使用更长的Key Size加密该链路,成功后即可访问该安全属性
Attribute Permissions由下列三个权限组合而成

- Access Permissions         : 决定Client是否可读、写属性值 
    ~ Readable 
    ~ Writable 
    ~ Readable and Writable 
- Authentication Permissions : 决定是否需要一个认证的物理链路(Authenticated Physical Link) 
    ~ Authentication Required 
    ~ No Authentication Required 
- Authorization Permssions   : 决定Client在访问属性值前是否需要授权 
    ~ Authorization Required 
    ~ No Authorization Required

Control-Point Attribute

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

Exchanging MTU Size

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

Long Attribute Value

在单一数据包中可发送最长的属性大小为[ATT_MTU –1] octets;但在一个Attribute PDU中至少包含Attribute Opcode等其他内容,如果属性值比[ATT_MTU-1] octets大则称为Long Attribute,对于Long Attribute

- 使用Read Blob Request来读取整个属性(Attribute > [ATT_MTU-1] octets) 
- 使用Prepare Write Request和Execute Write Request来写整个属性(Attribute > [ATT_MTU-3] octets)

ATT无法决定属性值是否大于[ATT_MTU] octets,但是高层协议Can Tell,最大的属性值为512 octets

Atomic Operation

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

Attribute PDU

Attribute PDU格式如下
在这里插入图片描述
Opcode:每个Attribute PDU都有一个唯一的操作码,用于区分不同的PDU。
Authentication Signature Flag取值如下:

- 1: PDU包含Authentication Signature(12 octets), X为13 
- 0: PDU不包含Authentication Signature, X为1

当Attribute PDU包含Authentication Signature时,则该PDU不应该通过加密链路传输
Command Flag取值如下:

- 1: PDU为一个Command

注意: 只有Write Command可能包含一个Authentication Signature
Method:ATT使用Protocol Methods来发现、读、写、通知、指示属性,方法可分为如下几种。

 - Requests		: Client->Server, 请求回应 
 - Responses		: Server->Client, 响应请求. 
 - Commands		: Client->Server, 命令 
 - Notifications 	: Server->Client, 服务端通知 
 - Indications		: Server->Client, 请求确认 
 - Confirmations 	: Client->Server, Ind确认

在下文的每个PDU的格式里面第一个域都是opcode。ATT只有十几个Opcode,所有没有必要为这些Opcode按6种Protocol Methods进行分类,只要知道它们有不同的用法。
ATT是一种Sequential Protocol,这意味着在执行下一个动作前应该得到相应的回应
ATT将Request-Response和Indication-Confirmation Pair看出一个单一的事务(Transaction)

常见的Attribute PDU

Error Handing

Error Response用来声明一个给定的请求无法完成,并给出原因
在这里插入图片描述
Error Code取值参考core_v4.2 Vol 3, Part F 3.4.1.1, 若Client无法理解(如ErrorCode为更新版本中定义), 则认为是未知原因。

MTU Exchange

  1. Exchange MTU Request
    Client使用MTU Exchange Request来告知所支持的最大接收MTU size,同时请求Server回应Server所支持的最大接收MTU size。
    在这里插入图片描述
    Client Rx MTU>= default ATT_MTU;
    该请求在一个连接中仅发送一次,Client Rx MTU应当设置为Client所能接收ATT PDU的最大值

  2. Exchange MTU Response
    Server使用Exchange MTU Response来回应来自Client的Exchange MTU Request
    在这里插入图片描述
    Server Rx MTU>= default ATT_MTU;Server Rx MTU应当设置为Server所能接收ATT PDU的最大值
    当完成Req-Rsp后,Server和Client将ATT_MTU均设置为Client Rx MTU和Server Rx MTU中的较小值
    ATT_MTU生效时机

 - Server : Response发送后、其他ATT PDU发送前 
 - Client : Response接收后、其他ATT PDU发送前

当其中任一值小于默认ATT_MTU大小时认为该值不正确,此时应当将ATT_MTU设置为默认值
当一个设备同时作为Client和Server,不同角色时ATT_MTU值应当相同(详细规则可参看规范)

  1. Find Information
    A. Find Information Request
    Find Information Request被用来获取与Attribute Handles相关联的类型,Client使用该请求来发现Server上的Attribute-Type列表。
    在这里插入图片描述
    读取所有Attributes
 - Starting Handle : 0x0001 
 - Ending Handle   : 0xFFFF

规则

 - Starting Handle <= Ending Handle : Response PDU或Error Response<Attribute Not Found> 
 - Starting Handle  > Ending Handle : Server回应Error Response<Invalid Handle> 
 - Starting Handle  = 0x0000        : Server回应Error Response<Invalid Handle>

Server不应该回应以下Error Code的Error Response

 - <Insufficient Authentication> 
 - <Insufficient Authorization> 
 - <Insufficient Encryption Key Size> 
 - <Application Error>

B. Find Information Response
在这里插入图片描述
Response PDU中应当包含完整的Handle-UUID对;这意味着Handle-UUID对应该在单一的回应报文中;同时Response PDU按照Handle的升序回应。
Format参数有两个可能值
在这里插入图片描述
在这里插入图片描述
当一个Response PDU无法装下所有的Handle-UUID对时;Client以新的Starting Handle发起另一个Find Information Request来获取未回应的信息。
C. Find By Type Value Request
该Req用来获取指定16-bit UUID Attribute Type和Attribute Value的Attribute Handles
在这里插入图片描述

读取所有Attributes

- Starting Handle : 0x0001 
- Ending Handle   : 0xFFFF

其他规则与Find Information Request相似
D. Find by Type Value Response
在这里插入图片描述
Handles Information List包含一个或多个Handle Information列表
在这里插入图片描述
规则与Find Information Response相似

  1. Reading Attributes
    A. Read By Type Request
    Read By Type Request用来获取Attribute Values(Client已知Attribute Type但不知Attribute Handle)
    在这里插入图片描述
    查找所有Attributes
- Starting Handle : 0x0001 
- Ending Handle   : 0xFFFF
TIP : 所有的Attribute Type通过128-bit UUID进行比较,即使提供的是16-bit UUID

规则

- Starting Handle <= Ending Handle : Response PDU或Error Response<Attribute Not Found> 
- Starting Handle  > Ending Handle : Server回应Error Response<Invalid Handle> 
- Starting Handle  = 0x0000        : Server回应Error Response<Invalid Handle>

该报文中Attribute Type的长度应当相同,否则需要重新发起另一次请求
当Client因为安全原因无法访问时,Server应该回应Error Response

- <Insufficient Authentication> 
- <Insufficient Authorization> 
- <Insufficient Encryption Key Size> 
- <Insufficient Encryption>

一些其他权限原因导致无法读时,则回应

- <Read Not Permitted>

B. Read By Type Response

在这里插入图片描述
Attribute Data Field字段是Attribute Handle-Value列表
在这里插入图片描述
Read By Type Response包含完整的Handle-Value对;这意味着Handle-Value对应该在单一的回应报文中;同时Response PDU按照Handle的升序回应
Handle-Value对的最大长度为255 octets,即Length参数;故最大的Attribute Value为(Length-2)=253 octets
在回应的Handle-Value列表中

- Attribute Value  > (ATT_MTU-4)/253 octets部分 : Client重新请求Read Blob Request来获取 
- Attribute Value <= (ATT_MTU-4)/253 octets部分 : Rsp PDU中回应

C. Read Request
Read Request用来请求Attribute Value
在这里插入图片描述
Attribute Handle应该为一个有效的Handle;否则回应Error Response;因安全问题无法访问的回应同Read By Type Request。
D. Read Response
在这里插入图片描述
当Attribute Value长度超过(ATT_MTU-1)时,前(ATT_MTU-1) octets应该被回应;Client发起Read Blob Request来获取剩下数据
E. Read Blob Request
在这里插入图片描述
用来获取Handle指定Offset的Attribute Value
F. Read Blob Response
在这里插入图片描述
当Value Offset等于Attribute Value的长度时,回应0;当Attribute Value大于(Value Offset + ATT_MTU-1)时,回应Attribute Value从Value Offset开始的(ATT_MTU-1)个octets
G. Read Multiple Request
用来请求两个或更多的属性集的值
在这里插入图片描述
H. Read Multiple Response
在这里插入图片描述
I. Read by Group Type Request
用来请求已知Attribute Type的属性值
在这里插入图片描述
J. Read by Group Type Response
在这里插入图片描述
Attribute Data格式如下
在这里插入图片描述

  1. Writing Attributes
    A. Write Request
    用来写属性值
    在这里插入图片描述
    B. Write Response
    用来通知Client属性值已成功写入
    在这里插入图片描述
    C. Write Command
    用来写属性值,通常为Control-Point Attribute
    在这里插入图片描述
    D. Signed Write Command
    用来写属性值,包含一个Authentication Signature,通常为Control-Point Attribute

在这里插入图片描述

  1. Queued Writes
    将多个属性值写操作以FIFO方式入队,然后再一个原子操作中进行。
    省略。。。。

  2. Server Initiated
    A. Handle Value Notification
    Server可以在任何时候向Client发送Attribute Value的通知

在这里插入图片描述
B. Handle Value Indication
Server可以发送Attribute Value的指示(Indication)
在这里插入图片描述

C. Handle Value Confirmation
用来回应Handle Value Indication,确认Ind已接收

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通用能力及AI核心能力表现优异!合合信息智能文档处理系统(IDP)高评级通过中国信通院评估

数字经济快速发展的背后&#xff0c;全球数据总量呈现出爆发式增长趋势。智能文档处理&#xff08;IDP&#xff09;技术能够高效地从多格式文档中捕捉、提取和处理数据&#xff0c;帮助机构和企业大幅提升文档处理效率&#xff0c;节约时间和人力成本。近期&#xff0c;合合信息…

C语言进阶--字符函数与内存函数

目录 一.字符函数 1.strlen函数 模拟实现strlen 2.strcpy函数 模拟实现strcpy 3.strcat函数 模拟实现strcat strcat能否用于自己追加自己&#xff1f; 4.strcmp函数 模拟实现strcmp 5.strncpy函数 6.strncat函数 7.strncmp函数 模拟实现strncmp 8.strstr函数 模…

哨兵2号数据下载与利用Python处理(波段融合、降采样、可视化、裁剪等)

简单介绍 网址:https://scihub.copernicus.eu/dhus/#/home 哨兵2号(Sentinel-2)是欧洲空间局(European Space Agency,简称ESA)推出的一组遥感卫星,旨在为地球观测和环境监测提供高质量的光学图像数据。 S2MSI2A是哨兵2号卫星的一种传感器。 S2MSI2A是哨兵2号卫星搭载…

huggingface - PEFT.参数效率微调

GitHub - huggingface/peft: &#x1f917; PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 最先进的参数高效微调 (PEFT) 方法 Parameter-Efficient Fine-Tuning (PEFT) 方法可以使预训练语言模型 (PLM) 高效适应各种下游应用程序&#xff0c;而无需微调模型的所有…

记录--Vue3 封装 ECharts 通用组件

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 按需导入的配置文件 配置文件这里就不再赘述&#xff0c;内容都是一样的&#xff0c;主打一个随用随取&#xff0c;按需导入。 import * as echarts from "echarts/core"; // 引入用到的图表…

ctfshow web入门 php特性 web93-97

1.web93 intval($num,0),0代表根据变量类型进行使用哪一种进制进行取整 可以使用8进制&#xff0c;正负数&#xff0c;小数点 payload: 010574 4476.0 4476.0 2.web94 过滤了0&#xff0c;不能使用8进制了&#xff0c;还可以使用小数点&#xff0c;正负数等 payload&#xff1…

【Java算法题】剑指offer_算法之02动态规划

对于动态规划问题&#xff0c;我将拆解为如下五步曲&#xff0c;这五步都搞清楚了&#xff0c;才能说把动态规划真的掌握了&#xff01; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 JZ42 连续子数组的…

CTFshow-pwn入门-栈溢出pwn35-pwn36

pwn35 首先还是先下载pwn文件拖进虚拟机加上可执行权限&#xff0c;使用checksec命令查看文件的信息。 chmod x pwn checksec pwn32位的我们直接拖进ida中反编译&#xff1a; // main int __cdecl main(int argc, const char **argv, const char **envp) {FILE *stream; // […

阿里云 OSS介绍

1、什么是阿里云 OSS&#xff1f; OSS 为 Object Storage Service&#xff0c;即对象存储服务。是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 OSS 具有与平台无关的 RESTful API 接口&#xff0c;可以在任意应用、任意时间、任意地点 存储与访问 任何类型的数据。…

软考:软件工程:软件可行性分析,需求分析,ER实体图,数据流图,状态转换图,数据字典

软考&#xff1a;软件工程: 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &#xff08;1&#…

微信小程序——分页组件的创建与使用

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

使用Aspose.Words将word转PDF并且去水印。

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;Java、工具类、转换、word转pdf、Aspose.Words、后端☀️每日 一言&#xff1a;只要思想不滑坡&#xff0c;办法总比困难多。 前言 在我们日常开发中经常会有将word文档转为PDF的场景&#xff0…

深入理解循环队列----循环数组实现ArrayDeque

我们知道队列这种数据结构的物理实现方式主要还是两种&#xff0c;一种是链队列&#xff08;自定义节点类&#xff09;&#xff0c;另一种则是使用数组实现&#xff0c;两者各有优势。此处我们将要介绍的循环队列其实是队列的一种具体实现&#xff0c;由于一般的数组实现的队列…

IP地址分类

IP地址是TCP/IP协议中非常关键的要素之一&#xff0c;它用于标识网络中的设备和主机。根据使用版本的不同&#xff0c;IP地址分为IPv4和IPv6两种类型。 IPv4&#xff08;Internet Protocol version 4&#xff09;是IP地址的第四个版本&#xff0c;采用32位二进制数来表示IP地址…

JavaWeb之EL表达式和JSTL标签库

文章目录 EL表达式基本介绍EL表达式搜索域数据的顺序EL表达式输出Bean的普通属性&#xff0c;数组属性&#xff0c;List集合属性&#xff0c;Map集合属性EL表达式 - 运算关系运算逻辑运算算数运算empty运算三元运算. 点运算 和 [] 中括号运算符 EL表达式的11个隐含对象EL获取四…

Java中Thread 类的五种基本用法(简介)

目录 一.线程创建 Lambda创建一个线程 基础格式 举例 运行结果 二.线程中断 第一种:设置变量方法 举例 运行结果 第二种:interrupted&#xff08;&#xff09;方法 举例 运行结果 三.线程等待 举例 运行结果 四.线程休眠 举例 五.获取线程实例 举例 运行结果 …

如何用梯度下降法求解数学建模的拟合问题——以logistics增长问题为例

引言 众所周知的是&#xff0c;在大学课程中一般只会教授一种拟合方法(也即参数估计方法)——最小二乘法。这是一种直接求解的方法&#xff0c;非常的有效&#xff0c;不仅是损失最小解&#xff0c;而且是最大似然解。只不过&#xff0c;有一个缺点&#xff0c;它只能解决线性…

Jenkins配置仅合并代码后触发流水线

使用GitLabJenkins集成&#xff0c; 使用Jenkins的Generic WebHook插件&#xff1b;此插件可以作为各个工具间集成使用的通用方式&#xff0c;但是遇到些场景需要写些代码。关于 “合并代码后触发Pipeline”的配置方式&#xff0c; 其实思路简单&#xff0c;实现和让我描述起来…

电脑怎样连接打印机?分享4个简单操作!

为了更方便学习&#xff0c;我买了一个打印机来打印需要用的资料&#xff0c;但是操作了半天还是没连接上&#xff0c;想请问一下有经验的朋友是怎么将打印机与电脑进行连接的呢&#xff1f; 在现代人的工作和生活中&#xff0c;打印机是一个重要的设备。我们可以利用打印机进行…

一文搞懂String、StringBuffer、StringBuilder三者的对比以及扩容机制

String:不可变的字符序列&#xff1b;底层使用char[]存储StringBuffer:可变的字符序列&#xff1b;线程安全的&#xff0c;效率低&#xff1b;底层使用char[]存储StringBuilder:可变的字符序列&#xff1b;jdk5.0新增的&#xff0c;线程不安全的&#xff0c;效率高&#xff1b;…