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.mzph.cn/news/72083.shtml

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

相关文章

ModuleNotFoundError: No module named ‘lavis‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

c语言实训心得3篇集合

c语言实训心得体会一: 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里…

第十八课、Qt 下载、安装与配置

功能描述:介绍了 Qt 的下载、安装和配置的全部过程,并对关键页面选项进行了详细说明 一、Qt 的下载 Qt 官方下载地址:https://www.qt.io/zh-cn/downloadhttps://download.qt.io/https://download.qt.io/https://www.qt.io/zh-cn/download进入…

GptFuck—开源Gpt4分享

这个项目不错,分享给大家 项目地址传送门

深入探索KVM虚拟化技术:全面掌握虚拟机的创建与管理

文章目录 安装KVM开启cpu虚拟化安装KVM检查环境是否正常 KVM图形化创建虚拟机上传ISO创建虚拟机加载镜像配置内存添加磁盘能否手工指定存储路径呢?创建成功安装完成查看虚拟机 KVM命令行创建虚拟机创建磁盘通过命令行创建虚拟机手动安装虚拟机 KVM命令行创建虚拟机-…

数据集笔记:GeoLife GPS 数据 (user guide)

数据链接:https://www.microsoft.com/en-us/download/details.aspx?id52367 1 数据基本信息 1.1 数据介绍 182名用户在超过三年的时间内(从2007年4月到2012年8月)在(微软亚洲研究院)Geolife项目中收集的。该数据集…

使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡故障容错【上】

😀前言 本篇博文是关于使用SpringCloud Eureka 搭建EurekaServer 集群- 实现负载均衡&故障容错,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可…

865. 具有所有最深节点的最小子树(javascript)865. Smallest Subtree with all the Deepest Nodes

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的 最小子树 。 如果一个节点在 整个树 的任意节点之间具有最大的深度,则该节点是 最深的 。 一个节点的 子树 是该节点加上它的所有后代的集合…

【计算机网络】 IP协议格式以及以太网帧结构

文章目录 IP协议格式以太网帧结构 IP协议格式 IP工作在网络层 IP头分为两部分,固定部分和可变部分,固定部分就是一定要带这些数据,正常存储应该是连续的,并不是像图中这样会换行,图中只是为了方便观察。 首先是一个版…

山洪、地质灾害监测利器-泥石流、山体滑坡AI视觉仪

1、设备介绍 AI视觉仪通过AI算法智能化摄像机,能够及时、全面的把握边坡潜在安全风险,有效防范自然灾害。支持全天候运行,在恶劣环境及气候条件下仍能正常进行监测数据采集。自动识别监控区域内是否有泥石流、山体滑坡等,一旦检测…

uni-app:重置表单数据

效果 代码 <template><form><input type"text" v-model"inputValue" placeholder"请输入信息"/><input type"text" v-model"inputValue1" placeholder"请输入信息"/><input type&quo…

排序之插入排序

文章目录 前言一、直接插入排序1、基本思想2、直接插入排序的代码实现3、直接插入排序总结 二、希尔排序1、希尔排序基本思想2、希尔排序的代码实现3、希尔排序时间复杂度 前言 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大…

IDEA找不到Maven窗口

有时候导入项目或者创建项目时候Maven窗口找不到了 然后指定项目的pom.xml文件

torch.bmm功能解读

bmm 是 batched matrix multiple 的简写&#xff0c;即批量矩阵乘法&#xff0c;矩阵是二维的&#xff0c;加上batch一个维度&#xff0c;因此该函数的输入必须是两个三维的 tensor&#xff0c;三个维度代表的含义分别是&#xff1a;&#xff08;批量&#xff0c;行&#xff0c…

【python手写算法】逻辑回归实现分类(含公式推导)

公式推导&#xff1a; 代码实现&#xff1a; # codingutf-8 import matplotlib.pyplot as plt import numpy as npdef f(w1,x1,w2,x2,b):zw1*x1w2*x2breturn 1/(1np.exp(-z)) if __name__ __main__:X1 [12.46, 0.25, 5.22, 11.3, 6.81, 4.59, 0.66, 14.53, 15.49, 14.43,2.1…

DHCP的interface(接口),global(全局)配置以及DHCP relay(中继),DHCP snooping,DHCP option

目录 1.DHCP的接口&#xff08;interface&#xff09;配置 2.DHCP的全局&#xff08;global&#xff09;配置 3.dhcp relay 4.dhcp snooping 5.option 这里有一个简单的拓扑图 交换机配置命令如下 The device is running!<Huawei> <Huawei>sys Enter system …

Android 动画之插值器PathInterpolator

Android 的View动画、属性动画都可以设置动画插值器&#xff0c;以此来实现不同的动画效果。 这篇文章 Android View动画整理 有介绍各种插值器的效果&#xff0c;这一篇专访 PathInterpolator 。 参考官网 添加曲线动作 &#xff0c; PathInterpolator 基于 贝塞尔曲线 或 …

2023 大学生数学建模竞赛-C题-第一问

题目&#xff1a; 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销…

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

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

【postgresql 基础入门】数据库服务的管理,启动、停止、状态查看、配置加载、重启都在这里

数据库服务管理 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff…