当前位置: 首页 > news >正文

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 类型)。这个方法在训练神经网络时经常用到&#xff0c…...

链表刷题|判断回文结构

题目来自于牛客网,本文章仅记录学习过程的做题理解,便于梳理思路和复习 我做题喜欢先把时间复杂度和空间复杂度放一边,先得有大概的解决方案,最后如果时间或者空间超了再去优化即可。 思路一:要判断是否为回文结构则…...

海盗王集成网关和商城服务端功能golang版

之前用golang把海盗王的商城服务端和网关服务端都重写了一次。 后来在同时开启网关和商城服务时,发现窗口数量有点多,有时要找到商城窗口比较麻烦。 既然2个都是用golang govcl写的,是不是可以集成到一起,方便使用呢?…...

SCI 中科院分区中位于4区,JCR分区位于Q2 是什么水平?

环境: ACM Transactions on Interactive Intelligent Systems 《Acm Transactions On Interactive Intelligent Systems》(《交互式智能系统上的 Acm 事务》)是一本由ASSOC COMPUTING MACHINERY (ACM)出版的Computer Interaction-Computer Science-Human学术刊物&…...

微知-Mellanox网卡的另外一种升级方式mlxup?(mlxup -d xxx -i xxx.bin)

背景 一般升级Mellanox网卡使用flint,还有另外一种叫做mlxup。 NVIDIA 提供了两种固件工具来更新和查询适配器固件: MLXUP - 固件更新和查询实用程序。该实用程序允许扫描服务器计算机以查找可用的 NVIDIA 适配器,并指示每个适配器是否需要…...

《Shader入门精要》透明效果

代码以及实例图可以看github :zaizai77/Shader-Learn: 实现一些书里讲到的shader 在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)​。当开启透明混合后,当一个物体被渲染到屏幕上时&…...

Linux之SELinux与防火墙

一、SELinux的说明 开发背景与目的: SELinux由美国国家安全局(NSA)开发,旨在避免资源的误用。传统的Linux基于自主访问控制(DAC),通过判断进程所有者/用户组与文件权限来控制访问,对…...

深度学习使用LSTM实现时间序列预测

大家好,LSTM是一种特殊的循环神经网络(RNN)架构,它被设计用来解决传统RNN在处理长序列数据时的梯度消失和梯度爆炸问题,特别是在时间序列预测、自然语言处理和语音识别等领域中表现出色。LSTM的核心在于其独特的门控机…...

Vue第一篇:组件模板总结

前言 本文希望读者有一定的Vue开发经验&#xff0c;样例采用vue中的单文件组件&#xff0c;也是我的个人笔记&#xff0c;欢迎一起进步 必须有根元素 这是一个最简单的vue单文件组件&#xff0c;<template></template>被称为模板&#xff0c;模板中必须有一个根元素…...

时钟使能、

时钟使能 如果正确使用&#xff0c;时钟使能能够显著地降低系统功耗&#xff0c;同时对面积或性能的影响极小。但是如果不正确地使用时钟使能&#xff0c; 可能会造成下列后果&#xff1a; • 面积增大 • 密度减小 • 功耗上升 • 性能下降 在许多使用大量控制集的…...

1. Autogen官网教程 (Introduction to AutoGen)

why autogen The whole is greater than the sum of its parts.(整体的功能或价值往往超过单独部分简单相加的总和。) -Aristotle autogen 例子 1. 导入必要的库 首先&#xff0c;导入os库和autogen库中的ConversableAgent类。 import os from autogen import Conversable…...

开源账目和账单

开源竞争&#xff1a; 开源竞争&#xff08;当你无法彻底掌握技术的时候&#xff0c;你就开源这个技术&#xff0c;让更多的人了解这个技术&#xff0c;形成更多的技术依赖&#xff0c;你会说这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子&#xff0c;你不如先砸…...