ESP32学习笔记_Bluetooth(1)——蓝牙技术与 BLE 通信机制简介
摘要(From AI):
这篇笔记详细讲解了蓝牙技术的分类、核心架构和通信流程,重点介绍了低功耗蓝牙(BLE)的协议栈、角色划分及连接机制,结合拓扑示例清晰阐述了蓝牙网络配置和操作过程
前言:本文档是本人在《ESP32-C3 物联网工程开发实战(乐鑫科技著)》进行学习时所做的学习笔记,可能存在疏漏和错误,如有发现,敬请指正。
文章目录
- Brief Introduction
- The classification of Bluetooth
- Bluetooth terminology
- Core Architecture
- Bluetooth Roles
- Bluetooth Network Configuration
- Bluetooth Connection Process
参考资料:
《ESP32-C3 物联网工程开发实战(乐鑫科技著)》
Brief Introduction
蓝牙是一种支持设备短距离通信的无线通信技术,能够实现在短距离范围内实现信息的自由分享和传输,具有安全性高、自由连接等特性,工作在 2.4GHz ISM(工业、科学、医学) 频段
蓝牙可分为经典蓝牙和低功耗蓝牙
The classification of Bluetooth
Classic Bluetooth
经典蓝牙(BR/EDR)泛指支持蓝牙协议在 4.0 以下的模块,一般用于大数据量的传输(如语音、音乐),其协议包含个人局域网的各种规范,如:
- Advanced Audio Distribution Profile (A2DP) 适用于音频
- Hands-Free Profiles/Hand-Set Profiles (HFP/HSP) 适用于免提设备
- Serial Port Profiles (SPP) 使用于文本串口透传(可用于蓝牙调试)
- HFP/HSP、HID 等
Bluetooth Low Energy
一种超低功耗无线通信技术,主要针对低成本、低复杂度的无线体域网和无线各域网设计
Bluetooth terminology
Core Architecture
蓝牙的核心系统
Host 主机实现各种业务场景需求,大部分的开发工作基于此Controller 控制器用于蓝牙报文的收发、蓝牙物理连接等功能,由芯片厂商负责实现Host Controller Interface(HCI) 主机控制接口Host 和 Controller 通过 HIC 进行通信
BLE 协议栈

