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.rhkb.cn/news/130422.html

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

相关文章

快讯 | ALVA 荣获首届“格物杯”联通物联网应用创新大赛复赛一等奖!

8 月 7 日,“物聚龙江 智联百业”物联网创新发展合作交流暨首届“格物杯”联通物联网应用创新大赛企业赛道复赛 (赛区四)在哈尔滨举办。 ALVA Systems 凭借智能远程协助平台—— ALVA Rainbow 在近 50 家企业中脱颖而出,荣获首届“格物杯”联通物联网应…

C#开发的OpenRA游戏之调试菜单1

C#开发的OpenRA游戏之调试菜单1 在开发一个游戏里,经常需要提供一些调试设置,以便快速地达到需要测试的阶段,否则按正常游戏的进程,就会需要比较久的时间,这样浪费开发人员的时间。 在OpenRA提供一个调试菜单,它就是在下面的界面里: 这个菜单叫做 Debug Menu,当玩家点…

mybatis初体验(细节满满)

1.创建数据表(库名为:mayikt) CREATE TABLE mayikt_user (id int NOT NULL AUTO_INCREMENT,username varchar(20) DEFAULT NULL,userpwd varchar(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT9 DEFAULT CHARSETutf8mb3…

Eclipse 安装串口终端工具

Eclipse已集成串口终端显示,只需要我们自己下载安装即可使用。使用SSH连接也差不多。 查看eclipse版本信息 help->About Eclipse 查看version,我的是4.7.3a,记住代号,我的是“Oxygen”,下面有用。 安装eclipse自带的“Termin…

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块,通常用于工业自动化和控制系统中,用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用,以下是一些可能的应用领域: 工业过程控制: GE IS220…

优思学院|精益生产与柔性制造:现代制造业的双重理念

现代制造业正不断演进,出现了许多新的生产理念和方法。在这其中,精益生产和柔性制造是两个引人注目且重要的理念。这两者不仅对企业的生产流程产生了深远的影响,还在提高效率、适应市场需求方面发挥着关键作用。 理念背景和核心原则 精益生…

【前端开发】JS Vue React中的通用递归函数

文章目录 前言一、递归函数的由来二、功能实现1.后台数据2.处理数据3.整体代码 总结 前言 大家好,今天和大家分享一下在前端开发中js,vue,react的通用递归方法。 递归是指一个函数在执行过程中调用自身的行为。通过递归,可以将一…

Pytorch框架详解

文章目录 引言1. 安装与配置1.1 如何安装PyTorch1.2 验证安装 2. 基础概念2.1 张量(Tensors)2.1.1 张量的基本特性2.1.2 创建张量2.1.3 张量操作 2.2 自动微分(Autograd)2.2.1 基本使用2.2.2 计算梯度2.2.3 停止追踪历史2.2.4 自定…

Apache Tomcat 漏洞复现

文章目录 Apache Tomcat 漏洞复现1. Tomcat7 弱密码和后端 Getshell 漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.3.1 jsp小马1.3.2 jsp大马 1.4 安全加固 2. Aapache Tomcat AJP任意文件读取/包含漏洞2.1 漏洞描述2.1 漏洞复现2.2 漏洞利用工具2.4 修复建议 3. 通过 PUT 方法的…

马上金九银十了,给大家一点面试方面的建议

好久不见,甚是想念。这段时间没有更新什么文章,其实是因为我跳了一波槽,出去面了一圈后,也顺利拿了不少架构岗位的offer。 正好马上要金九银十了,相信有不少小伙伴们估计也有跳槽涨薪的想法,那么就从我最近…

SpringMVC实现增删改查

文章目录 一、配置文件1.1 导入相关pom依赖1.2 jdbc.properties:配置文件1.3 generatorConfig.xml:代码生成器1.4 spring-mybatis.xml :spring与mybatis整合的配置文件1.5 spring-context.xml :上下文配置文件1.6 spring-mvc-xml:…

解决Microsoft Edge无法正常运行的有效方案分享!

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…

Fiddler抓包工具(详细讲解)

序章 Fiddler是一个蛮好用的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。也可以用来检测网络安全。反正好处多多,举之不尽呀!当年学习的时候也蛮费劲,一些蛮实用隐藏的小功能用了之后就忘记了&…

关于前端就业前景的一点看法

一、前言 最近,很多人在知乎上鼓吹前端未来会没掉的概念。在此我想说这个说法并不真实,而是一种极端的观点。 事实上,前端开发在当今的互联网行业中扮演着至关重要的角色,它是构建 Web 应用程序所必需的一部分,能够实现…

【STM32】常用存储器

常用存储器 RAM 存储器 RAM 是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。而RAM可随读取其内部任意地址的数据,时间都是…

React 消息文本循环展示

需求 页面上有个小喇叭,循环展示消息内容 逻辑思路 设置定时器,修改translateX属性来实现滚动,判断滚动位置,修改list位置来实现无限滚动 实现效果 代码 /** Author: Do not edit* Date: 2023-09-07 11:11:45* LastEditors: …

chrome 谷歌浏览器 导出插件拓展和导入插件拓展

给同事部署 微软 RPA时,需要用到对应的chrome浏览器插件;谷歌浏览器没有外网是不能直接下载拓展弄了半小时后才弄好,竟发现没有现成的教程,遂补充; 如何打包导出 谷歌浏览器 地址栏敲 chrome://extensions/在对应的地…

使用Pyarmor保护Python脚本不被反向工程

Python可读性强,使用广泛。虽然这种可读性有利于协作,但也增加了未授权访问和滥用的风险。如果未采取适当的保护,竞争对手或恶意攻击者可以复制您的算法和专有逻辑,这将对您软件的完整性和用户的信任产生负面影响。 实施可靠的安…

负载均衡-ribbon源码解析

负载均衡-ribbon源码解析 1 LoadBalanced注解 /*** 基于ribbon调用服务及负载均衡* return*/ LoadBalanced Bean public RestTemplate restTemplate(){return new RestTemplate(); }Bean ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer(fin…

【Java】传输层协议TCP

传输层协议TCP TCP报文格式首部长度保留位32位序列号和32位确认应答号标记ACKSYNFINRSTURGPSH 16位窗口大小16位校验和16位紧急指针选项 TCP特点可靠传输实现机制-确认应答超时重传连接管理机制三次握手四次挥手特殊情况 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘…