STM32提高篇: 蓝牙通讯

news2025/4/25 6:32:57

STM32提高篇: 蓝牙通讯

  • 一.蓝牙通讯介绍
    • 1.蓝牙技术类型
  • 二.蓝牙协议栈
    • 1.蓝牙芯片架构
    • 2.BLE低功耗蓝牙协议栈框架
  • 三.ESP32-C3中的蓝牙功能
    • 1.广播
    • 2.扫描
    • 3.通讯
  • 四.发送和接收

一.蓝牙通讯介绍

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDAQ、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4 GHz(2.4 至 2.485 GH) ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

1.蓝牙技术类型

蓝牙协议包括两种技术:BR:Basic Rate和LE:Low Energy。
这两种技术都包括搜索(discovery)管理、连接(connection)管理等机制,但它们是相互独立的,不能互通的技术!
厂商如果只实现了一种,那么只能与同样实现该技术的设备互通。如果厂商要确保能和所有的蓝牙设备互通,那么就只能同时实现两种技术,而不去管是否真的需要。
经典蓝牙(BR/EDR)
BR:Basic Rate是正宗的蓝牙技术,可以包括可选的EDR(Enhanced Data Rate)技术,以及AMP(Alternate MAC and PHY layer extension)。
BR:最早期的蓝牙技术,速度只能达到721.2Kbps,在那个年代,已为高大上了。·EDR:随着技术的提升,使用EDR技术的蓝牙,理论速率可以达到2.1Mbps。
AMP:使用AMP技术的蓝牙,理论速率可以达到54Mbps。蓝牙自身的物理层和AMP技术差异明显,BR/EDR和AMP是不能同时使用的。简单的说,就是:BR和EDR是可以同时存在的,但BR/EDR和AMP只能二选一。
低功耗蓝牙(BLE)
上面所讲的BR技术的进化路线,就是传输速率的加快、加快、再加快。但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。这就是Bluetooth LE(称作蓝牙低功耗)产生的背景。
低功耗蓝牙与经典蓝牙使用相同的2.4GHz无线电频率,因此双模设备可以共享同一个天线。低功耗蓝牙使用的调制系统更简单。BLE技术相比BR技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。目前BLE主要广泛应用于引IoT(Internet of Things:物联网)产品领域。

二.蓝牙协议栈

蓝牙协议栈极其复杂,官方协议说明书大概有800多页。我们只做一个大致了解。芯片厂家一般都封装好了,我们直接使用即可。

1.蓝牙芯片架构

蓝牙的核心系统,由一个Host和一个或多个Controller组成。
(1)BT Host:逻辑实体,在HCI(Host Controller Interface)的上层。
(2)BT Controller:逻辑实体,在HCI(Host Controller Interface)的下层。
根据Host与Controller的组成关系,常见的蓝牙芯片也分为以下几种:
(1)单模蓝牙芯片:单一传统蓝牙的芯片,单一低功耗蓝牙的芯片。即(1个Host结合1个Controller)
(2)双模蓝牙芯片:同时支持传统蓝牙和低功耗蓝牙的芯片。即(1个Host结合多个Controller)
在这里插入图片描述
蓝牙协议是通信协议的一种,一般而言,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝牙协议的代码。

2.BLE低功耗蓝牙协议栈框架

要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己的应用。
可以看出BLE协议栈是连接芯片和应用的桥梁,是实现整个BLE应用的关键。
简单来说,BLE协议栈主要用来对你的应用数据进行层层封包,以生成一个满足BLE协议的空中数据包,也就是说,把应用数据包裹在一系列的帧头(header)和帧尾(tail)中。
蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)。
蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;
蓝牙应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,百花齐放,定义出各种各样的策略,如FTP、文件传输、局域网等等。
在这里插入图片描述
而蓝牙核心协议(Bluetooth Core)又包含BLE Controller和BLE Host两部分。Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。
在这里插入图片描述
物理层(Physical Layer,PHY)
PHY 层主要负责在物理信道上发送和接收信息包。Bluetooth LE 使用 40 个射频信道。频率范围:2402 MHz 到 2480 MHz。
链路层(Link Layer,LL)
LL 层主要负责创建、修改和释放逻辑链路(以及,如果需要,它们相关的逻辑传输),以及与设备之间的物理链路相关的参数的更新。它控制链路层状态机处于准备、广播、监听/扫描、发起连接、已连接五种状态之一。
主机控制接口层(Host Controller Interface,HCI)
HCI 层向主机和控制器提供一个标准化的接口。该层可以由软件 API 实现或者使用硬件接口 UART、SPI、USB 来控制。
通用访问配置文件层(Generic access profile,GAP)
GAP 层代表所有蓝牙设备通用的基本功能,例如传输、协议和应用程序配置文件使用的模式和访问程序。GAP 服务包括设备发现、连接模式、安全、身份验证、关联模型和服务发现。
逻辑链路控制及自适应协议层(Logical Link Control and Adaptation Protocol,L2CAP)
L2CAP 层负责对主机和协议栈之间交换的数据进行协议复用能力、分段和重组操作。
安全管理层(Security Manager,SM)
SMP 层用于生成加密密钥和身份密钥。SMP 还管理加密密钥和身份密钥的存储,并负责生成随机地址并将随机地址解析为已知设备身份。
属性协议层(Attribute protocol,ATT)
简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
通用属性配置文件层(Generic Attribute profile,GATT)
GATT 层表示属性服务器和可选的属性客户端的功能。该配置文件描述了属性服务器中使用的服务、特征和属性的层次结构。该层提供用于发现、读取、写入和指示服务特性和属性的接口。

