ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)

简介: 在我们前面 ESP32-C3 的教程中,从基本的外设,到wifi,到最后使用MQTT连接云平台完成了一个简单的项目,我们已经掌握了ESP32-C3 的大部分功能了。但是作为一款蓝牙芯片,蓝牙的使用是必不可少的,今天我们就开始对 ESP32-C3 蓝牙的使用进行学习测试。 蓝牙部分已经不敢叫教学了,为了搞清楚ESP-IDF的那些示例程序到底是关于什么内容,因为自己也是边学习边测试花了大量时间补充蓝牙的基本知识,希望小伙伴指出不足之处!...更新说明,ESP32-C3只支持BLE
在我们前面 ESP32-C3 的教程中,从基本的外设,到wifi,到最后使用MQTT连接云平台完成了一个
简单的项目,我们已经掌握了ESP32-C3 的大部分功能了。
但是作为一款蓝牙芯片,蓝牙的使用是必不可少的,今天我们就开始对 ESP32-C3 蓝牙的使用进行学习测试。 
蓝牙部分已经不敢叫教学了,为了搞清楚ESP-IDF的那些示例程序到底是关于什么内容,
因为自己也是边学习边测试花了大量时间补充蓝牙的基本知识,希望小伙伴指出不足之处!

...更新说明,ESP32-C3只支持BLE                                     2022/5/19

前言

从本文开始我们来进行 ESP32-C3 的蓝牙的学习测试。

ESP32-C3学习 蓝牙 篇系列博文连接:
测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)
测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

首先我们来看看ESP32-C3 的官方关于关于蓝牙部分的基本介绍:
在这里插入图片描述
ESP32-C3 增加了对 Bluetooth LE 5.0 协议的支持,包含 Coded PHY (Long Range) 和扩展广播 (extended advertisement) 功能。它通过引入 FEC 编解码等技术,虽然增加了数据冗余度,但是大幅度增加了设备通信距离(通常为 100 米)。此外,ESP32-C3 还支持蓝牙 Mesh (Bluetooth Mesh) 协议,这使它成为了控制本地网络设备,以及直接与其他 Bluetooth LE 5.0 传感器设备进行通信的强大候选设备之一。

但是说到蓝牙学习,查看一下官方的文档介绍:乐鑫官方ESP32-C3 蓝牙API介绍
在这里插入图片描述

这么多蓝牙API,难道都得学会了怎么用?

所以这里就得明白这些示例的含义,然后学会了哪些API的使用,才能做基本的应用!

用起来才是学习的最终目的嘛!

想着我们可以先看看IDF中蓝牙的例子有哪些,一看吓一跳,我的个天(截了2个屏幕还不够放的……):
在这里插入图片描述

反正看完,头有点大,蓝牙协议的认识,还是当时学习 NRF52832 的时候认真了解过一段时间,但是当时还是因为 NRF52832 在一些项目上已经没有了价格优势,所以也暂停了一段时间,刚接触个蓝牙5.0的框架,还没结合实际代码深入了解。

虽然每个例子都有说明是干什么用的,如下图:
在这里插入图片描述
但是如果连基本的蓝牙协议专有名词都不知道,还是无法明白!

因为专栏的目的是为了能够做一些小的项目,所以还是参考了多方面的资料,就本文的目的,就是争取把ESP32-C3 使用的 ESP-IDF 中 蓝牙的这些 示例程序是干什么了解清楚 。有了基本的了解,我们才知道去学习哪个示例,可以用来干什么!

所以本文应该会不定期的根据自己慢慢学习测试总结的结果进行更新维护!

1、蓝牙基本介绍

介绍这一块我就不班门弄斧了,把一些看到的觉得好的文章拿过来推荐给大家!因为蓝牙这一块的理论,专有名词不是一句两句就能说得清楚的:

在我的另一篇博文中,有一些关于蓝牙的基本介绍:

蓝牙5.0简介、nRF52832 BLE样例工程框架及main函数初始化流程简析

推荐几篇很好的文章:

ESP32 蓝牙开发:原理简述

蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

三种蓝牙架构实现方案(蓝牙协议栈方案)

现在最火的蓝牙5、蓝牙低功耗和经典蓝牙,你知道他们的区别吗?

还有前人写的ESP32的蓝牙博文:

