蓝牙ATT协议介绍

news2024/10/6 22:32:58

介绍

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/668672.html

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

相关文章

【软件工程】软件工程期末考试试卷

瀑布模型把软件生命周期划分为八个阶段&#xff1a;问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段&#xff1a;计划阶段、开发阶段和( C)。 A、详细计划 B、可行性分析 C、 运行阶段 D、 测试与排…

JavaScript中的CRUD操作指南示例 - 用DHTMLX创建医院管理系统!

创建、读取、更新和删除(CRUD)是现代web和移动应用程序执行的四个基本功能。然而这些函数是如何产生的&#xff0c;它们到底是做什么的&#xff1f; 在本文中&#xff0c;我们将简要介绍CRUD的含义以及它何时被引入编程的。文中我们还将使用用于医院管理的JavaScript演示应用程…

图文并茂spring-boot3 热部署配置(IntelliJ IDEA 2023.1)

文章目录 &#x1f95a; 版本情况&#x1f9c2; 前言&#xff08;踩坑&#xff09;&#x1f357; 四步完成spring-boot热部署&#x1f957; 1、下载热部署模块&#x1f957; 2、application.yml 或者application.properties添加dev-tools配置&#x1f957; 3、settings中勾选条…

设计服务要考虑的7个维度

我在《软件设计的核心方法及实例解析》里提到软件设计的核心方法是分解和组合。分解粒度上&#xff0c;不同的架构师想法不一样&#xff0c;但是却有一点共性&#xff1a;设计一定要把不稳定的部分做封装&#xff0c;对外暴露稳定的部分&#xff0c;这也是有接口隔离这一原则的…

VS code 可以做什么?

编写 markdown VS code 真的是非常好用的Markdown编写工具&#xff0c;我用他来编写Markdown的时间甚至比写代码还要多。比如&#xff0c;我每周写的公众号文章。 相关插件&#xff1a; MarkdownMarkdown Preview EnhancedMarkdown All in One 编写python 大多数同学写pyth…

LLM - 基于 ChatGLM-6B 的工程配置搭建私有 ChatGPT 中文在线聊天

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper&#xff1a;GLM: General Language Model Pretraining with Autoregressive Blank Infilling 一篇于2022年发表在ACL会…

脑机接口科普0021——黑门01

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 我会在接下来的一段时间内&#xff0c;花一些章节&#xff0c;专门科普介绍一下《黑门》这部国产动漫。 科普《黑门》&#xff0c;源自网友看了我的脑机接口科普文章后&#xff0c;介绍我看黑门这个脑机接口科…

盘点那些 IT 技术面试官常用的 10 个挂人套路

最近几个朋友找我聊天&#xff0c;给我讲述了面试过程中遇到的一些不太理解的事情。作为一个技术面试官&#xff0c;今天来分享 10 个面试相关的套路。 1.自我介绍 自我介绍是一个重要的开始&#xff0c;好的开始是成功的一半。不需要太多花里胡哨的东西&#xff0c;简单、清…

86墙插双联明装新款:蓝奥声智能用电设备安全防护有多强

物理绝缘和智能数据分析安全技术重塑了墙壁插座的安全标准&#xff0c;极大可能规避日常生活中的意外&#xff0c;只有做到意外情况下也不会触电&#xff0c;这样的墙壁插座才能真正叫安全墙壁插座&#xff0c;“不触电且足够安全”应该成为墙壁插座的安全标配标准。 智能物理…

检测 ARP 欺骗

地址解析协议 &#xff08;ARP&#xff09; 是网络通信的基本推动因素。作为网络互联网层和网络链路层之间的桥梁&#xff0c;此网络协议将网络地址 &#xff08;IP&#xff09; 转换为物理层地址&#xff08;MAC 地址&#xff09;。ARP协议支持的地址转换在促进同一LAN中不同网…

给数据库构建一个展示界面

给mySQL构建一个展示界面 这是“构建个人小型医学数据库”系列文章的最后一部分。通过之前的工作我们确定了所要收集的各类变量并将其录入到mySQL数据库中。 为了展示MySQL中存储的数据&#xff0c;通过摸索我们最终使用appML、PHP和JavaScript开发一个展示页面。这些技术可以…

组合式API - provide和inject、Vue3小案例【Vue3】

组合式API - provide和inject 作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据 顶层组件通过provide函数提供数据 provide(key, 顶层组件中的数据)底层组件通过inject函数获取数据 const message inject(key) …

每日学术速递6.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Realistic Saliency Guided Image Enhancement 标题&#xff1a;现实显着性引导图像增强 作者&#xff1a;S. Mahdi H. Miangoleh, Zoya Bylinskii, Eric Kee, Eli Shechtman, Ya…

js创建对象三种方式

创建对象三种方式 1、利用对象字面量创建对象2、利用 new Object 创建对象3、利用构造函数创建对象3.1 构造函数 1、利用对象字面量创建对象 const obj {name: 张三,age: 20 } console.log(obj)结果如下&#xff1a; 2、利用 new Object 创建对象 const obj new Object({…

Jmeter使用||接口测试实战

标题 Jmeter与postman一样&#xff0c;都可以用来进行接口测试。 前面的文章&#xff08; 测试工具介绍||Jmeter的简单使用&#xff09;&#xff0c;介绍了jmeter的下载、安装及简单使用。基于此背景&#xff0c;通过实例的形式&#xff0c;来介绍下如何利用jmeter进行接口测试…

Rancher集群containerd导出镜像

奇墨科技是国内领先的全域IT质量管理平台及服务商&#xff0c;创始团队为在ITSM、公有云&#xff0c;私有云&#xff0c;超融合及安全业务方向服务多年的业界精英团队&#xff0c;尤其具备领先的运维服务和业务理解能力&#xff0c;已服务了大量的世界及中国500强客户&#xff…

【深度学习】3-4 神经网络的学习- 学习算法的实现

神经网络的学习步骤如下所示&#xff1a; 步骤1(mini-batch) 从训练数据中随机选出一部分数据&#xff0c;目标是减小mini-batch的损失函数的值 步骤2(计算梯度) 为了减小mini-batch的损失函数的值&#xff0c;需要求出各个权重参数的梯度 步骤3(更新参数) 将权重参数沿梯度…

redhat 6.4安装oracle11g RAC (四)

创建集群数据库 在节点rac1上用oracle用户执行dbca创建RAC数据库 [rootrac1 ~]# su - oracle [oraclerac1 ~]$ dbca选择创建数据库 自定义数据库&#xff08;也可以是通用&#xff09; 配置类型选择Admin-Managed&#xff0c;输入全局数据库名orcl&#xff0c;每个节点实例SI…

java线上问题排查基本命令

1、jvm基本命令 1.1、java命令 1.1.1、简介 java命令启动java应用程序。它通过启动Java运行时环境&#xff08;JRE&#xff09;、加载指定的类并调用该类的main&#xff08;&#xff09;方法来实现这一点。 1.1.2、命令链接 https://docs.oracle.com/javase/8/docs/techno…

electron 连接打印机打印pdf文件

electron 打印内容 区分系统 类似unix系统的使用 npm包&#xff1a;unix-printwindow系统使用&#xff1a; pdf-to-printer 运行线程 视图线程 函数参数 两个包都提供了print函数来打印文件&#xff0c;配置基本一致&#xff0c;只是参数形式有所不同&#xff0c;pdf-to-pr…