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

相关文章
|
14天前
|
敏捷开发 Java 测试技术
探索软件测试中的自动化测试框架
在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的不断进步和软件项目的日益复杂化,传统的手动测试方法已经无法满足高效、准确的测试需求。自动化测试作为一种提高测试效率和质量的有效手段,越来越受到开发者和测试者的青睐。本文将深入探讨自动化测试框架的重要性、常见的自动化测试工具以及如何选择合适的自动化测试框架。
38 10
|
16天前
|
设计模式 前端开发 JavaScript
自动化测试框架设计原则与最佳实践####
本文深入探讨了构建高效、可维护的自动化测试框架的核心原则与策略,旨在为软件测试工程师提供一套系统性的方法指南。通过分析常见误区,结合行业案例,阐述了如何根据项目特性定制自动化策略,优化测试流程,提升测试覆盖率与执行效率。 ####
41 6
|
16天前
|
人工智能 前端开发 测试技术
探索软件测试中的自动化框架选择与优化策略####
本文深入剖析了当前主流的自动化测试框架,通过对比分析各自的优势、局限性及适用场景,为读者提供了一套系统性的选择与优化指南。文章首先概述了自动化测试的重要性及其在软件开发生命周期中的位置,接着逐一探讨了Selenium、Appium、Cypress等热门框架的特点,并通过实际案例展示了如何根据项目需求灵活选用与配置框架,以提升测试效率和质量。最后,文章还分享了若干最佳实践和未来趋势预测,旨在帮助测试工程师更好地应对复杂多变的测试环境。 ####
40 4
|
15天前
|
监控 jenkins 测试技术
自动化测试框架的构建与实践
【10月更文挑战第40天】在软件开发周期中,测试环节扮演着至关重要的角色。本文将引导你了解如何构建一个高效的自动化测试框架,并深入探讨其设计原则、实现方法及维护策略。通过实际代码示例和清晰的步骤说明,我们将一起探索如何确保软件质量,同时提升开发效率。
34 1
|
21天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
22天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
64 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
10天前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
30 6
|
6天前
|
机器学习/深度学习 人工智能 Java
探索软件测试中的自动化框架选择与优化策略####
本文深入探讨了在软件测试领域,面对众多自动化测试框架时,如何根据项目特性、团队技能及长远规划做出最佳选择,并进一步阐述了优化这些框架以提升测试效率与质量的策略。通过对比分析主流自动化测试框架的优劣,结合具体案例,本文旨在为测试团队提供一套实用的框架选型与优化指南。 ####
|
6天前
|
敏捷开发 前端开发 Java
软件测试中的自动化测试框架选择与实践
在当今软件开发生命周期中,自动化测试已成为提升软件质量和开发效率的关键手段。本文旨在探讨自动化测试框架的选择标准及其在实际项目中的应用实践。通过对主流自动化测试框架的分析比较,结合具体案例,本文将阐述如何根据项目需求和团队特点选择合适的自动化测试工具,并分享实施过程中的经验教训。
16 1
|
21天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####