ESP32学习笔记十七之蓝牙通信-Bluetooth

esp32系列(5):esp32 蓝牙架构学习

这里总结性的说明几个重要的点:

1.1 经典蓝牙(BT) 和 低功耗蓝牙(BLE)

蓝牙分为 经典蓝牙(Classic Bluetooth) BT和 蓝牙低功耗(Bluetooth Low Energy) BLE

也可以称为 蓝牙BR/EDR 和 BLE:
在这里插入图片描述
如果要深入了解 经典蓝牙 与 蓝牙BLE的区别,对于本文下面章节《1.3 蓝牙协议栈》的内容也得有一定的了解,或者在上面的推荐文章中,已经掌握了基本的一些理论基础:

比较蓝牙BR / EDR和BLE之间的异同。一个好的起点是协议的物理层(PHY)。PHY包含用于调制和解调模拟信号并将其转换为数字符号的电路。BR / EDR和BLE不同的PHY的四个特性包括信道方案,功耗,延迟和吞吐量。

  • 信道

蓝牙BR / EDR和BLE都在2.4GHz ISM频段内通信,但它们划分频段的信道数不同。蓝牙BR / EDR将频段划分为间隔1 MHz的79个频道。BLE采用更简单的发射器和接收器,因此它将频带划分为间隔2 MHz的40个通道。

  • 功率

BLE低功耗蓝牙的特点就是功耗低,至于功耗的具体数值,随着新版本的不停发布,这里就不给具体数值。

  • 延迟

BLE优于蓝牙BR / EDR的另一个特点是延迟。蓝牙BR / EDR大约需要100 ms才能准备好发送数据。从发射器接收数据到接收器可用数据时,还有100毫秒的延迟。在某些情况下,这会导致相当明显的延迟。它还会导致更高的功耗,因为发送数据所需的额外时间会导致更多的电池消耗。
BLE提供更低的延迟,只需3 ms即可准备发送数据。此外,从发送器接收数据到接收器可用时的等待时间仅为6 ms。这样可以更快地发送数据并节省电力。

  • 吞吐量

终于有了一个经典蓝牙的优势之处,相对来说,低功耗蓝牙的吞吐量肯定会小于经典蓝牙的。
但是到了蓝牙5.0以后,BLE的速度有了大量提升……

应用领域:

经典蓝牙:
1.传声音
蓝牙耳机、蓝牙音箱。移动的如耳机、便携音箱都是基于经典蓝牙协议的。

2.传大量数据
例如某些工控场景,使用Android或Linux主控,外挂蓝牙遥控设备的,
可以使用经典蓝牙里的SPP协议,当作一个无线串口使用。速度比BLE传输快多了。
这里要注意的是,iPhone没有开放

蓝牙BLE
耗电低,数据量小,如遥控类(鼠标、键盘),传感设备(心跳带、血压计、温度传感器、共享单车锁、智能锁、防丢器、室内定位)
1、健康医疗用品
2、定位应用
3、近距离数据采集
4、智能家居应用
5、移动扩展设备
6、汽车电子设备

双模蓝牙:
双模蓝牙是包含经典蓝牙协议,也包含BLE蓝牙协议的双协议模块:
如智能电视遥控器、降噪耳机等。很多智能电视配的遥控器带有语音识别,需要用经典蓝牙才能传输声音。
如果做复杂的按键,例如原本键盘表上没有的功能,经典蓝牙的HID按键协议就不行了,得用BLE做私有协议。
很多降噪耳机上通过APP来调节降噪效果,也是通过BLE来实现的私有通信协议。

在 ESP32-C3 芯片上,只支持 BLE。

关于这个问题,当初我说两者都支持,因为 ESP-IDF 中有经典蓝牙和BLE的示例都有,而且没有深入的测试了解,经过留言区小伙伴的提醒,查阅了相关的资料,确定 ESP32-C3,只支持 BLE。

官方的介绍芯片时是说,ESP32-C3 支持 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE),在《ESP32-C3 系列芯片技术规格书》中也只提到,ESP32-C3 具有 低功耗蓝牙子系统,支持 Bluetooth 5 和 Bluetooth mesh。其中还有一张图也可以说明问题:
在这里插入图片描述

1.2 蓝牙 Mesh和 蓝牙BLE

蓝牙Mesh是一种 网络技术。蓝牙Mesh网络依赖于 蓝牙BLE。

低功耗蓝牙技术是蓝牙Mesh使用的无线通信协议栈。

蓝牙Mesh基于蓝牙BLE低功耗广播

蓝牙Mesh采用蓝牙低功耗广播的方式就行信息发送和接受,将信息从网络当中的某一个节点转发至目的节点,在蓝牙Mesh组网中,这种广播模式也称为网络泛洪。

在ESP32-C3芯片上,ESP-IDF 提供了 蓝牙 Mesh 网络的API,可以直接应用。

1.3 蓝牙协议栈

蓝牙的协议栈我在另一篇博文也介绍过,因为进一步的学习让自己对蓝牙的知识更进一步,这里再来说明一次,还是以BLE协议为主,因为在今后的应用中BLE应该是用得最多的:
在这里插入图片描述
这里我用一张表格总结一下,看起来更加的直观:
在这里插入图片描述

1.4 蓝牙芯片方案的实现

结合蓝牙协议栈的内容,配合上面的推荐文章《三种蓝牙架构实现方案(蓝牙协议栈方案)》,我们可以来说明一下,一般厂家蓝牙方案是怎么设计的:

对于BR/EDR 蓝牙设备类型,Controller 通常包含 无线电处理、基带、链路管理、和可选择的HCI接口层;
对应LE Controller 主要包含LE PHY、链路层、和可选择的HCI;

如果把 BR/EDR Controller 和 LE Controller设 计到一个Controller,就是我们常说的双模蓝牙。

如下图:
在这里插入图片描述
在单芯片方案中,Controller 和 Host,profiles,和应用层都在同一片芯片中;
在网络控制器模式中,Host 和 Controller 是在一起运行的,但是应用 和 profiles 在另外一个器件上,比如 PC 或者其他微控制器,可以通过 UART, USB进行操作;
在双芯片模式中,Controller 运行在一个控制器,而应用层,profiles和 Host 是运行在另外一个控制器上。

对于我们的ESP32-C3芯片而言,我认为是下图这种(有错误清指出!!)
在这里插入图片描述

即便上面的推荐资料全部看完了,也有不少同学还是会犯迷糊,概念多,协议多,体现到代码上到底哪些是我们需要学习使用修改的呢? 这个先别急,我们再来把 ESP-IDF 蓝牙框架了解一下!

2、ESP32-C3 ESP-IDF 蓝牙框架

回到我们需要使用的 ESP-IDF本身,官方的对于蓝牙API的说明如下:
在这里插入图片描述

我们上文已经更新了说明,ESP32-C3 只支持BLE,虽然ESP-IDF有传统蓝牙和BLE,但是在 ESP32-C3 上面只能运行与 BLE 有关的示例。

经过上面那么多理论知识的洗礼,我们再回头看看 ESP-IDF 蓝牙 API:
在这里插入图片描述
整体的结构我们已经差不多能够明白了,那么我们从 ESP-IDF Examples 的例程来看一看实际的例程分别是关于什么的。

2.1 基于Bluedroid 的示例

第一部分 Bluedroid 堆栈中的ble 部分:
在这里插入图片描述
我们前面说过,GATT用来规范 attribute 中的数据内容,并运用 group(分组)的概念对 attribute 进行分类管理。为主从设备交互数据提供 Profile、Service、Characteristic 等概念的抽象、管理。所以在这个示例程序中,关于GATT的示例是非常多的。

除此之外,包括我们经常能见到的蓝牙串口透传,使用的就是 SPP协议。

蓝牙Ibeacon 模式,是作为信标用于蓝牙定位的一种协议。

鼠标键盘,其他外设HID设备的延时,也提供了对应的例子。

第二部分 ble_50 部分:
在这里插入图片描述
对于示例中的这部分,居然没有说明,这里也就不过多解释。

第三部分 经典蓝牙 classic_bt 部分:
在这里插入图片描述
我们前面介绍过,经典蓝牙与蓝牙ble的应用领域的时候介绍过:经典蓝牙的应用领域有蓝牙耳机、蓝牙音箱,那么在ESP-IDF 经典蓝牙部分,这两个部分的示例代码都提供了!

