蓝牙 - BLE SPP的设计策略(Serial over BLE strategy)

news2024/11/23 20:23:36

在开发 BLE 连接产品的过程中,你可能会有这样的疑问:"Serial profile在哪里?也许你以为你在蓝牙技术联盟网站上滚动浏览长长的profile列表时错过了它。又或者,你根本就没去看,而是准备选择更快的方法,即芯片组提供的串行 API实现。而实际上,这两种方法都不行,官方蓝牙配置文件是不支持串行 Rx/Tx的。

那么,蓝牙低功耗串口是否只是那些不愿意学习蓝牙方法的人使用的差劲手段?或者,蓝牙低功耗串行策略是否能带来合理的好处?

下一次为您的互联产品设计通信策略时,请记住以下几点:

蓝牙低功耗 (BLE) 是作为蓝牙(现在的蓝牙经典)的低功耗替代品而设计的。BLE 允许设备在使用纽扣电池的情况下通信数年。BLE 通过专注于尽可能高效地发送小块(chunks)数据来实现这一目标。为了实现这种效率,我们采用了一种名为 "属性协议"(Attribute Protocol - ATT)的客户端-服务器架构。

ATT 由Services服务、Characteristics特征和Descriptors描述符组成。对这些对象中的每一个都可称为profile配置文件。描述符属于特征,表示该特征的属性。特征具有一种状态,在不同状态下,客户端通过读取、写入或订阅其变化来与服务端的特征进行交互。服务是若干的特征组。

BLE 听起来一点也不像串行协议,不是吗?这是因为与串行数据包相关的所有开销都被抽象化了,只留下一个简单的读、写和通知接口。尽管如此,芯片制造商们还是接受了 BLE 串口协议,并各自在其芯片组上实现 BLE 串口协议,创建了自定义的配置文件(customer profiles)和 API。

Microchip Technology 的 Transparent UART Service、Nordic Semiconductor 的 Nordic UART Service 和 Texas Instruments 的 Serial Port Service 只是为 BLE 串口创建的定制配置文件中的几种。它们这样做是有道理的,因为为您的蓝牙低功耗产品选择BLE串口通讯(Serial over BLE)有很多好处。

注:BLE串口通讯指的是由单个service组成的 ATT 设计,这个service包含一个仅允许通知/指示(notify/indicate)的 RX 特性,还有一个仅允许写入的 TX 特性。

使用蓝牙低功耗串口的原因

使用蓝牙低功耗串行协议的主要原因是它更易于使用。对于嵌入式工程师来说,设计和使用串行协议就像呼吸一样简单。坚持使用熟悉的协议,开发速度会更快,最终产品也更可靠。

除了熟悉之外,使用 BLE 串口还意味着通过 BLE 发送的应用数据格式可与其他有线和无线传输协议(UART、SPI、Wi-Fi 等)互操作。因此,当 BLE 协议栈与主应用程序位于不同的处理器上时,BLE 串口也具有巨大的优势。

在独立于主应用程序的处理器上运行 BLE 堆栈是一种常见的嵌入式架构策略。这些 BLE 协处理器的复杂程度各不相同,有的是完整的 SoC,有的则是专用的 BLE 堆栈,但都足以完成工作。

无论硬件的功能如何,如果处理器不运行主应用程序,那么简单地配置 BLE 芯片并将其作为另一条 UART 线路进行交互就非常有吸引力。更改数据包协议、发送新的数据类型以及调整数据包结构( packet infrastructure,如长度字段或数据包标识符字段)都可以在不更改 BLE 协处理器上任何内容的情况下完成,因为协处理器并不关心发送的内容,它只是转发所有内容。

BLE 串口一般可以更快地建立连接。如上图所示,连接建立时间往往与发现的服务、特征和描述符的数量成线性关系。

"Discovering发现 "指的是映射出所有服务、特性和描述符的句柄,以便应用程序知道它们是什么,并能在以后引用它们。在连接启动时,每发现一个额外的服务、特性或描述符,就需要增加一到三个连接时间间隔,然后才能使用连接传输应用程序数据。

iOS 系统的连接时间间隔(Connection intervals)一般为 30 毫秒,但在 Android 系统上可低至 7.5 毫秒。BLE 串口架构只需使用一种服务和两种特性,即可传输大量的各式各样数据。

蓝牙低功耗串行通信的缺点

几乎所有形式的数字通信都基于串行协议,并具有不同的封装级别,甚至蓝牙经典协议也不例外。

