ESP32-C3 学习测试 蓝牙 篇(一、认识 ESP-IDF 的蓝牙框架、简单的了解蓝牙协议栈)
前言
从本文开始我们来进行 ESP32-C3 的蓝牙的学习测试。
ESP32-C3 学习 蓝牙 篇系列博文连接:
自己画一块 ESP32-C3 的开发板(第一次使用立创 EDA)(PCB 到手)
https://xie.infoq.cn/article/30387388381a0d915b2494f91
开发环境是乐鑫官方的 ESP-IDF, 基于 VScode 插件搭建好的:
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 函数初始化流程简析
https://xie.infoq.cn/article/1deef0aebd522b1ce7a725388
推荐几篇很好的文章:
现在最火的蓝牙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 蓝牙接下来的学习更新可能会没以前那么快,因为所有的示例,我都会尽量去跑一跑测试下,然后用来干嘛的?怎么用的?有什么意义?尽量都搞清楚了才会更新,希望大家理解!谢谢!
版权声明: 本文为 InfoQ 作者【矜辰所致】的原创文章。
原文链接:【http://xie.infoq.cn/article/efbe5651b35c9d54c69bc0ab2】。文章转载请联系作者。
评论