还有SPP协议,蓝牙串口相关的,接收端,发送端,都单独的有自己的使用示例;

在最后可以使用hfp_ag 和 hfp_hf 示例与音频网关(AG)设备(例如智能手机)通信。

第四部分 coex 部分:
在这里插入图片描述
经典蓝牙和BLE共存,在前面我们提到过,如果把 BR/EDR Controller 和 LE Controller设 计到一个Controller,就能实现双模蓝牙,我们也说过ESP32-C3 是有两种类型的 Controller 。

2.2 基于 ESP-BLE-MESH的示例

上面介绍完成,到了esp_ble_mesh部分,我们还是一个一个看下去:
在这里插入图片描述
乐鑫的IDF中,居然就直接有和阿里精灵连接的例子。

2.3 基于 hci 的示例

在这里插入图片描述
前面介绍过,HCI主要用于两个MCU实现BLE协议栈的场合,规范两者之间的通讯协议和命令。
Controller 和 HCI相关的东西,现在不太好说明!

2.4 基于 Apache NimBLE的示例

Apache NimBLE 的堆栈仅支持 BLE,所以这部分也是和BLE有关的示例:
在这里插入图片描述
对于这部分的说明,ESP-IDF给出的 readme 都是比较详细的,或许是因为在代码占用和运行时,NimBLE 对内存的要求较低?

2.5 其他和蓝牙有关的示例

在这里插入图片描述
The Human Interface Device (HID)定义了蓝牙在人机接口设备中的协议、特征和使用规程。典型的应用包括蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。该协议改编自USB HID Protocol。
蓝牙HID 是属于蓝牙协议里面的一个profile(应用层)。

结语

至此,对于 ESP32-C3来说, ESP-IDF中所有的蓝牙示例简单来说是干什么的都过了一遍,对于一块知识的学习,还是得先把基础打好,像蓝牙协议这么多专有名词,专业术语的知识来说,还是很有必要花足够的时间去对基础知识进行学习!

这篇文章是 ESP32-C3 蓝牙篇的开始,只是对我们将要对面的东西做了一个介绍,让自己让大家认识一下。

对于ESP-IDF使用来说,蓝牙篇章入门的资料少之又少,我学习查找资料几天,甚至都没有找到过确实的介绍 ESP-IDF 中示例介绍的文章 = =! 所以期间头很大,自己对蓝牙协议的理解也没那么深,所以在写博文的时候举步维艰,目前基本上没办法写出自己的理解,质量还请大家理解。文中的错误与不足在今后我会随时更新。同时希望有懂蓝牙的大佬多多指点。

ESP32-C3 蓝牙接下来的学习更新可能会没以前那么快,因为所有的示例,我都会尽量去跑一跑测试下,然后用来干嘛的?怎么用的?有什么意义?尽量都搞清楚了才会更新,希望大家理解!谢谢!

相关文章
|
10天前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
26 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
9天前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
22 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
9天前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
20 1
|
9天前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
30 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
9天前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
21 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
9天前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
23 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
12天前
|
Web App开发 设计模式 测试技术
自动化测试框架的搭建与实践
【10月更文挑战第5天】本文将引导你理解自动化测试框架的重要性,并通过实际操作案例,展示如何从零开始搭建一个自动化测试框架。文章不仅涵盖理论,还提供具体的代码示例和操作步骤,确保读者能够获得实用技能,提升软件质量保障的效率和效果。
|
10天前
|
自然语言处理 搜索推荐 关系型数据库
elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
这篇文章是关于Elasticsearch全文搜索引擎的学习指南,涵盖了基本概念、命令风格、索引操作、分词器使用,以及数据的增加、修改、删除和查询等操作。
11 0
elasticsearch学习六:学习 全文搜索引擎 elasticsearch的语法,使用kibana进行模拟测试(持续更新学习)
|
13天前
|
Web App开发 敏捷开发 Java
自动化测试框架的选择与应用
【10月更文挑战第4天】在软件开发的海洋中,自动化测试如同一艘航船,帮助开发者们快速穿越测试的波涛。选择适合项目的自动化测试框架,是确保航行顺利的关键。本文将探讨如何根据项目需求选择合适的自动化测试框架,并分享一些实用的代码示例,助你启航。
|
9天前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
44 0