Controller
Physical Layer(PHY) 物理层指定低功耗蓝牙所用的无线频段、调制解调方式等Link Layer(LL) 链路层负责数据发送和接收,但不负责数据解析,是蓝牙协议栈的核心
Host Controller Interface(HCI) 主机控制接口 Host 和 Controller 之间的通信接口,可以是物理形式的(UART、USB 等,常见于双芯片架构),也可以用 API 实现(常见于单芯片架构)
Host
Logical Link Control and Adaptation Protocol(L2CAP) 逻辑链路控制和适配协议向上层协议(协议复用、分段、重组操作)提供连接导向和无连接的数据服务,并按通道进行流量控制和重传Attribute Protocol(ATT) 属性协议用来定义用户命令以及命令操作的数据(如读取或写入);BLE 协议栈引入了 Attribute 概念,用于描述一条条的数据。ATT 除了定义数据,也定义该数据可以使用的 ATT 命令Security Manager Protocol(SMP) 安全管理器协议负责管理 BLE 连接的加密和安全,在保证连接安全的同时不影响用户的体验Generic Attribute Profile(GATT) 通用属性配置文件规范 Attribute 中的数据内容,并运用分组(Group)的概念对 Attribute 进行分类管理Generic Access Profile(GAP) 通用访问配置文件对 LL 的有效数据包进行了一些规范和定义,是解析 LL 负载数据最简单的一种方式,一次 GAP 的功能及其有限,主要用来进行广播、扫描和发起连接等
Bluetooth Roles
蓝牙的角色有以下几种:
- Advertise 广播者
- Scanner 扫描者
- Initiator 发起者
蓝牙通信是指两个或多个蓝牙设备之间的通信,通信双方必须一个是主机,另一个是从机,从机和从机之间不能直接通信,其中:
- Master 主机(主设备)从 Scanner 和 Initiator 转化而来
- Slave 从机(从设备)从 Advertise 转换而来
Master 工作在 Master 模式的设备,可以与一个 Slave 进行连接,在此模式下可以对周围的设备进行搜索并选择需要的 Slave 进行连接
- 一个具备蓝牙通信功能的设备,可以在 Master 和 Slave 之间进行切换,平时工作在 Slave 模式,等待其他 Master 的连接;在有需要时可以转换为 Master,向其他设备发起呼叫
- 一个设备以 Master 发起呼叫时,需要知道对方的蓝牙地址(Bluetooth Address(BD_ADDR))、配对密码(Pairing PIN)等信息,配对完成后可直接发起呼叫
Slave Slave 模式下的设备只能被 Master 搜索,不能主动搜索
Bluetooth Network Configuration
根据拓扑结构,蓝牙网络可分为:
- Piconet 微微网
- Scatternet 散射网
- Mesh
Piconet 微微网
每次简历的蓝牙无线链路,都处于微微网中,一个微微网由两个或更多占用相同物理信道的设备组成(表示这些设备是按照共用时钟和跳频序列进行同步的),其拓扑结构如下:
从机3// //从机1 -------------------- 主机\\\\从机2
拓扑结构(Topology Structure)是指系统中各个节点及其连接关系的组织方式或布局。它广泛应用于网络、工程、数学等领域,用来描述元素之间的连接模式,而不关注实际的物理位置或距离
Scatternet 散射网
如果多个网存在重叠的区域,就可以构成散射网。其中各个 Piconet仍然具有自己的主机,但一个 Piconet 的主机可以同时是另一个 Piconet 的从机,这样该设备就具有双重身份
如下图,此时左侧的主机同时也是右侧的从机
从机1.3 从机2.1/ // // // /
从机1.1 ---------- 主机/从机 ---------- 主机\ \\ \\ \\ \从机1.2 从机2.2
Mesh
蓝牙 4.0 之后诞生了蓝牙 Mesh,用于建立多对多设备通信的低能耗蓝牙网络,允许创建基于多个设备的大型网络,可以包含数十台、数百台甚至数千台蓝牙 Mesh 设备,设备之间可以相互进行数据传输
Bluetooth Connection Process
蓝牙首先需要通过广播或扫描发现周围设备,其次创建连接,最终组建网络传输数据
1. 从机端广播
在大部分情况下,外围设备 (Peripheral,从机) 通过广播自己来让中心设备 (Central,主机) 发现自己,并建立 GATT (通用属性配置文件)连接,从而进行更多的消息交换
也有些情况是不需要连接的,只需要外围设备(外设)广播自己的信息即可,这种方式的主要目的是让外设把自己的消息发送给多个中心设备
- Peripheral 在进行广播时不断发送广播包,每发送一次广播包称为广播事件;每一次发送之间有长度为 t 的广播间隔,也称为广播事件间隔,每次广播事件都会持续一段时间,只有在此期间蓝牙芯片才会打开射频模块发送广播包,功耗较高,其余时间都处于空闲待机状态
- 当广播事件时,每一个事件包含三个广播包,分别在 37、38、39 三个信道同事广播相同的消息
2. 主机端扫描
扫描是在一定范围内用来寻址其他 BLE 设备的过程,扫描者在扫描过程中会使用广播信道,但扫描并没有严格的时间定义和信道规则,其过程按照主机设定的扫描定时参数进行
被动扫描扫描者仅仅监听广播包,而不向广播者发送任何数据- 在扫描过程中,如果控制器接收到符合过滤策略或其他规则的的广播包, 则向主机发送一个报告时间,其中包括广播者的设备地址、、广播包中的数据、信号接收强度
主动扫描Central 在扫描捕获广播包的同时捕获扫描响应包,并作出区分
广播包和扫描响应包
广播包:主要用于设备发现和提供基本信息,适合所有设备接收
扫描响应包:用于增强广播包,满足需要获取更多信息的主动扫描设备需求
3. 主机端连接
连接过程如下
Peripheral(外设,外围设备)开始广播,在发送完一个广播包的T_IFS内,开启射频窗口接收来自中心设备的数据包
↓
Central 接收到广播,在接收后的 T_IFS 内如果开启了 Central 的扫描回复,则 Central 将向 Peripheral 发送回复
↓
Peripheral 收到中心设备的回复后,做好接收准备并返回 ACK 包
↓
如果 Peripheral 发送的 ACK 没有被中心设备接收到,则 Central 将一直发送回复知道超时为止,在此期间内只要外设返回过一次 ACK 就算连接成功
↓
开始建立通信,Central 以接收到外设广播的时间为原点,以连接间隔为周期向 Peripheral 数据包,数据包用于同步两个设备的时钟和建立主从模式的通信,其过程如下:
同步两个设备的时钟Peripheral 每收到 Central 发送的一个数据包,就会重新设置自己的书序原点,以便于 Central 同步- BLE 通信在建立成功后变成主从模式,Central 变成主机模式,Peripheral 变成从机,从机只能在 Central 向它发送一个数据包后才能在规定时间内把自己的数据回传给 Central
- 连接建立成功
- 外设自动停止广播,其他设备无法再查找到此外设
- 在中心设备发送数据包的间隔内,外设可以发送多个数据包
T_ISF 、 ACK 和同步时钟
T_ISF:Inter Frame Space 同一信道上连续传输包之间的时间间隔
ACK
ACK在通信中是接收方对发送方的反馈,用于确认数据包已成功接收。如果没有ACK,发送方无法知道数据是否到达目标,从而无法保障通信的可靠性。ACK机制还可检测数据错误并触发重传,确保数据传输完整无误
同步时钟
同步时钟在通信中用来协调双方的时间基准,确保数据的发送与接收按预期时序进行。如果没有同步时钟,数据可能因时序错乱而丢失或解析错误。在 BLE 中,同步时钟还能优化设备能耗,让设备在需要时准确唤醒,保持高效运行
断开连接
- 在需要断开连接时,只要 Central 停止连接(停止发送数据包)即可
重新连接
- 中心设备可以将外设的 MAC 地址写入 Flash 或是 SRAM 等存储器件,并保持监听此 MAC 地址,当再次收到 Peripheral 发送的广播包时就可以建立通信
- 从机为了省电,当一段时间没有数据要发送时,可以不在发送广播包,双方就会因为连接超时(Connection Timeout)而断开,此时需要 Central 启动监听
MAC地址(Media Access Control Address)是一个设备的唯一硬件地址,用于标识蓝牙设备。每个蓝牙设备在出厂时都会分配一个全球唯一的MAC地址,一个48位(6字节)的数字,通常用16进制表示,格式为
XX:XX:XX:XX:XX:XX,例如A1:B2:C3:D4:E5:F6
相关文章:
ESP32学习笔记_Bluetooth(1)——蓝牙技术与 BLE 通信机制简介
摘要(From AI): 这篇笔记详细讲解了蓝牙技术的分类、核心架构和通信流程,重点介绍了低功耗蓝牙(BLE)的协议栈、角色划分及连接机制,结合拓扑示例清晰阐述了蓝牙网络配置和操作过程 前言:本文档是本人在《ESP32-C3 物联…...
C0034.在Ubuntu中安装的Qt路径
Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录;...
jdbc学习——SQL注入
SQL注入介绍 SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。 用户登录的本质:执行下面的sql语句 select * from tb_user where username zhangsan and password 123; 发生sql注入的本质 解决SQL注入的方…...
JavaEE-线程安全专题
文章目录 线程安全概述线程安全引入线程不安全原因概述 线程是随机调度的 线程安全概述 线程安全引入 线程安全问题是整个多线程专题的最核心也是最重要的章节, 如果不理解线程的安全, 是无法写出正确的多线程的代码的, 我们之前所写的代码都是在单一的线程环境之下写出的 “…...
Android 设备使用 Wireshark 工具进行网络抓包
背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…...
物联网无线局域网WiFi开发(一):WiFi智能家居解决方案
一、WiFi智能家居硬件设计 (一)WiFi智能家居硬件方案 (二)硬件选型方案 二、WiFi开发环境搭建 (一)开发环境搭建 虚拟机lubuntu VirtualBox下载地址:https://www.virtualbox.org/wiki/Downl…...
GMAN解读(论文+代码)
一、注意力机制 注意力机制与传统的卷积神经网络不同的是,前者擅长捕获全局依赖和长程关系,权重会动态调整。而后者对于所有特征都使用同一个卷积核。关于更多注意力机制内容,详见: 注意力机制、自注意力机制、多头注意力机制、通…...
速盾:ddos防御手段哪种比较好?高防cdn怎么样?
DDoS(分布式拒绝服务)攻击是一种威胁网络安全的常见攻击手段。为了保护网站和服务器免受DDoS攻击的影响,许多安全专家和公司开发了各种防御手段。在这篇文章中,我们将重点讨论一种常见的DDoS防御手段——高防CDN(内容分…...
Spring:AOP切入点表达式
对于AOP中切入点表达式,我们总共会学习三个内容,分别是语法格式、通配符和书写技巧。 语法格式 首先我们先要明确两个概念: 切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式 对于切入点的描述,我们其实是有两中方式的&a…...
《文件操作》
一 . 文本文件和二进制文件 根据数据的组织形式,数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。 如果要求在外存上以ASCII 码的形式存储,则需要再存…...
python特殊字符序列
字符 描述 \A 只匹配字符串的开始 \b 匹配一个单词边界 \B 匹配一个单词的非边界 \d 匹配任意十进制数字字符,等价于r[0-9] \D 匹配任意非十进制数字字符,等价于r[^0-9]’ \s 匹配任意空格字符(空格符、tab制表符、换…...
卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)
批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。 一、基本思想 为了让数据在训练过程中保持同一分布…...
LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读
目录 一、概述 二、相关工作 1、LLMs到多模态 2、3D对象生成 3、自回归的Mesh生成 三、LLaMA-Mesh 1、3D表示 2、预训练模型 3、有监督的微调数据集 4、数据集演示 四、实验 1、生成的多样性 2、不同模型text-to-Mesh的比较 3、通用语境的评估 一、概述 该论文首…...
【ESP32CAM+Android+C#上位机】ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输
前言: 本项目实现ESP32-CAM在STA或AP模式下基于UDP与手机APP或C#上位机进行视频流/图像传输。本项目包含有ESP32源码(arduino)、Android手机APP源码以及C#上位机源码,本文对其工程项目的配置使用进行讲解。实战开发,亲测无误。 AP模式,就是ESP32发出一个WIFI/热点提供给电…...
ESP-KeyBoard:基于 ESP32-S3 的三模客制化机械键盘
概述 在这个充满挑战与机遇的数字化时代,键盘已经成为我们日常学习、工作、娱乐生活必不可少的设备。而在众多键盘中,机械键盘,以其独特的触感、清脆的敲击音和经久耐用的特性,已经成为众多游戏玩家和电子工程师的首选。本文将为…...
28.UE5游戏框架,事件分发器,蓝图接口
3-3 虚幻游戏框架拆解,游戏规则基础_哔哩哔哩_bilibili 目录 1.游戏架构 2.事件分发器 2.1UI控件中的事件分发器 2.2Actor蓝图中的事件分发器 2.2.1动态决定Actor的分发事件 2.2.2父类中定义事件分发器,子类实现事件分发器 2.3组件蓝图中实现事件…...
Puppeteer 和 Cheerio 在 Node.js 中的应用
Puppeteer 和 Cheerio 在 Node.js 中的应用 引言 在现代 Web 开发中,自动化测试、数据抓取和页面分析是常见的需求。Node.js 提供了丰富的工具和库来满足这些需求。本文将介绍两个在 Node.js 中常用的库:Puppeteer 和 Cheerio,它们分别用于…...
Unity2D 关于N方向俯视角 中 角色移动朝向的问题
通常对俯视角2d游戏的角色移动我们使用简单2d混合树的方式,但是其不移动时的朝向该如何定义? 十分简单:移动和不移动之间形成逻辑自锁 详细说明思路就是再创建一个简单2d混合树 定义其N方向的idle 并用lastDirc二维向量保存玩家输入,当玩家输…...
pytorch 和tensorflow loss.item()` 只能用于只有一个元素的张量. 防止显存爆炸
loss.item() 是 PyTorch 中的一个方法,它用于从一个只包含单个元素的张量(tensor)中提取出该元素的值,并将其转换为一个 Python 标量(即 int 或 float 类型)。这个方法在训练神经网络时经常用到,…...
链表刷题|判断回文结构
题目来自于牛客网,本文章仅记录学习过程的做题理解,便于梳理思路和复习 我做题喜欢先把时间复杂度和空间复杂度放一边,先得有大概的解决方案,最后如果时间或者空间超了再去优化即可。 思路一:要判断是否为回文结构则…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