三.ESP32-C3中的蓝牙功能

ESP32-C3支持Bluetooth 5(LE)。下载好固件之后(我们前面下载的固件已经支持wifi和蓝牙了), STM32仍然可以通过AT指令操作蓝牙。
BLE角色划分:
LL:设备可以划分为主机和从机,从机广播,主机可以发起连接。
GAP:定义了 4 种特定角色:广播者、观察者、外围设备 和 中心设备。
GATT:设备可以分为服务端和客户端。

1.广播

广播是指从机(服务器)每经过一个时间间隔发送一次广播数据包,这个时间间隔称为广播间隔,这个广播动作叫做广播事件,只有当从机处于广播状态时,主机(客户端)才能发现该从机(服务器)。
在每个广播事件中,广播包会分别在37、38和39三个信道上依次广播,如下图所示。
在这里插入图片描述
广播数据包一般包含可读的设备名称,设备是否可连接等信息。

2.扫描

扫描是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。

3.通讯

主从之间的通信是通过GATT的Profile来完成的,Profile可以理解为配置,数据格式等。
从机作为GATT的Server端,用来定义和存储Profile。Profile包含一个或者多个Service,每个Service又包含一个或者多个Characteristic,Characteristic是主从通信的最小单元。
主机作为GATT的Client端,用来发现和获取从机的Service和Characteristic,从而与之通信。
在这里插入图片描述
关于服务 Service和特征值Characteristic的概念。每个服务和特征值都有自己的唯一标识 UUID,标准UUID为128位,蓝牙协议栈中一般采用16位,也就是两个字节的UUID格式。
一个从机设备包括一个或者多个服务;一个服务中又可以包括一条或者多条特征值,每个特征值都有自己的属性 Property,属性的取值有:可读 Read,可写 Write 以及通知 Notify。

四.发送和接收

ESP32C3发送AT指令使用蓝牙功能。
蓝牙初始化:

void Inf_ESP32_BLE_Init(void)
{
    /* 0. 关闭wifi功能(清理wifi驱动) */
    Inf_ESP32_SendCmd("AT+CWINIT=0\r\n");

    /* 1. 初始化为服务器模式 */
    Inf_ESP32_SendCmd("AT+BLEINIT=2\r\n");

    /* 2. 创建服务 */
    Inf_ESP32_SendCmd("AT+BLEGATTSSRVCRE\r\n");

    /* 3. 开启提供的所有服务 */
    Inf_ESP32_SendCmd("AT+BLEGATTSSRVSTART\r\n");

    /* 4. 设置广播参数 */
    Inf_ESP32_SendCmd("AT+BLEADVPARAM=50,50,0,0,7,0,,\r\n");

    /* 5. 自动广播参数设置 */
    Inf_ESP32_SendCmd("AT+BLEADVDATAEX=\"ble-teacher\",\"A102\",\"0112030405\",1\r\n");

    /* 6. 开始广播 */
    Inf_ESP32_SendCmd("AT+BLEADVSTART\r\n");

    /* 透传模式: 必须等待有客户端连接之后才能开启.
        连接之前可以先设置一下 透传 的一些参数

     */
    /* 7. 设置透传的一些参数 */
    Inf_ESP32_SendCmd("AT+BLESPPCFG=1,1,7,1,5\r\n");
}

