开源蓝牙协议栈-Zephyr Bluetooth

news2024/11/13 15:13:32

关于Zephyr的介绍,参考:

https://blog.csdn.net/2201_75889983/article/details/129366754

Zephyr最初是由Wind River公司开发的一个微内核,在2016年的时候成为Linux基金会维护的一个项目,发展至今,已经成为了一个功能齐全的嵌入式OS。平台现在支持ARM、RISC-V、X86、Xtensa等等处理器平台,拥有原生的BLE协议栈、完整的Net协议栈,包括TCP/IP与应用层协议,为嵌入式应用的开发提供了有力的支持。

Zephyr它不仅仅维护了一个RTOS内核,还维护一些编译链、libc、 IDE插件、HEL层驱动等,几乎每一个模块都有相关的文档。正是因为拥有详细的文档,Zephyr才能源源不断的吸引人来进行尝试与开发,以至于系统不断的被完善,进入开源项目的一个良性循环。

可见,Zephyr是一个功能较为完善的RTOS。不过我们这篇文章并不是介绍RTOS是怎么用的,而只是介绍该操作系统中集成好的一个蓝牙协议栈,也就是Zephyr Bluetooth,简称zblue.(注意和bluez区分开,别搞混了)

为了能找到zblue的源码,我们就需要先找到Zephyr的源码,然后从里面找出bluetooth协议栈的模块。

提供Zephyr官网:https://www.zephyrproject.org/

跳转这里可找到源码路径:

这里有Zephyr的中文在线文档:

https://zephyr-doc.readthedocs.io/zh-cn/latest/introduction/introducing_zephyr.html

目录结构

其中,源码树结构参看这部分文档:

在Zephyr中有一个子系统目录subsys,这里面就放着蓝牙的协议栈。

具体涉及哪些文件,参考:

https://blog.csdn.net/szxhcljyjsjdff/article/details/136067081

源码树层次

subsys/bluetooth/host

这里是host stack。处理HCI命令和事件地方,L2CAP,ATT,SMP等核心协议也在这里

subsys/bluetooth/controller

蓝牙控制器实现。实现HCI的控制器端,链路层以及对无线电收发器的访问

include/bluetooth/

公共API头文件。这些是应用程序需要包含的头文件,以便使用蓝牙功能

drivers/bluetooth

HCI传输层驱动。每个HCI传输层都需要自己的驱动程序。(三线uart或者5线uart,usb,spi等)

samples/bluetooth

蓝牙实例代码。

test/bluetooth

测试应用程序。这些应用程序用于验证蓝牙堆栈的功能。

doc/guides/bluetooth

额外的文档,比如PICS文档

基本就这几个相关的目录。

zephyr主要支持BLE,对BR/EDR仅提供有限的支持,所以,我们主要使用zblue来实现BLE功能。

zblue简介

接下来,就介绍下zblue的基本情况。

参考:https://blog.csdn.net/wenbo13579/article/details/128042591

一般蓝牙协议栈分为Host和Controller两个部分,根据是否包含BR/EDR还是LE,分为如下形式。

Controller层,主要是封装了硬件的原始操作,虽然Controller要实现的操作和硬件行为强相关,不可避免代码差异大。但是Spec有明确规定HCI接口,大家都有一个标准可以遵循,API相对统一,从A切换B其实只要有HCI接口就能方便的使用。Host和Controller之间通过HCI连接。

Host层,Spec只是规定了行为并没有规定接口,那就是天马行空,各家方案的API差异很大,学习成本较高,并且迁移成本也高,而且文档基本上都是靠代码、例程来学习,有些API还不是很友好。

HCI,主机控制器接口,就是Host和Controller之间的interface,因此叫HCI.

现行的开源Host协议栈还是比较多的,下面做一个简单的介绍:

从上述可以看出,除了btstack在设计之处就是为了方便Porting存在的,其他方案都是捆绑了自己的OS。

这块其实做的比较好的还是btstack,不过其商业是收费的,文档这块其实也不太多,同时其是极简实现的方案,所以使用体验上并不是很舒服,数据缓存之类都需要在应用层做。本文就不做过多叙述了。

zblue蓝牙协议栈为Zephyr的结构,总体结构如下图所示。

如上图所示,系统主要分为5个部分,代码结构如下所示:

chipset:各家厂商在使用之前需要进行一些配置,有些是因为芯片是rom化版本,需要加载patch,有些要配置RF参数,有些要配置蓝牙地址等。

example:各种蓝牙例程,基本是照搬zephyr的来,当然会加入一些新的case。

platform:移植时重点关注的部分,蓝牙协议栈运行需要用到一些平台资源,不同平台有不同实现方式,主要包括log、timer、storage_kv和HCI接口的实现。

porting:程序的主入口,这些会将platform/chipset和协议栈接口进行绑定,并启动example,最后对协议栈进行调度。

src:zephyr的蓝牙协议栈部分,具体实现蓝牙协议栈的具体细节。

更多使用细节可参考test、samples以及doc目录。

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

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

相关文章

国内访问github出现无法访问,用Watt Toolkit加速

文章目录 前置1. 访问github出现“无法访问...”2. 安装Watt Toolkit点击下载接受并下载下载渠道 Watt Toolkit 就绪侧栏“网络加速”下拉滚动条勾选github,点右上“一键加速”再次访问 github.com ,可以访问 前置 准备好微软账号 1. 访问github出现“无法访问…”…

vulnhub靶机:Tomato

目录 靶机导入 信息收集 发现 IP 目录扫描 端口扫描 访问 web 漏洞利用 方法1:报错连接拿 shell 方法2: 使用python3进行反弹shell 提权 靶机导入 tomato 下载地址:Tomato: 1 ~ VulnHub 信息收集 发现 IP arp-scan -l 发现靶机 IP…

