BLE架构与开源协议栈

news2025/1/6 17:16:45

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.coloradmin.cn/o/987451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

@Autowired为什么会报错?如何解决?

作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) Autowired报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行&…

第一次去新加坡Token2049?这份行前攻略请收好

TOKEN2049是行业领先的Web3盛会,往届的Token2049,知名项目的创始人主会场遍地跑,了解亚洲区块链前沿,BD更多新项目,寻找潜在投资机会,Token2049不会让你失望。 Moonbeam中文社区今年也会出席Token2049系列活…

安科瑞智能微型断路器在某银行网点的设计与应用

安科瑞 崔丽洁 【摘要】:随着人工智能、移动互联等现代信息技术和通信技术在电力行业的应用,实现电力系统各个环节人机交互、万物互联,打造状态全方面感知、信息合理处理、应用便捷灵活的泛在电力物联网已成为必然趋势。本文主要对智能微型断…

C++ 围炉札记

文章目录 内存检测ProtoBufCMake、vscode、clion、Qt右值1、临时变量右值引用2、右值引用本质 函数返回std::functionPOD(Plain Old Data)thread_localnew / delete1、定位new运算符 可变参数模板typename和class1、C模板类头文件和实现文件分离的方法2、…

BT8959T2/5 LCD 驱动

1 Preface/Foreword LCD驱动路径:app/gui/lcd/ SDK默认的LCD驱动:lcd_gc9c01.c 2 数据结构 3 代码分析

高忆管理:科创板中签率?

科创板于当时已经成为出资者追捧的板块,许多新股都在科创板上市,那么科创板新股的中签率是高仍是低呢?是取决于哪些要素形成的呢?下面,本文将从多个角度剖析这个问题。 一、科创板中签率是什么? ​ 科创…

LeetCode 1126.查询活跃业务

数据准备 Create table If Not Exists Events (business_id int, event_type varchar(10), occurences int); Truncate table Events; insert into Events (business_id, event_type, occurences) values (1, reviews, 7); insert into Events (business_id, event_type, occu…

三段视频怎么合并在一起?三种方法教你快速合并

合并视频可以节省存储空间。如果我们有多个视频文件,每个文件可能需要一定的存储空间。但是,如果将它们合并到一个文件中,就可以节省存储空间并更轻松地管理文件。此外合并视频还使其更易于共享。如果需要将视频发送给其他人,您只…

Python实操:内存管理与优化策略

在 Python 开发过程中,合理有效地管理和优化内存使用是提高程序性能和效率的关键。本文将深入探讨 Python 中的内存管理机制,并分享一些实用的优化策略和具体操作步骤,帮助您更好地利用资源、减少内存占用并提升代码执行速度。 一、了解 Pyth…

【Python】【Fintech】解决用pandas_datareader从yahoo下载股票数据时出错

【背景】 要做一个预测投资组合portfolio未来收益的python脚本,类似的功能需要从数据源获取相关指数和股票的数据,一直以来都是用pandas_datareader从yahoo上面拿,但是后来忽然发现不能用了,这篇就说明一下遇到此问题的walk around. 【分析】 由于数据源是yahoo那边的,…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十二:通用详情组件封装实现

一、本章内容 本章实现通用详情组件,自动识别实体配置信息,并自动生成对应组件,填充组件数据,并完成数据自动加载等过程。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址࿱

Vue 前端项目使用alibaba矢量库svg图标

Vue 前端项目使用alibaba矢量库svg图标 这里主要是记录 vue项目中使用阿里矢量库图标的操作流程,方便以后查阅!!! 一、简介 iconfont 是由阿里巴巴体验团队打造的,一款设计和前端开发的便捷工具.拥有着很强大且图标内…

手把手教你在视频剪辑及数字人训练中花式抠图

本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第三期,讲述围绕 视频剪辑及数字人训练中的抠图需求,如何运用 绿幕抠图、实景抠图能力,实现高效、便捷的视频制作及合成体验。 昱尘|作者 悬刃|算法支持 “你这背…

达梦数据库awr报告收集

1、找出快照点snap_id与时间的对应关系 SYS.WRM$_SNAPSHOT表中记录了快照点snap_id与时间的对应关系 例如如下语句可以得出2023-09-04这一天各个时间点对应的快照点snap_id select snap_id,end_interval_time from SYS.WRM$_SNAPSHOT where end_interval_time between to…

亚马逊鲲鹏系统多渠道引流功能快速增加你的listing流量

如果亚马逊Listing没有流量,那么亚马逊产品排名也会在很靠后的位置,从而就会导致吸引不到客户点击进行下单购买,因此引流就很重要了,普通的引流方法很难达到效果,并且还会花费大量的时间,那么我们可以用亚马…

Elasticsearch实现词云效果Demo

文章目录 前言前期准备springbootElasticsearch依赖 思路准备数据查询数据处理文本样式处理 具体实施数据准备创建索引数据存储进行查询 踩坑记录聚合查询不生效问题 demo地址总结 前言 最近项目中使用Elasticsearch在做快速查询的功能,然后就想到了之前的一个项目…

航空航天行业的MES系统解决方案

航空航天行业的制造执行系统(MES)解决方案是为了满足这个高度复杂、高度规定、高度技术要求的行业而设计的。MES系统在航空航天制造中发挥着关键的作用,帮助企业提高生产效率、降低成本、确保质量合规性,并实现生产过程的可视化和…

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

基于SpringBoot+Vue实现的前后端分离的外卖点餐系统源代码+数据库

该项目是一个前后端分离的外卖点餐系统,项目后端采用SpringBoot开发。 完整代码下载地址:基于SpringBootVue实现的前后端分离的外卖点餐系统源代码数据库 功能模块 基础数据模块 分类管理员工管理套餐管理 点餐业务模块 店铺营业状态微信登录缓存商品…

数字孪生背后:谁在构建真实的数字世界?

如果说过去人们对于数字孪生的定位仅仅是真实世界的数字映像,那么如今,在映像之外,于众多的产业之中,它也更在通过更加复杂的设计和 技术成为现实世界的新数字调控器。 在这艘向前行进的航船上,改变的不仅是前方更加…