发送数据:
直接使用Transmit。

void Inf_ESP32_BLE_SendData(uint8_t data[], uint16_t dataLen)
{
    if(dataLen == 0) return;
    HAL_UART_Transmit(&huart2, data, dataLen, 2000);
}

接收数据:

/*
当连接成功之后:
    +BLECONN:0,"7f:b3:6a:19:f4:35"  开启透传

    +BLECONNPARAM:0,0,0,6,0,500

    +WRITE:0,1,7,1,2,
    +BLECONNPARAM:0,0,0,40,0,500
选择服务和特征:
    +WRITE:0,1,7,1,2,
    +WRITE:0,1,7,1,2,
    +WRITE:0,1,7,1,2,
    +WRITE:0,1,7,1,2,
传送数据:
    +WRITE:0,1,5,,4,abcd

关闭连接的时候:
    +BLEDISCONN:0,"41:74:6e:e5:05:a8"

*/
void Inf_ESP32_BLE_ReadData(uint8_t data[], uint16_t *dataLen)
{
    *dataLen = 0;

    if(rxSize == 0) return;

    /* 开始对数据进行解析处理 */
    if(strstr((char *)rxBuff, "+BLECONN:")) /* 表示有客户端连接进来 */
    {
        /* 开启透传模式 */
        printf("有客户端连接,准备开启透传...\r\n");
        Inf_ESP32_SendCmd("AT+BLESPP\r\n");
        printf("透传开启成功...\r\n");
    }
    else if(strstr((char *)rxBuff, "+BLEDISCONN:"))
    {
        /* 如果连接断开, 应该关闭透传模式 */
        printf("客户端退出,关闭透传模式 \r\n");
        HAL_UART_Transmit(&huart2, "+++", 3, 2000);
        HAL_Delay(1500);
        /* 重新广播 */
        printf("重新开始广播\r\n");
        Inf_ESP32_SendCmd("AT+BLEADVSTART\r\n");
    }
    else if(strstr((char *)rxBuff, "+BLECONNPARAM:") || strstr((char *)rxBuff, "+WRITE"))
    {
        /* 什么都不做 */
    }
    else
    {
        /* 真正的透传数据 */
        memcpy(data, rxBuff, rxSize);
        *dataLen = rxSize;
    }

    memset(rxBuff, 0, rxSize);
    rxSize = 0;
}

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

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

相关文章

SpringMVC处理请求映射路径和接收参数

目录 springmvc处理请求映射路径 案例:访问 OrderController类的pirntUser方法报错:java.lang.IllegalStateException:映射不明确 核心错误信息 springmvc接收参数 一 ,常见的字符串和数字类型的参数接收方式 1.1 请求路径的…

【程序员 NLP 入门】词嵌入 - 上下文中的窗口大小是什么意思? (★小白必会版★)

🌟 嗨,你好,我是 青松 ! 🌈 希望用我的经验,让“程序猿”的AI学习之路走的更容易些,若我的经验能为你前行的道路增添一丝轻松,我将倍感荣幸!共勉~ 【程序员 NLP 入门】词…

从物理到预测:数据驱动的深度学习的结构化探索及AI推理

在当今科学探索的时代,理解的前沿不再仅仅存在于我们书写的方程式中,也存在于我们收集的数据和构建的模型中。在物理学和机器学习的交汇处,一个快速发展的领域正在兴起,它不仅观察宇宙,更是在学习宇宙。 AI推理 我们…

大模型AI的“双刃剑“:数据安全与可靠性挑战与破局之道

在数字经济蓬勃发展的浪潮中,数据要素已然成为驱动经济社会创新发展的核心引擎。从智能制造到智慧城市,从电子商务到金融科技,数据要素的深度融合与广泛应用,正以前所未有的力量重塑着产业格局与经济形态。 然而,随着…

操作系统概述与安装

主流操作系统概述 信创平台概述 虚拟机软件介绍与安装 windows server 安装 centos7 安装 银河麒麟V10 安装 一:主流服务器操作系统 (1)Windows Server 发展历程: 1993年推出第一代 WindowsNT(企业级内核&am…

开发了一个b站视频音频提取器

B站资源提取器-说明书 一、功能说明 本程序可自动解密并提取B站客户端缓存的视频资源,支持以下功能: - 自动识别视频缓存目录 - 将加密的.m4s音频文件转换为标准MP3格式 - 将加密的.m4s视频文件转换为标准MP4格式(合并音视频流)…

基于javaweb的SpringBoot校园服务平台系统设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

PHYBench:首个大规模物理场景下的复杂推理能力评估基准

2025-04-23, 由北京大学物理学院和人工智能研究所等机构共同创建的 PHYBench 数据集,这是一个专门用于评估大型语言模型在物理场景下的复杂推理能力的高质量基准。该数据集包含 500 道精心策划的物理问题,覆盖力学、电磁学、热力学、光学、现代物理和高级…

Red:1靶场环境部署及其渗透测试笔记(Vulnhub )

环境介绍: 靶机下载: https://download.vulnhub.com/red/Red.ova 本次实验的环境需要用到VirtualBox(桥接网卡),VMware(桥接网卡)两台虚拟机(网段都在192.168.152.0/24&#xff0…

深入详解人工智能数学基础——概率论中的KL散度在变分自编码器中的应用

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

测试模版x

本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…

Openharmony 和 HarmonyOS 区别?

文章目录 OpenHarmony 与 HarmonyOS 的区别:开源生态与商业发行版的定位差异一、定义与定位二、技术架构对比1. OpenHarmony2. HarmonyOS 三、应用场景差异四、开发主体与生态支持五、关键区别总结六、如何选择?未来展望 OpenHarmony 与 HarmonyOS 的区别…

uniapp 仿小红书轮播图效果

通过对小红书的轮播图分析&#xff0c;可得出以下总结&#xff1a; 1.单张图片时容器根据图片像素定高 2.多图时轮播图容器高度以首图为锚点 3.比首图长则固高左右留白 4.比首图短则固宽上下留白 代码如下&#xff1a; <template><view> <!--轮播--><s…

R/G-B/G色温坐标系下对横纵坐标取对数的优势

有些白平衡色温坐标系会分别对横纵坐标取对数运算。 这样做有什么优势呢? 我们知道对数函数对0-1之间的因变量值具有扩展作用。即自变量x变化比较小时,经过对数函数作用后可以把因变量扩展到较大范围内,即x变化较小时,y变化较大,增加了识别数据的识别性。 由于Raw数据中的…

AI赋能安全调度系统:智能升级与功能跃迁

安全调度系统通过AI技术的深度整合&#xff0c;实现了从传统监控到智能决策的质变升级。这种智能化转型不仅提升了系统的响应速度和处理精度&#xff0c;更重塑了整个安全管理的运行范式。以下是AI技术为安全调度系统带来的核心功能强化&#xff1a; 智能风险识别与预警能力跃…

数据结构与算法(十二):图的应用-最小生成树-Prim/Kruskal

相关文献&#xff1a; 数据结构与算法(一)&#xff1a;基础理论 数据结构与算法(二)&#xff1a;线性表的实现 数据结构与算法(三)&#xff1a;线性表算法设计练习 数据结构与算法(四)&#xff1a;斐波那契数列 数据结构与算法(五)&#xff1a;LRU 数据结构与算法(六)&#xff…

项目——高并发内存池

目录 项目介绍 做的是什么 要求 内存池介绍 池化技术 内存池 解决的问题 设计定长内存池 高并发内存池整体框架设计 ThreadCache ThreadCache整体设计 哈希桶映射对齐规则 ThreadCache TLS无锁访问 CentralCache CentralCache整体设计 CentralCache结构设计 C…

系统与网络安全------弹性交换网络(2)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 Eth-Trunk 组网中经常会遇到的问题 链路聚合技术 概述 Eth-Trunk&#xff08;链路聚合技术&#xff09;作为一种捆绑技术&#xff0c;可以把多个独立的物理接口绑定在一起&#xff0c;作为一个大带宽的逻辑…

信息系统项目管理工程师备考计算类真题讲解八

一、风险管理 示例1&#xff1a;EMV 解析&#xff1a;EMV(Expected Monetary Value)预期货币价值。一种定量风险分析技术。通过考虑各种风险事件的概率及其可能带来的货币影响&#xff0c;来计算项目的预期价值。 可以用下面的较长进行表示&#xff1a; 水路的EMV:7000*3/4(7…

优化uniappx页面性能,处理页面滑动卡顿问题

问题&#xff1a;在页面遇到滑动特别卡的情况就是在页面使用了动态样式或者动态类&#xff0c;做切换的时候页面重新渲染导致页面滑动卡顿 解决&#xff1a;把动态样式和动态类做的样式切换改为通过获取元素修改样式属性值 循环修改样式示例 bannerList.forEach((_, index)…