BLE架构与开源协议栈

BLE架构:

简单来说,BLE协议栈可以分成三个部分,主机(host)程序,控制器(controller)程序,主机控制器接口(HCI)。如果再加上底层射频硬件和顶层用户程序,则构成了完整的BLE协议,如下图所示:

  • 蓝牙主机程序实现了所有的高级协议和配置文件,为应用程序提供了高级 API。
  • 蓝牙控制器程序则是实现对射频天线和硬件的控制。一般来说,这部分是芯片厂商编写的比较底层的代码,大概率是不会开源的。
  • 主机控制器接口(HCI)协议描述了主机与控制器通信的格式。HCI可以在一系列不同的物理传输上实现,如UART、SPI或USB。该协议定义了主机可以发送给控制器的命令和它可以预期的返回事件,以及需要通过空中传送的用户和协议数据的格式。HCI确保不同的主机和控制器实现可以以标准方式进行通信,从而可以组合来自不同供应商的主机和控制程序。

不同的组合方式:

正如上面所说,有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。

目前听说过的一些蓝牙协议栈:

  • bluedroid,Android的协议栈,ESP32官方对这个协议栈的主机程序进行了删改和适配。
  • softdevice,nordic家的协议栈,不开源的,别家好像用不了。
  • bluez,linux系统官方蓝牙协议栈,一般作为host,可以把ESP32或者nrf52啥的接上作为控制器,然后就可以在linux上面做扫描、连接之类的事情了。
  • zephyr,这既是一个rtos的名字,也是协议栈名字,实现了主机和控制器程序,感觉比较热门,也是nordic在大力在推的,但是esp32好像还没对这个协议栈进行适配。
  • nimble,是mynewt这个os附带的协议栈,主打轻量化,同样是都实现了主机和控制器,貌似esp32和nrf52都对这个协议栈的host部分进行了适配,还算热门?
  • btstack,跨平台协议栈,可以在linux、windows、rtos上运行,esp32对host进行了适配
  • 其它厂商的协议栈,比如TI有自己的BLE协议栈。

总的来说,就是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,然后就有了这篇博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109928.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python,读取Excel数据,以一列数据的值为标准,对这一列数据处于指定范围的所有行,再用其他几列数据数值,加以筛选与剔除;同时,对筛选与剔除前、后的数据分别绘制若干直方图&#xff…

conda常用命令及问题解决-创建虚拟环境

好久没写博文了,感觉在学习的过程中还是要注意积累与分享,这样利人利己。 conda包清理,许多无用的包是很占用空间的 conda clean -p //删除没有用的包 conda clean -y -all //删除pkgs目录下所有的无用安装包及cacheconda创建虚拟环境…

国外报告90%的AI类产品公司已经实现盈利,而国内大模型和AIGC的访谈说太卷了...

“ 国外AIGC产品的发展情况:市场规模不断扩大,用户付费意愿高,小团队创业成功率高。国内大模型行业的发展情况:行业内卷严重,商业化难题突出,技术挑战仍存。” 01 — diChatGPT发布已有9个月,月…

MQTT Paho Android 支持SSL/TLS(亲测有效)

MQTT Paho Android 支持SSL/TLS(亲测有效) 登录时支持ssl的交互 这是调测登录界面设计 代码中对ssl/tls的支持 使用MqttAndroidClient配置mqtt客户端请求时,不加密及加密方式连接存在以下几点差异: url及端口差异 val uri: String if (tlsConnect…

Windows PostgreSql 创建多个数据库目录

1 使用默认用户Administrator 1.1初始化数据库目录 E:\Program Files\PostgreSQL\13> .\bin\initdb -D G:\DATA\pgsql\data3 -W -A md5 1.2连接数据库 这时User为Administrator,密码就是你刚才设置的,我设置的为123456,方便测试。 2 添加…

Simulink建模:PID控制-应用

本文总结一些工作中在使用PID控制时积累的经验。 文章目录 1 引入2 PID控制的应用2.1 动态PID参数2.2 前馈-反馈控制2.3 积分饱和 3 总结 1 引入 之前已经写过两篇关于PID控制的文章,主要从建模的角度描述如何搭建出来PID控制算法。在实际工程项目中,P…

基于STM32的简化版智能手表

一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目,使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换,搭配DHT11,RTC,LED,KEY等器…

基于ssm的蛋糕预定网站

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

机场、公交枢纽定位解决方案

系统简介 高精度综合定位系统围绕车辆、人员和资产三类定位目标,以及停机坪、行李分拣中心、GTC和新建航站楼等多个定位场景,建设一体化综合定位系统。系统通过卫星差分、蓝牙等多类技术的集成和融合,实现多场景、多目标的综合精准定位&#…

【UE 材质】力场护盾和冲击波效果

目录 效果 步骤 一、制作力场护盾材质 二、制作冲击波材质效果 三、制作冲击波粒子效果 四、制作震动效果 效果 步骤 一、制作力场护盾材质 1. 首先新建一个第一人称角色游戏模板 2. 新建一个材质,用于作为力场护盾的材质,这里命名为“Mat_for…

无涯教程-JavaScript - MATCH函数

描述 MATCH函数在单元格范围内搜索指定的项目,然后返回该项目在该范围内的相对位置。 当您需要某个项目在范围中的位置而不是项目本身时,请使用MATCH而不是LOOKUP函数之一。如。您可以使用MATCH函数为INDEX函数的row_num参数提供一个值。 语法 MATCH (lookup_value, lookup…

Linux mac Windows三系统 局域网文件共享方法

主要工具: Samba是一个开源的软件套件,允许Linux系统与Windows系统之间共享文件和打印机。 一、首先是Linux共享的设置 ①安装 sudo apt-get install samba ②创建共享文件夹 sudo mkdir /home/share ③配置用户 sudo smbpasswd -a kequan ④修改…