ESP32蓝牙系列二:协议和规范

news2025/2/27 9:09:44

本文以ESP32的API接口对GAP GATT ATT再做分析

一、GAP

ESP32 BLE 通⽤用访问规范 (GAP) 接口 API 的实现和使⽤用流程, GAP 协议层定义了了 BLE 设备的发现流程,设备管理理和设备连接的建立。

BLE GAP 协议层采⽤用 API 调⽤和事件 (Event) 返回的设计模式,通过事件返回来获取 API在协议栈的处理理结果。当对端设备主动发起请求时,也是通过事件返回获取对端设备的状态。 BLE 设备定义了了四类 GAP ⻆色:

广播者 (Broadcaster):处于这种⻆色的设备通过发送⼴广播 (Advertising) 让接收者发

现⾃己。这种⻆角⾊色只能发⼴播,不能被连接。

观察者 (Observer):处于这种⻆角⾊色的设备通过接收⼴广播事件并发送扫描 (Scan) 请

求。这种⻆角⾊色只能发送扫描请求,不能被连接。

外围设备 (Peripheral):当广播者接受了了观察者发来的连接请求后就会进⼊入这种⻆角

⾊色。当设备进⼊入了了这种⻆色之后,将会作为从设备 (Slave) 在链路路中进⾏行行通信。

中央设备 (Central):当观察者主动进⾏行行初始化,并建⽴立⼀一个物理理链路路时就会进⼊入这角色。这种角色在链路路中同样被称为主设备 (Master)。

1、BLE广播流程

1.1使⽤用 public 地址进行广播
使⽤用 public 地址进⾏行广播时,需要将 esp_ble_adv_params_t 成员 own_addr_type 设置为BLE_ADDR_TYPE_PUBLIC,广播流程图如下:

1.2使用可解析地址进⾏广播

使用可解析地址进⾏广播时,底层协议栈会 15 分钟更更新一次广播地址,需要将esp_ble_adv_params_t 成员 own_addr_type 设置为 BLE_ADDR_TYPE_RANDOM,⼴广播流程图如下:

1.3使用静态随机地址进⾏广播

与使⽤可解析地址进⾏广播一样,使用静态随机地址进行广播也需要将esp_ble_adv_params_t 成员 own_addr_type 设置为 BLE_ADDR_TYPE_RANDOM,⼴广播流程图如下:

2、BLE 广播类型介绍

BLE⼴广播主要有 5 种类型,分别为:可连接可扫描非定向广播 (Connectable scannable undirected event type)、⾼高占空⽐比定向⼴广播 (High duty cycle directed event type)、可扫描⾮非定向⼴广播 (Scannable undirected event type)、不不可连接⾮非定向⼴广播 (Non-connectable undirected event type)、可连接低占空⽐比定向⼴广播 (Connectable low duty cycle directed event type)。

二、GATT

ATT 属性协议规定了了在 BLE 中的最小数据存储单位,而 GATT 规范则定义了如何⽤用特性值和描述符表示⼀一个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备拥有哪些服务和数据。

GATT 规范引进了了特性值的概念。这是由于在某些时候,一个数据可能并不只是单纯的数值,还会带有⼀些额外的信息:

•比如这个数据的单位是什什么?是重量量单位千克 kg、温度单位摄⽒氏度℃,还是其他单位;

•比如希望具体告知对⽅方这个数值的名称,例例如同为温度属性 UUID 下,希望告知对方该数据表示“主卧温度”,另⼀个数据表示“客厅温度”;

• 比如在表示 230000、 460000 等大数据时,可以增加指数信息,告知对⽅方该数据的指数是 10^4,这样仅需在空中传递 23、 46 即可。

因此GATT 规范引进了描述符的概念,每种描述符可以表达一种意思,⽤户可使⽤用描述符,描述数据的额外信息。必需说明的是,每个数据和描述符并⾮非一一对应,即一个复杂的数据可以拥有多个描述符,⽽而一个简单的数据可以没有任何描述符。
数据本身的属性值及其可能携带的描述符,构成了了特性 (Characteristic)* 的概念。数据特性包含以下几个部分:

特性声明 (Characteristic Declaration):主要告诉对⽅方此声明后⾯面跟的内容为特性数值。从当前特性声明开始到下⼀一个特性声明之间的所有句句柄 (Handle) 将构成一个完整的特性。此外,特性声明还包括紧跟其后的特性数值的可写可读属性信息。