【Qt】QMainWindow之菜单栏

目录 一.菜单栏 1.概念 2.组成 二.代码创建菜单栏 1.创建菜单栏 2.在菜单栏中添加菜单 3.在菜单中添加菜单项 三.图形化创建菜单栏 1.在打开Qt自带的ui文件界面后,得到以下界面 2.双击点击界面中(在这里输入),在菜单栏中进行…

【开端】JAVA日志框架LogFactory

熟悉的一行代码 private static final Log logger LogFactory.getLog(Application.class); 这一行代码就是使用了LogFactory日志框架,对类Application,进行日志输出。 private static final 这里表示虚拟机启动后就创建一个最终的日志对象Log logger 创…

MySQL学习(18):触发器

1.什么是触发器 *触发器是在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。 *日志记录,数据校验等操作使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容。OLD引用的是触发器变化前的内容,NEW引用的是触发…

鸿蒙Flex布局

效果: 代码: 换行代码参数设置: wrap:FlexWrap.Wrap Entry Component struct FlexCase {State message: string Hello World;build() {Flex({direction:FlexDirection.Row,justifyContent:FlexAlign.SpaceAround,alignItems:ItemAlign.Cen…

QT和Electron之争,谁才是王者,看看界面判断下

QT 和 Electron 都是用于开发跨平台应用程序的框架,但很难简单地判定谁是“王者”,因为它们各有优劣,适用于不同的场景和需求。 QT 是一个成熟的 C 框架,具有以下优点: 性能出色:由于是基于 C 开发&#…

Eureka详解:解锁微服务架构中的服务发现与注册超能力!

Eureka是一款由Netflix开源的服务发现框架,主要用于微服务架构中的服务注册与发现。在使用Eureka时,涉及到配置Eureka Server、配置Eureka Client、服务注册与发现等步骤。 Eureka服务端配置: 引入依赖:在项目的pom.xml文件中添加…

【秋招笔试】24-07-27-OPPO-秋招笔试题(研发岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡本套卷的题目都是计数相关的题,对这方…

针对一个红队病毒样本逆向分析

近日翻到一个比较新颖的样本,在最终后门载荷释放前运用了不少免杀手段,包括堆栈欺骗,实现反射性调用API,以及DLL侧加载、DLL挖空、HOOK规避等手法,对其执行流程和部分手法做详细分析记录。 样本概述 初始载荷 初始载…

【硬件开发】树莓派4B散热性能

树莓派4B散热性能 树莓派引脚 树莓派 40Pin 引脚对照表 rpi-pins-40-0 注:本表格适用于各版本,并且兼容26Pin的树莓派B,树莓派B为26Pin,其引脚对应于上表的前26Pin。 使用下面这款 GPIO 参考卡片,让引脚功能一目了…

谷粒商城实战笔记-101-分布式基础篇总结

文章目录 一、分布式基础概念二、基础开发三、环境搭建四、开发规范 分布式基础篇已经学习完成,包含了以下4个部分的知识: 1,分布式基础概念2,基础开发3,环境搭建4,开发规范 学习并掌握这部分内容&#x…

超声波眼镜清洗机是智商税吗?最好用的超声波清洗机推荐

大家知道,在咱们生活的环境里。到处充斥着细菌,像衣服上、手上等等地方都很容易被沾染上比细菌,很影响咱们的健康。所以大家会勤洗手,勤换洗衣服,来减少细菌病毒伤害。然而对于戒指、项链、眼镜、手表等配饰细菌&#…

软考:软件设计师 — 9.数据流图

九. 数据流图 数据流图是下午场考试中第一个题目,分值 15 分。通常会考察实体名、存储名、加工名的补充,以及找到缺失的数据流并改正等。 1. 数据平衡原则 数据流的分析依赖于数据平衡原则。 父图与子图之间的平衡 父图与子图之间平衡是指任何一张 …

mp3剪辑音乐怎么剪?手把手教会你4个音频剪辑技巧

在制作创意无限的“矿泉水瓶烟花视频”时,音效的选择与剪辑往往是点睛之笔。想象一下,那绚烂的视觉盛宴搭配上恰到好处的背景音乐,是否能让你的作品更加引人入胜? 而要精准地控制每一个音符的起承转合,一款强大的mp3剪…

【学习笔记】Day 1

一、进度概述 1、配置相关环境——注:暂未完成,还有部分依赖没有补充完整 2、试运行 3、《地震数据全波形反演的深度学习方法》PPT知识梳理方法地震数据全波形反演的深度学 二、详情 1、配置相关环境 深度学习环境配置参考文章如下&a…

VS+Qt+C++点云PCL三维显示编辑系统

程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易…

HttpRequest请求对象和HttpResponse响应对象

HttpRequest请求对象 1.获取请求头 2.获取请求参数 通过请求对象获取请求头 获取GET参数(valuerequest.GET.get(参数名称,默认值))获取POST参数valuerequest.POST.get(参数名称,默认值))获取URL参数&#xf…

C++ 预置和弃置的函数

在C11中,预置和弃置的函数是用于处理移动语义和完美转发的。 预置函数(Move Constructor)是在对象被移动时调用的构造函数。它允许将资源从一个对象转移到另一个对象,而不是进行复制。这可以提高性能,特别是在处理大型…

红酒与美食搭配:味觉的新探索

在美食的世界里,红酒如同一位优雅的舞者,与各种佳肴共舞,创造出无尽的味觉惊喜。当定制红酒洒派红酒(Bold & Generous)与各式美食相遇,便开启了一场味觉的新探索之旅。 一、红酒与美食的邂逅&#xff…