赞
踩
简单来说,BLE协议栈可以分成三个部分,主机(host)程序,控制器(controller)程序,主机控制器接口(HCI)。如果再加上底层射频硬件和顶层用户程序,则构成了完整的BLE协议,如下图所示:
正如上面所说,有HCI的存在,控制器程序和主机程序其实是可以分离和组合的,以ESP32为例,
单机模式:就是只用一个ESP32实现全部BLE功能。使用ESP-Controller作为控制器程序并使用Bluedroid作为主机程序,两者之间通过虚拟接口(VHCI)连接,这样就构成一个完整的蓝牙协议栈。当然,由于ESP32适配了NimBLE协议栈的主机程序,也可以使用ESP-Controller+NimBLE-Host的组合并通过VHCI连接实现完整的蓝牙功能。
双机模式:这种模式下需要使用两个ESP32构成完整的蓝牙功能,其中一个ESP32作为控制器,运行ESP-Controller程序,另一个ESP32作为主机,运行Bluedroid协议栈或者NimBLE协议栈的主机程序以及用户应用程序,这两个ESP32使用UART、SPI或USB之类的接口作为HCI接口。除此之外,控制器也可以是别家的蓝牙芯片比如nordic的,只要有暴露api接口给HCI就行,而主机也可以是别的厂家的单片机(不一定需要支持射频)亦或者是Linux的板子,然后在它们上面运行适配了它们的主机协议栈程序即可,比如在Linux上运行BlueZ并通过某种HCI接口和控制器交互。双机模式下,作为控制器的一方充当了蓝牙硬件的功能,而用户程序主要在主机上运行,如下图所示(图片来自博客园inii的博客,TA好像是Nordic的FAE,写了很多好文章)。
而需要注意的是,有时候会使用AT指令去控制蓝牙模块,或者说用了蓝牙串口透传模块,这种我认为并不是双机模式,因为主机上面并没有运行任何与BLE协议栈有关的程序,只是单纯的对蓝牙模块进行控制而已,该蓝牙模块是用的单机模式。而这里所说的双机,指的是协议栈中的一部分(主机程序)运行在一个机器上,而协议栈中的另一部分(控制器程序)运行在另一个机器中,两者通过HCI交互。
再打个比方,zephyr的蓝牙协议栈提供了主机程序和控制器程序,两者加上HCI构成了完整的蓝牙协议栈。而nordic对zephyr协议栈的controller程序进行了适配,因此可以选择原先softdevice协议栈的controlle程序也可以选择zephyr协议栈的controller程序来对底层硬件进行控制。当然,nordic还是建议使用softdevice,毕竟是专门针对自家硬件优化过的。
至于ESP32,无论是Bluedroid还是NimBLE,虽然这些协议栈本身都实现了controller和host,但ESP32只对host进行了适配,而controller则用的是自家闭源的api。
总的来说,就是zephyr、nimble、btstack这三个开源协议栈比较热门,前两者都实现了主机和控制器,后者好像仅仅实现了主机程序?但是一般来说厂商只对主机程序作适配,控制器大多用的是自家闭源的。
Bluetooth Stack Architecture — Zephyr Project documentation (nRF Connect SDK) (nordicsemi.com)
NimBLE-based Host APIs - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com)
What is Bluetooth LE? – Nordic Developer Academy (nordicsemi.com)
三种蓝牙架构实现方案(蓝牙协议栈方案) - iini - 博客园 (cnblogs.com)
项目要用到低功耗蓝牙一主多从的功能,于是近期一直在学习BLE开发相关的知识,最初知道的是ESP32,它的sdk自带的Bluedroid协议栈,是从安卓ble协议栈魔改过来的。
后来又发现了应该算是老大哥的nordic家的nrf52系列, 用的是它们自家的softdevice协议栈,一主多从支持连接到20个设备,但是它的代码实在太复杂了,虽说代码解耦做得很好,但是后果就是需要去改好多文件,而且基于MDK那古老的界面那的确难受,接着还发现了nordic家新的sdk,也就是基于zephyr的NCS,基于vscode开发的确是舒服了些,但是又涉及到设备树相关的东西,上手难度还是有的(虽然仅做无线开发好像并不需要去改设备树)。
最后还是返回了ESP32的怀抱,用的是ESP-IDF的vscode插件,都说配环境比较难,有了这个插件之后,感觉还算顺利吧。写代码自然少不了看文档,很早就看到了ESP32除了bluedroid还有一套NimBLE的协议栈,是来自Apache Mynewt的协议栈,Apache这个词就非常眼熟了,至于Mynewt其实一直不知道是什么,今天搜了一下,发现竟然是个小的os,把我惊呆了,这不就是另一个zephyr嘛,怎么大家都这么闲,写开源操作系统的同时还把BLE协议栈给写了,真牛啊。于是就想着去了解下还有哪些开源的蓝牙协议栈或者RTOS,然后就有了这篇博客。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。