特性数值 (Characteristic Value):特性的核⼼心部分,一般紧跟在特性声明后⾯面,承载特性的真正内容。

描述符 (Descriptor)描述符可以对特性进⾏行行进⼀一步描述,每个特性可以有多个描述

符,也可以没有描述符。

BLE 协议中会把⼀些常⽤用的功能定义成一个个的服务 (Service)*,例如把电池相关的特性和行为定义成电池服务 (Battery Service);把⼼心率测试相关的特性和⾏行行为定义成⼼心跳服务(Heart Rate Service);把体重测试相关的特性和⾏行行为定义成体重服务 (Weight Scale Service)。

可以看到,每个服务包含若干个特性,每个特性包含若干个描述符。用户可以根据自己的应用需求选择需要的服务,并组成最终的产品应⽤用。

一个完整服务的特性定义参考如下:

基于 ESP32 IDF 建立 GATT 服务

属性表的结构体规定了了户为了描述⼀个属性⽽需要初始化的元素,通过esp_gatts_attr_db_t 进⾏定义,总结如下:

基于 ESP32 IDF 发现对⽅方设备的服务信息(GATT 客户端)
GATT 客户端需要具有发现对⽅方设备的服务和特性的功能 (Service Discovery)。不同的设备可能会使⽤不同的发现流程,下面以查找对方设备的 GATT 服务为例介绍一下 ESP32 IDF使用的服务发现过程:

首先发现对方所有的 Service 信息,包括 Service 的 UUID 和 Handle 范围

- GATT Service, UUID 0x1801, Handles 0x0001~0x0005

- GAP Service, UUID 0x1800, Handles 0x0014~0x001C

然后在 GATT 的 Handle 范围内 (0x0001~0x0005),继续查找所有的特性 (0x2803)

- 找到特性 "Service Change Characteristic”, Handles 0x0002~0x0003

- 其中 0x0002 对应的是这个特性的特性声明

- 其中 0x0003 对应的是这个特性的特性值

- 所以每个特性⾄至少需要占据 2 个 Handle 的属性

既然 GATT Service 的 Handles 范围是 0x0001~0x0005,所以在 0x0003 后⾯面可能跟有相应的描述符,因此继续从 0x0004 开始查找所有的描述符

- 其中 0x0004 对应的是 “Client Characteristic Configuration” 描述符

- 其中 0x0005 暂时没有任何信息,可能是为这个 Service 预留留的 Handle

三、ATT

BLE 里面的数据以属性 (Attribute)方式存在,每条属性由四个元素组成:

属性句柄 (Attribute Handle):正如我们可以使⽤用内存地址查找内存中的内容⼀一样,

ATT 属性的句句柄也可以协助我们找到相应的属性,例例如第⼀一个属性的句句柄是

0x0001,第二个属性的句句柄是 0x0002,以此类推,最⼤大可以到 0xFFFF。

属性类型 (Attribute UUID):每个数据有⾃自⼰己需要代表的意思,例如表示温度、发射

功率、电池等各种各样的信息。蓝牙组织 (Bluetooth SIG) 对常用的⼀一些数据类型

进⾏了归类,赋予不同的数据类型不同的标识码 (UUID)。例如 0x2A09 表示电池信

息, 0x2A6E 表示温度信息。 UUID 可以是 16 ⽐比特的 (16-bit UUID),也可以是 128 比

特的 (128-bit UUID)。

属性值 (Attribute Value):属性值是每个属性真正要承载的信息,其他 3 个元素都是

为了让对⽅方能够更更好地获取属性值。有些属性的⻓长度是固定的,例例如电池属性

(Battery Level) 的⻓长度只有 1 个字节,因为需要表示的数据仅有 0~100%,⽽而 1 个字

节足以表示 1~100 的范围;⽽而有些属性的⻓长度是可变的,例例如基于 BLE 实现的透

传模块。

属性许可 (Attribute Permissions):每个属性对各⾃自的属性值有相应的访问限制,⽐比

如有些属性是可读的、有些是可写的、有些是可读⼜又可写的等等。拥有数据的⼀一⽅方

可以通过属性许可,控制本地数据的可读写属性。

我们把存有数据(即属性)的设备叫做服务器器 (Server),⽽而将获取别人设备数据的设备叫做客户端 (Client)。下⾯面是服务器和客户端间的常⽤用操作:

客户端给服务端发数据通过对服务器器的数据进行写操作 (Write),来完成数据发送工作。写操作分两种,一种是写⼊入请求 (Write Request),一种是写⼊入命令 (WriteCommand),两者的主要区别是前者需要对⽅方回复响应 (Write Response),⽽而后者不需要对⽅方回复响应。

服务端给客户端发数据,主要通过服务端指示 (Indication) 或者通知 (Notification) 的

形式,实现将服务端更更新的数据发给客户端。与写操作类似,指示和通知的主要区

别是前者需要对⽅方设备在收到数据指示后,进⾏行行回复 (Confirmation)。

客户端也可以主动通过读操作读取服务端的数据

服务器器和客户端之间的交互操作都是通过上述的消息 ATT PDU 实现的。每个设备可以指定自己设备⽀支持的最⼤大 ATT 消息⻓长度,我们称之为 MTU。 ESP32 IDF ⾥里里⾯面规定 MTU 可以设置的范围是 23~517 字节,对属性值的总⻓长度没有做限制。

如果用户需要发送的数据包⻓长度⼤大于 (MTU-3)*,则需要调⽤用准⼊入写入请求 (Prepare Write Request) 来完成数据的写操作。同理理,在读取一个数据时候,如果数据的长度超过 (MTU- 1),则需要通过大对象读取请求 (Read Blob Request) 来继续读取剩余的值。

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

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

相关文章

从零开始学习在VUE3中使用canvas(四):globalAlpha(全局透明度)

一、简介 在canvas中,我们可以使用下面的方式设置全局透明度: const ctx canvas.getContext("2d");ctx.globalAlpha 0.5; 当然,在设置透明度的时候也可以直接填充带透明度的颜色 ctx.fillStyle "rgba(175, 20, 184, 0.5…

白酒:新型酶制剂在酿造过程中的作用与应用

随着生物技术的不断发展,新型酶制剂在许多领域都得到了广泛的应用。在豪迈白酒的酿造过程中,新型酶制剂也发挥了重要作用。云仓酒庄紧跟科技前沿,积极探索新型酶制剂在酿造过程中的应用,以提高产品质量和生产效率。 首先&#xff…

YOLOV4-车道线检测-车距离预测

1.前言 最近在看华为的CANN框架,发现了一些很有意思的开源算法(本文所有的代码都出自华为开源git发布的代码),华为最近出了AI PRO开发板,想着现在开发板上用用(不想重新配置环境了,麻烦还累),看着代码有onnx的模型&…

《深入Linux内核架构》第2章 进程管理和调度 (3)

目录 2.5 调度器的实现 2.5.1 概观 2.5.2 数据结构 2.5.3 处理优先级 2.5.3.1 nice和prior 2.5.3.2 vruntime 2.5.3.3 weight权重 2.5.4 核心调度器 2.5 调度器的实现 调度器的任务: 1. 执行调度策略。 2. 执行上下文切换。 无论用户态抢占,还是…

Spring MVC入门(4)

请求 获取Cookie/Session 获取Cookie 传统方式: RequestMapping("/m11")public String method11(HttpServletRequest request, HttpServletResponse response) {//获取所有Cookie信息Cookie[] cookies request.getCookies();//打印Cookie信息StringBuilder build…

大数据主要技术

1.大数据文件系统: GFS(谷歌的分布式文件系统) HDFS(hadoop distrubuted file system)分布式文件系统,衍生自GFS 2.大数据平台 MapReduce :谷歌的大数据处理平台,服务于搜索 Hadoop&#…

C#混淆心得

C#混淆心得 近期遇到混淆C#代码的需求,在网上找了很多办法,在此记录一下。 混淆的本质就是让代码变丑,让别人看不懂。 为什么要混淆: 1.保护核心代码 可以在一定程度上避免别人偷代码,从而保护重要的部分&#xf…

蓝桥杯单片机快速开发笔记——超声波测距

一、原理分析 超声波测距是一种常见的测距方法,其原理是利用超声波在空气中传播的速度恒定且较快的特性,通过发送超声波信号并接收回波,计算出物体与传感器之间的距离。以下是超声波测距的原理和应用: 原理: 发送超声…

Linux安装Mysql5.7数据库

一、前置条件 系统版本:Linux CentOS 7.5 MySQL版本:mysql5.7.31 二、操作步骤 2.1、关闭mysql服务 service mysqld stop 提示使用命令:systemctl stop mysqld.service 2.2、grep查找已安装的mysql服务 rpm -qa | grep -i mysql 2.3、卸载…

机器学习(1)机器学习的概念与应用领域

文章目录 一、前提二、机器学习的概念与应用领域1.认识①亚瑟•塞缪尔的定义②汤姆米切尔的定义 2.相关术语数据术语训练模型术语获得模型后术语 3.应用领域语音识别计算机视觉自然语言处理①自然语言分析②自然语言生成 大数据分析 一、前提 Python语言具有数量庞大且功能相对…

记录一次爬虫接单项目【采集国际淘宝数据】

1.背景 前几天接了一个爬虫的单子,上周六已经完成这个单子,也收到了酬劳(数目还不错,哈哈哈,小喜了一下)。这个项目大概我用了两天写完了(空闲时间写的)。 2.介绍 大概要采集的数据…

Flutter-仿淘宝京东录音识别图标效果

效果 需求 弹起键盘,录制按钮紧挨着输入框收起键盘,录制按钮回到初始位置 实现 第一步:监听键盘弹起并获取键盘高度第二步:根据键盘高度,录制按钮高度计算偏移高度,并动画移动第三步:键盘收起…

深度学习_卷积

卷积 卷积(Convolution)是数学和计算机科学中的一个重要概念,特别在信号处理和图像处理中应用广泛。在信号处理领域,卷积是两个函数之间的一种数学操作,它表示两个函数的重叠部分的积分量。 在图像处理中&#xff0c…

KKVIEW远程: TODESK退出了还能远程吗

Todesk退出了还能远程吗 当我们谈论Todesk或其他远程桌面软件时,一个经常被提及的问题是:当我退出Todesk后,是否仍然可以远程访问我的计算机?为了回答这个问题,我们首先需要了解Todesk的工作原理和远程访问的基本条件…

WhatsApp商业推广有哪些推广技巧?

在现代化商业,与用户创造紧密、良好的互动体验,建立强大的品牌形象以及找到最佳的推广途径,变得尤为重要。而WhatsApp作为全球使用最广泛的即时通讯应用之一,成为无数企业选择优选的推广平台。那么,在WhatsApp商业推广…

图书推荐|西门子S7-1200 PLC编程与应用实例

一线资深工程师的全彩版PLC实战教程,软硬件及编程全方位详解(配视频教学) 本书内容 《西门子S7-1200 PLC编程与应用实例》对西门子S7-1200 PLC的硬件和编程软件的功能进行详细讲解,内容包括PLC编程基础、博途TIA软件入门、指令介…

使用OCC进行切割操作

OCC中切割操作以一个平面作为切割面,对物体进行切割操作 //要操作的图形 TopoDS_Shape shape getHanleShape(); //构造切割面 TopoDS_Shape faceShape getSplitterFace(); //切割操作 BOPAlgo_Splitter splitter; splitter.AddArgument(shape); splitter.AddTool(…

13.Python从入门到精通—Python 集合操作与方法概览

13.Python从入门到精通—Python 集合操作与方法概览 Python 集合集合的基本操作1、添加元素2、移除元素3、计算集合元素个数4、清空集合5、判断元素是否在集合中存在 集合内置方法完整列表 Python 集合 在Python中,集合是一种无序、不重复的数据类型。集合通常用于…

unicloud快速上手,unicloud项目创建以及项目创建注意事项

uniCloud快速上手 本项目地址https://gitee.com/qayrup/unicloud-demo 创建unicloud项目 新建一个uni项目,并选择启用unicloud,选择阿里云或腾讯云 阿里云和支付宝云都支持一个月免费的云,如果只想体验啥的,可以选择这两个, 但是需要注意,支付宝云需要配置跨域,否则很多云函…

0基础学习VR全景平台篇第145篇:图层控件功能

大家好,欢迎观看蛙色VR官方——后台使用系列课程!这期,我们将为大家介绍如何使用图层控件功能。 一.如何使用图层控件功能? 进入作品编辑页面,点击左边的控件后就可以在右边进行相应设置。 二.图层控件有哪些功能&am…