那么,为什么不能将低功耗蓝牙用作简单的无线 UART 链路(link)呢?

串行比 BLE 的最大缺点(most considerable downside)是应用延迟(higher application latency)更高。应用延迟的增加会导致用户体验不佳,并浪费或占用了一些时间,这些时间本来是设备可以进入低功耗状态来节能的。

如图上图所示,收到请求后,必须将其传递给外设应用层(peripheral’s application layer)执行。执行请求后,必须将响应封装到适当的数据包中。然后将响应数据包交给外设的 BLE 堆栈,由其向中心设备发送指示(sends an indication to the central)。

即使外设应用程序直接从内存中返回数据,中心设备也至少需要两个连接间隔才能收到所请求的数据。考虑到在大多数情况下,应用程序向 BLE 层发出的每个请求都需要排队,因此中心设备收到其发出请求的响应所花费的时间,通常还会需要更多个连接间隔。

对于标准的 BLE 读取请求,如上图所示,外设应用程序会不断更新特征的状态。读取时,特征已包含所请求的数据,并立即做出响应。请求和响应保持在一个连接间隔内。

BLE 串行模式的应用延迟也更高,因为连接中的两个设备都不能过滤掉它们不感兴趣的数据种类。因此,所有数据包都必须通过 BLE 发送并传递到应用层,然后才能丢弃不重要的数据包。

BLE 串行策略中浪费时间和电流的另一个因素是在应用层为数据包所增加的开销。数据包标识符、长度字段和校验和都是在 BLE 串行策略中添加到应用层数据包的字段。同样的字段也会添加到封装的 BLE 数据包中。这些重复的字段为 BLE 无线电传输增加了更多比特,但其价值微乎其微,因为 BLE 协议有自己的机制来处理各种相应问题。

如果您的 BLE 产品打算与运行 iOS 和 Android 的设备进行通信,那么还有其他一些注意事项需要牢记。首先,复杂的数据包协议需要更详尽的文档,以便开发人员(很可能在不同的团队中)参照使用。BLE 数据包串行还要求移动应用程序有一个中央数据包处理基础架构来检查所有种类的数据包协议,以便知道如何解析出有用信息并将其发送到哪里。最后,移动编程语言(mobile programming languages, 比如Android的。)很难处理小于一个字节的对象,因此 BLE 串行数据包只能由字节大小的数据单位构成。

BLE 串行数据包的最后一个缺点是,使用自定义数据包协议严重限制了与其他 BLE 软件的互操作性。随着 BLE 无线电设备数量的增加,我们不难想象设备与其合作伙伴应用程序和其他基于 BLE 的系统进行通信的可能性;这才是蓝牙技术联盟配置文件(profiles)真正强大之处,能够实现统一的profiles。

在互联产品中,我们应该选择使用什么技术(What Should You Use in Your Connected Product)

既然您已经知道 BLE串行通信策略的优缺点,你可能会问:"对我们的产品来说,在设计上我该如何做出正确决定?"

答案在很大程度上取决于设计者,因为无论采用哪种方法,都能做出一个可用的产品,完成设计任务。然而,设计方法既会影响产品开发的难易程度,也会影响产品的性能。

在比较通信策略时,首先要考虑的是产品的现实条件限制(physical constraints)。如果吞吐量是您的首要考虑因素,那么串行通信策略可以让您在最短的时间内传输最多的数据,尤其是在大部分数据都是单向流动的情况下。你需要了解如何从 BLE 无线电(radio)中获得最大性能。如果您的蓝牙模块处理能力不足,那么使用该蓝牙模块的最简单接口方式,就是使用串行通信策略的接口。

上面的情况是倾向于使用BLE串行通讯的。如果你正在构建的产品的硬件方案的现实条件的约束不是问题,那么你应该将重点放在用户体验(UX, user experience)限制上:  延迟(latency)。

良好的用户体验首先来自于制造出每次都能正常工作、使用简单(intuitive )的设备。当然需要保证的是,延迟不会影响良好的用户体验。在这种情况下,我们要优化的是连接延迟与应用延迟(connection latency vs. application latency)。

连接延迟是指连接到应用数据传输点所需的时间。另一方面,应用延迟是指从应用向连接设备发出请求到应用得到响应所需的时间。

连接延迟可通过使用更快的广播速率(Advertising rates)、使用更少的服务和特性来改善,就如在 BLE 串行策略中所用的。但是,使用BLE 串行协议是以应用程序延迟为代价的,尤其是在默认情况下,信息流在连接过程中是持续不断的。

使用客户端-服务器设计可避免这种应用延迟,并有助于提供闪电般快速的响应。对于使用的连接保持很长(long-running connections)的设备来说,连接设置时间和应用程序延迟之间的权衡是很容易的( the tradeoff between connection setup time and application latency should be a no brainer)。你可以多添加些特性。

混合模式: 两全其美 (Hybrid Models: The Best of Both Worlds)

BLE 串行策略和客户端-服务器方法是光谱的两端。对于许多产品来说,最佳设计介于两者之间。

在 Punch Through公司来说,客户通常是在已经实现了 BLE 串行策略后才来找此公司咨询的。而当有机会从头( from scratch)开始编写产品的通信协议时,通常会设计一种混合策略。

以下是我们设计混合 BLE 架构的一些经验法则:

  • 从 BLE 串行策略开始,然后根据需要提取功能。

  • 任何需要由中心快速访问的值都应具有外设始终保持更新的可读特性

  • 日志或固件更新等批量后台传输应具有自己的特性,这样才不会阻塞(clog up)与用户体验相关的通信。

  • 应将快速变化的状态信息分组,以便将这些信息视为单个时间点的快照。当系统需要来自多种传感器的数据来描述设备状态时,这一点非常有用。

  • 对当前客户端无用的信息应通过不同的特性进行传输,或让客户端根据自己的兴趣打开或关闭信息。这样,客户端就能控制接收哪些信息。

  • 对其他系统有价值的信息应通过标准蓝牙配置文件公开。(如电池电量battery level、温度等信息)

参考:

1,BLE SPP设计策略

Bluetooth Low Energy Serial: A Valid Design Strategy? | Punch Through

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

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

相关文章

第 359 场 LeetCode 周赛题解

A 判别首字母缩略词 签到题… class Solution { public:bool isAcronym(vector<string> &words, string s) {string pf;for (auto &s: words)pf.push_back(s[0]);return pf s;} };B k-avoiding 数组的最小总和 贪心&#xff1a;从 1 1 1开始升序枚举&#xff0c…

mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除

写在前面&#xff1a; 本文主要介绍mybatis-plus的配置&#xff0c;以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql&#xff0c;这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…

葡萄目标检测(yolov8模型,无需修改路径,python代码,解压缩后直接运行)

运行效果视频&#xff1a;葡萄目标检测&#xff08;yolov8模型&#xff0c;无需修改路径&#xff0c;python代码&#xff0c;解压缩后直接运行&#xff09;_哔哩哔哩_bilibili 1.采用yolov8模型 models文件夹保存的是yolov8的训练好的模型参数 PinotNoir文件夹存放的是训练集 …

局部变量可能会引发的错误---误判---用阶乘函数求强数的 Python 程序中遇到的问题

背景介绍 今天遇到这样一个额需求&#xff1a;用阶乘函数求强数的 Python 程序。所谓强数&#xff0c;就是一个特殊数字&#xff0c;满足其所有数字阶乘的和应等于数字本身的条件。 问题描述 def facorial_of_number(number):result 1for i in range(1, number 1):result *…

如何使用Python实现遥感彩色合成?

综述 遥感影像真彩色合成是一种将多光谱遥感影像转换为真实感彩色影像的技术。它通过将不同波段的遥感数据进行组合&#xff0c;以模拟人眼对地物颜色的感知&#xff0c;从而提供更直观、更易于理解的影像信息。 库索引名&#xff1a;arcpy.CompositeBands_management 通过不同…

如何在window下cmd窗口执行linux指令?

1.Git&#xff1a;https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

[oneAPI] 使用Bert进行中文文本分类

[oneAPI] 使用Bert进行中文文本分类 Intel Optimization for PyTorch基于BERT的文本分类模型数据预处理数据集定义tokenize建立词表转换为Token序列padding处理与mask 模型 结果OneAPI参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517…

标速高就是好?不看4K随机就别买SSD!

游戏玩家心心念念的SSD终于降到了白菜价&#xff0c;1TB的固态硬盘甚至比机械硬盘都便宜了&#xff0c;不过如果只看到动辄3000MB/s的读速&#xff0c;那你下单的时候还真的会被骗。 之所以这么说&#xff0c;是因为商品页面标注的速度都是连续读写速度&#xff0c;也就是直接向…

