在我们前面 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函数初始化流程简析
推荐几篇很好的文章:
现在最火的蓝牙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 蓝牙接下来的学习更新可能会没以前那么快,因为所有的示例,我都会尽量去跑一跑测试下,然后用来干嘛的?怎么用的?有什么意义?尽量都搞清楚了才会更新,希望大家理解!谢谢!