BLE学习(3):ATT和GATT详解

news2024/12/29 10:26:13

本文章将介绍在面向连接的蓝牙模式中,ATT(attribute protocol,属性协议)和GATT(generic attribute profile,通用属性配置文件)这两个重要的协议层,它与蓝牙的数据传输密切相关。

1 设备之间如何建立连接(Gap层)

若BLE设备之间要进行数据传输,就需要形成一个通信通道。GAP(通用访问配置文件)来负责这个通道的形成和维护。
GAP指示两台将要连接和通信的设备的角色,一台作为Central(一般为智能手机这种功能强大的设备),另一台作为Peripheral(一般指需要较少功率的设备)。设备之间建立连接的流程如下
(1)当作为Peripheral的设备准备好连接时,它必须进入广播状态并在主广播通道(37、38和39)上广播数据包
(2)作为Central的设备必须转换到Scanning状态,并在这三个通道上监听广播包。
(3)当检测到广播包时,Central通过发送连接请求包来向Peripheral发起连接请求。其中,Central设备负责管理连接,可以直接决定连接的一些参数,其中一些参数为:

  • Connection Interval:连接的间隔时间
  • Peripheral Latency:指定Peripheral可以忽略多少的连接事件
  • Channel Map:指定将使用37个数据传输通道中的哪一个进行传输

Central决定这些参数,以连接请求包的方式将这些参数发送到Peripheral,此时就创建了连接。接着,Central将在一个Connection Interval后向Peripheral发送数据包。如果Peripheral接收到数据包并向Central返回一个数据包,则认为连接已经建立。在这里插入图片描述
设备建立连接后,设备之间就可以进行双向数据传输。那么,数据传输到底是如何完成的呢?这就是ATT和GATT要做的事了。

2 ATT

2.1 角色

ATT协议定义了一些角色,每个角色都有它特定的功能。这些角色都是基于Client-Server架构的。

  • 服务器(Server):作为一个数据库,存储可被客户端读写的数据
  • 客户端(Client):请求服务器上的数据

但有一个误区:Central设备将作为ATT的客户端,Peripheral设备将作为ATT的服务端。但实际上CentralPeripheral都既可以做服务端,也可以做客户端。比如,一个可以记录步数、心率等信息的蓝牙智能手环。当手环想向手机传输这些信息的时候,它作为服务端,而手机作为客户端;手环上可以显示当前的时间,这是由手机传过去的,此时手机作为服务端,而手环作为客户端。

2.2 作为服务端时ATT的属性

服务端设备作为一个数据库来存储需要分享给客户端的数据。ATT服务端和Mysql、Oracle这些数据库一样,需要实现:存储和组织数据的方法、访问数据的标准机制。所以,ATT协议负责为服务端设备提供客户端能读写的指定格式化的数据,以及客户端访问、写入和读取数据的机制

1、Attributes
ATT协议定义了一个叫attribute的数据结构,该数据结构由下列四个字段组成:
在这里插入图片描述

  • Attribute Handle :用于给客户端查找一个服务端attributeuint16_t类型的唯一标识符,也就是给attribute一个“地址”
  • Attribute Type (UUID) :全局唯一的2或16字节的UUID标识符,定义储存于Attribute Value中的数值的具体类型和含义,UUID分为两种:Service UUIDCharacteristic UUID
  • Attribute Value:属性值
  • Attribute Permissions:它表示访问Attribute Value的权限,或者说设置一个属性的安全等级。

在服务端,数据以如下Attribute表格形式存储:
在这里插入图片描述
一个BLE服务端的所有Attributes都通过增加Attribute handle的值存储在它的数据库中。

  • 句柄之间可以有空隙,只要保证句柄值是按照递增顺序存储的即可

2、Attribute访问方式

ATT协议还定义了读写属性的方式。具体的方式取决于发起属性访问过程的是客户端还是服务端。
①客户端发起属性访问,有两种操作——WriteRead

  • 客户端使用Read从服务器读取属性的值,服务器响应属性的值。
  • 客户端使用Write将一个属性的值写入服务器,服务器响应写操作是否成功。

②服务端发起属性访问,有两种操作——NotificationIndication
在这里插入图片描述

  • Notification:当Attribute发生改变时,服务端使用该种方式向客户端发送更新后的属性值,客户端收到后不响应此操作
  • Indication:与Notification类似,但是客户端必须发送是否正确收到该Attribute的响应

3、Attribute访问权限
访问权限决定客户端是否可以读、写或读写其中某个属性值,可选权限如下:

  • None:没有读写权限
  • Readable:可读
  • Writable:可写
  • Readable and writable:可读写

注意:Attribute handleAttribute type是公共信息,而Attribute ValueAttribute Permissions是私有信息。为了让客户端可以访问这两个私有信息,服务端需要进行如下操作:

  • 读或写的身份验证
  • 读或写的授权
  • 读或写的加密和配对

从上面的分析可知,ATT协议通过增加属性的句柄数,以线性方式将数据作为Attribute存储在表中。但是,如果我们想要知道存储在服务器上的数据之间的关系,该怎么办呢?

  • 关系:类似于在电脑中文件和文件夹的关系,我们直观地理解同一文件夹中的文件是相关的,这将使得在复杂的关系中的查找变得更加容易。

GATT层负责定义分层数据结构,该结构演示了ATT服务器中存储的数据之间的关系或连接。

3 GATT

GATT协议层定义了一个框架,在该框架中,服务端数据库上的Attribute可以被组织起来而有一定的层次关系。GATT层定义了一个4层树形框架,其中根节点为Profile(配置),它有不同的Services(服务),不同的服务有不同的Characteristics(特征),不同的特征通过一个具体的Value(值)或者Descriptor(描述符)来定义,如下图所示。
在这里插入图片描述
1、Characteristic
Characteristic是一个基本的存储单元,每个Characteristic都是由valueDescriptor(描述符)组成的。

  • Characteristic Value:实际存储的应用数据
  • Descriptor:该字段可选,它会存储更多关于Characteristic的信息,比如Characteristic的范围(如整数类型,定义其范围只能在0~100间)、Characteristic单位等。
    • 一个非常常用的描述符是Client Characteristic Configuration Descriptor (CCCD),它用来使/失能GATT服务端某个CharacteristicIndicationsNotifications功能。当使能了某个Characteristic(CCCD的UUID固定为0x2902)的IndicationsNotifications功能后,每当服务端的该Characteristic值改变的时候,客户端都可以收到通知。

2、Services
Services主要用来组织数据而不是存储数据。一个Service可以包含多个Characteristics,比如对于蓝牙手环来说,有两个Services
①心率:包含两个Characteristics,一个是心率值,一个是CCCD
②设备信息:包含一个Characteristics,即设备信息

3、Profile
Profile是上面分层结构的最顶层,它包含了服务端支持的特定服务。有些服务是可选的,而有些服务是必须实现的,这是为了确保两个有相同GATT profile的设备能够相互通信。


服务端的Attribute Table的一个例子如下图所示,每个ServicesCharacteristics都是使用ATT中的Attributes数据结构描述的,他们都需要先声明。
在这里插入图片描述
同时,GATT层可以响应ATT requests,从而实现读写服务端的数据、获得GATT服务器的primary services和订阅/取消订阅服务端某个characteristicnotifications/indications等功能。

4 总结

  • ATT协议负责管理设备之间的数据存储。它为服务端提供了一种客户端可以进行读写的Attribute数据结构,并为客户端提供了访问、写入和读取数据的机制(访问方法和权限)。
  • GATT层定义了一个层次化的数据结构,它有助于理解存储在服务端中数据(GATT Profile)之间的关系。

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

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

相关文章

Qt5 QML TreeView currentIndex当前选中项的一些问题

0.前言 Qt5 QML Controls1.4 中的 TreeView 存在诸多问题,比如节点连接的虚线不好实现,currentIndex 的设置和 changed 信号的触发等。我想主要的原因在于 TreeView 是派生自 BasicTableView,而 TableView 内部又是由 ListView 实现的。 正…

二、openCV+TensorFlow入门

目录一、openCV入门1 - 简单图片操作2 - 像素操作二、TensorFlow入门1 - TensorFlow常量变量2 - TensorFlow运算本质3 - TensorFlow四则运算4 - tensorflow矩阵基础5 - numpy矩阵6 - matplotlib绘图三、神经网络逼近股票收盘均价(案例)1 - 绘制15天股票K…

编译原理 x - 练习题

简答题逆波兰后缀表达式和三元式序列源程序翻译成中间代码DAG优化正则文法 构造正则表达式正规式 改 上下文无关文法表示DFA有限状态机图移进-规约消除左递归文法-最左推导-短语LL(1)文法LR(0) | SLR(1)文法简答题 编译过程可分为前端和后端,描述一下前端和后端分别…

【设计模式】装饰者模式:以造梦西游的例子讲解一下装饰者模式,这也是你的童年吗?

文章目录1 概述1.1 问题1.2 定义1.3 结构1.4 类图2 例子2.1 代码2.2 效果图3 优点及适用场景3.1 优点3.2 适用场景1 概述 1.1 问题 众所周知,造梦西游3有四个角色,也就是师徒四人,这师徒四人每个人都有自己专属的武器和装备。假定我们以及设…

推荐10个Vue 3.0开发的开源前端项目

Vue 是一款用于构建用户界面的 JavaScript 框,它基于标准 的HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,用以帮助开发者高效地开发用户界面。目前,Vue 3.0正式版也发布了两年的时间,越累越多的开发者也用上了Vue 3.0。 对比Vue2.x,Vue 3.0在…

并发bug之源(二)-有序性

什么是有序性? 简单来说,假设你写了下面的程序: java int a 1; int b 2; System.out.println(a); System.out.println(b);但经过编译器/CPU优化(指令重排序,和编程语言无关)后可能就变成了这样&#x…

【DDR3 控制器设计】(7)DDR3 的用户端口读写模块设计

写在前面 本系列为 DDR3 控制器设计总结,此系列包含 DDR3 控制器相关设计:认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等,附上汇总博客直达链接。 【DDR3 控制器设计】系列…

CSS---复合选择器

目录 一:复合选择器的介绍 二、复合选择器的讲解 (1)后代选择器 (2)子元素选择器 (3)并集选择器 (4)链接伪类选择器 (5)focus伪类选择器 一&…

基于SpringBoot的线上买菜系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SpringBoot 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目…

【Spring系列】- Spring事务底层原理

Spring事务底层原理 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 一个有梦有戏的人 怒放吧德德 🌝分享学习心得,欢迎指正&#xff0…

Vue-CLI的安装、使用及环境配置(超详细)

Vue CLI 是一个基于 Vue 进行快速项目开发的工具。它可以提供可交互式的项目脚手架和运行时的服务依赖,帮助你快速完成一个风格统一、拓展性强的现代化 web 单页面应用。 Vue-CLI 所需环境 Vue-CLI 是一个需要全局安装的NPM包,安装需要在 Node.js 环境下…

一、openCV+TensorFlow环境搭建

目录一、anaconda安装二、tensorflow安装三、Opencv安装四、pycharm新建项目使用Anaconda的环境五、验证环境安装六、tensorflow安装jupyter notebook一、anaconda安装 anaconda官网:https://www.anaconda.com/anaconda下载:https://repo.anaconda.com/…

【k8s】10.网络插件

文章目录一、etcd详解1、etcd的特点2、准备签发证书的环境二、网络插件原理1、flannel1.1 UDP模式(性能差)1.2 VXLAN模式(性能较好)1.3 host-gw模式(性能最高)2、calico插件3、总结一、etcd详解 etcd是Cor…

Redis_第二章_实战篇_第一节_ 短信登录

Redis_第二章_实战篇_第一节_ 短信登录 文章目录Redis_第二章_实战篇_第一节_ 短信登录短信登录1.1、导入黑马点评项目1.1.1 、导入SQL1.1.2、有关当前模型1.1.3、导入后端项目1.1.4、导入前端工程1.1.5 运行前端项目:1.2 、基于Session实现登录流程1.3 、实现发送短信验证码功…

ANDI数据集介绍|补充信息|2022数维杯国际赛C题

目录 1.患者基本信息 2.生物标记物量化值 3.认知评估 4.解剖结构量化值 5.Other 6.上述各信息的bl值 1.患者基本信息 RID (Participant roster ID) ex. 2、PTID (Original study protocol) ex. 011_S_0002、VISCODE (Visit code) ex. bl、SITE ex. 11、COLPROT (Study p…

服务拆分和远程调用(微服务)

博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。 所属专栏:SpringCloud 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我…

课程设计 | 教学设备管理系统

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

SpringCloud微服务(二)——Eureka服务注册中心

Eureka服务注册中心 SpringCloud组件,Eureka已停更。 内容简介 1、Eureka是什么 Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件,以实现中间层服务器的负载平衡和故障转移。服务注册:将服务…

[杂记]算法: 单调栈

0. 引言 单调栈, 顾名思义就是从栈底到栈顶元素单调递增或者单调递减的栈. 往往, 我们在解决寻找一个元素前面/后面的最远/最近处满足某条件的另一个元素的时候可以用到单调栈. 也是用两道算法题作为例子. 在这之前, 先简单写一下构造单调栈的模板. 如果我们需要从一个数组中…

ES6 入门教程 18 Iterator 和 for...of 循环 18.7 for...of 循环

ES6 入门教程 ECMAScript 6 入门 作者:阮一峰 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录ES6 入门教程18 Iterator 和 for...of 循环18.7 for...of 循环18.7.1 数组18.7.2 Set 和 Map 结构18.7.3 计算生成的数据结构18.7.4 类似…