面试官:JVM是如何判定对象已死的?学JVM必会的知识!

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 引用计数算法可达性分析算法引用类型Dead Or Alive永久代真的"永久"吗&#xff1f;垃圾收集算法标记-清除算法标记-复制算法标记-整理算法标记-清除 VS 标记-整理 作为一名Java程序员&…

Autosar存储入门系列02_NVM之CRC校验及显隐式同步机制

本文框架 0.前言1. NVM中CRC校验2. NVM的显隐式同步机制2.1 隐式同步2.2 显式同步 0.前言 本系列是Autosar存储入门系列&#xff0c;希望能从学习者的角度把存储相关的知识点梳理一遍&#xff0c;这个过程中如果大家觉得有讲得不对或者不够清晰的地方&#xff0c;还请一定指出…

Linus对AMD的fTPM 漏洞表示”沮丧” 呼吁禁用该功能

导读AMD 的 fTPM 问题在业内众所周知&#xff0c;经常导致系统崩溃和卡死。Linux 的创建者 Linus Torvalds 对该功能表示失望&#xff0c;称其为内核的”瘟疫”。 简单回顾一下&#xff0c;可信平台模块&#xff08;Trusted Platform Module 或 TPM&#xff09;是一种安全检查…

抖音火山引擎推出免费域名DNS和公共DNS服务

抖音旗下的云计算服务火山引擎最近推出了"TrafficRoute DNS 套件"服务&#xff0c;其中包括两款产品&#xff0c;对软希网来说非常有用。 1.域名DNS&#xff1a; 这是一个用于网站域名的DNS服务&#xff0c;可以加速域名解析速度&#xff0c;从而提升网站的速度。如…

【100天精通python】Day42:python网络爬虫开发_HTTP请求库requests 常用语法与实战

目录 1 HTTP协议 2 HTTP与HTTPS 3 HTTP请求过程 3.1 HTTP请求过程 3.2 GET请求与POST请求 3.3 常用请求报头 3.4 HTTP响应 4 HTTP请求库requests 常用语法 4.1 发送GET请求 4.2 发送POST请求 4.3 请求参数和头部 4.4 编码格式 4.5 requests高级操作-文件上传 4.6 …

线性代数的学习和整理4: 求逆矩阵的多种方法汇总

目录 原始问题&#xff1a;如何求逆矩阵&#xff1f; 1 EXCEL里&#xff0c;直接可以用黑盒表内公式 minverse() 数组公式求A- 2 非线性代数方法&#xff1a;解方程组的方法 3 增广矩阵的方法 4 用行列式的方法计算&#xff08;未验证&#xff09; 5 A-1/|A|*A* &…

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 在本系列中&#xff0c;我们将构建一个 NodeJS 微服务&#xff0c;并使用…

【排序】插入排序 希尔排序(改进)

文章目录 插入排序时间复杂度空间复杂度 代码希尔排序时间复杂度空间复杂度 代码 以从小到大排序为例进行说明。 插入排序 插入排序就是从前向后&#xff08;i1开始&#xff09;进行选择&#xff0c;如果找到在i之前&#xff08;分配一个j下标进行寻找&#xff09;有比array[i…

第 7 章 排序算法(2)(冒泡排序)

7.5冒泡排序 7.5.1基本介绍 冒泡排序&#xff08;Bubble Sorting&#xff09;的基本思想是&#xff1a;通过对待排序序列从前向后&#xff08;从下标较小的元素开始&#xff09;,依次比较相邻元素的值&#xff0c;若发现逆序则交换&#xff0c;使值较大的元素逐渐从前移向后部…

手写Promise一:结构的设计

手写Promise 这里写目录标题 手写Promise手写Promise的规范手册promisesaplus官网手写Promise-结构的设计 手写Promise的规范手册promisesaplus官网 链接: 官网链接 手写Promise-结构的设计 // 手写Promsie const PROMISE_STATUS_PENDING pending //等待状态 const PROMIS…

自动驾驶仿真:基于Carsim开发的加速度请求模型

文章目录 前言一、加速度输出变量问题澄清二、配置Carsim动力学模型三、配置Carsim驾驶员模型四、添加VS Command代码五、Run Control联合仿真六、加速度模型效果验证 前言 1、自动驾驶行业中&#xff0c;算法端对于纵向控制的功能预留接口基本都是加速度&#xff0c;我们需要…

【LeetCode75】第三十四题 叶子相似的树

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们两棵二叉树&#xff0c;让我们判断这两棵二叉树的从左到右的叶子节点组成的叶子序列是否一致&#xff0c;即从左到右的叶子节点的数…