BLE 设备丢包理解

news2024/11/17 1:45:32

前言

  1. 个人邮箱:zhangyixu02@gmail.com
  2. 在学习 BLE 过程中,总能听到 “丢包” 一词,但是我查阅资料又发现,有大佬说,ATT所有命令都是“必达”的,不存在所谓的“丢包”。而且我发现,在宣传 BLE 产品时候,从来没有商家宣传过自己丢包率有多低,一般都是宣传的功耗传输速率
  3. 一顿操作下来,这彻彻底底把我这个菜鸟搞懵逼的了。为了搞明白这其中的概念,我查阅了各种资料,结合个人理解写一下我对 BLE 丢包这一词的概念。
  4. 如果有误,请大佬不吝赐教。

丢包的概念

个人认为,对于丢包这一词,我们应当站在不同的层级说不同的话,这样我们就能够真正的理解,为什么有些大佬说ATT所有命令都是“必达”的,不存在所谓的“丢包”。而又有一些大佬说,BLE 怎么可能不丢包。这**两种说法其实并没有错误,只是所站的角度不同
**,因此说出来的话看起来完全对立。

Control 层

丢包理解

  1. 在 Control 层是存在丢包行为的,因为电磁干扰网络带宽不足信号衰减设备故障等物理因素导致数据包无法成功传递到对端设备。
  2. 因此,当发送数据给对端设备的 150us 后需要收到对端设备的 ACK 回应数据包。如果没有收到对端设备的 ACK,那么就会启动重传机制,一直等到对端设备发回的 ACK 命令,如果等待时间超过了监管超时时间那么就会进行断连。
  3. 对端设备在收到数据后,会进行 CRC 校验,确保数据在传输过程中没有因为各种物理因素导致接收到错误信息。

什么是 ACK

  1. 这个时候肯定会有人问,ACK 是啥玩意,怎么抓包没有抓取过,难道空包就是 ACK?如果你明白了 BLE LL 层数据包结构,就将会明白所谓的 ACK 是什么了。
  2. 首先我们先看一下 LL 层数据包格式,我们重点看 SN 和 NESN 这两位进行重传判断。
  • 序列号(SN):当前主机发送的数据包序列。
  • 下一个预期序列号(NFSN):从机期待收到下一个主机发来的数据包序列号。

在这里插入图片描述

  1. 现在我们来看看实例进一步理解。
  • 主机发送数据报文,SN = 0,NESN = 0
  • 从机此时收到数据报文后,期望下一包收到的数据包序列号为 0,因此 NESE = 1。而当前数据包是用于回复主机序列号为 0 的数据包的,因此,SN =0。
  • 因为各种原因,一段时间内主机并没有收到从机回复包,因此进行数据重传。
  • 从机收到重传数据后,发现 SN 依旧为 0。那么说明主机并没有成功收到上一此从机发送的响应包,因此继续重传上一次数据。
  • 主机此时收到从机的响应包了,那么就更新 SN = 1 ,并且期望从机回复该数据包,因此 NESE = 1。
  • 从机收到数据包后,更新 SN 和 NESN。

在这里插入图片描述

  1. 通过上面的例子,我们现在明白了,整个 BLE 的重传机制。那么我们再举几个例子加深理解。
  2. 假如,我设置了从机延迟从机可以忽略主机的数据包,那么整个机制是怎么样的呢?
  3. 主机首先发送数据包给从机从机进行忽略。此时主机继续重发,从机继续忽略。然后主机继续重发,一直重发到从机发送回包时才会开始发下一包其他数据,或者超过监管超时时间,发生断连。
  4. 上面这个需要注意一点,从机发送的回报,有可能是空包,也有可能是包含数据的数据包。如下图,主机发送 LL_VERSION_IND,从机回复的却是 LL_FEATURE_RSP。

core 5.3的 2861 页存在这样如下描述。因此,这种 LL 层 PDU 发生碰撞是允许的,整个数据包分析要结合整个数据交互流程才可知道。
Note: Because Link Layer PDUs are not required to be processed in real time, it is possible for the local Controller to have queued but not yet transmitted an LL_LENGTH_REQ PDU when it receives an LL_LENGTH_REQ PDU from the peer device. In this situation each device responds as normal; the resulting collision is harmless.

在这里插入图片描述

HOST 层

  1. 对于 HOST 层而言,数据包是必达的。因为 Control 层存在 CRC 和重传机制,因此 HOST 层数据只要传递给了 Control 层,只要没有断连,那么数据就一定会正确的传递到对端设备。
  2. 我们需要注意的一点是,不是 req 的命令,虽然协议栈底层确保了该命令必达对方,但应用层其实并不知道。而 req 命令会产生回调函数,这会应用层是知道的,从而实现特定的通讯逻辑。但是,这两种命令都会产生回包确保数据必达

应用层

  1. 在 HOST 层,我们知道数据是必达的,那么应用层数据还有讲的必要吗?很显然,是有必要的。因为很多从事应用开发的人会经常说,数据丢包数据丢包。其实,这个并不是丢包,而是你的数据包正确没有完整安全地送达到协议栈射频 FIFO 。这才导致了所谓的丢包。
  2. 如果应用层没有及时的处理资源不足(如内存不足)处理异常,短时间发送太多数据,导致对端设备接收端的缓冲区被填满,新的数据包被丢弃等行为将会导致数据不能成功的存储在射频 FIFO中,因此存在所谓的丢包问题。

总结

  1. 通过上面的分析,我们也将能够知道,为什么 BLE 设备厂商从来不宣传丢包率,而是宣传速率的问题了吧。
  2. 因为只要你程序写对了,数据完好无损的放入了射频FIFO中,数据就一定会到达对端设备。而空中的丢包,将会以速率的形式体现,因为你空中包丢包次数一多,那么数据就需要多次进行重传,那么最终拖慢传输速率。

参考

  1. 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
  2. 《低功耗蓝牙开发权威指南》7.8.4 确认

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

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

相关文章

tcp、udp通信调试工具Socket Tool

tcp、udp通信调试工具Socket Tool ]

Rust 运算符快速了解

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 4.1 运 算 符 前面已经学习了变量和常量,本节开始对它们进行操作&am…

java之单链表的基本概念及创建

1.链表的概念: 链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 组成结构: 由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。 优点: 动态大小,易于插入和删除操作。 缺点…

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术,tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域,如何把核苷酸或氨基酸序列tokenization成token呢? 我们可以使用k-mer技术: k-m…

GDPU Andriod移动应用 Activity

移动应用开发入门级必看,用活动打造属于你的页面。 重要的更新公告 !!!GDPU的小伙伴,感谢大家的支持,希望到此一游的帅哥美女能有所帮助。本学期的前端框架及移动应用,采用专栏订阅量达到50才开…

医院伤员小程序点餐———未来之窗行业应用跨平台架构

一、读取服务器医院信息 var 未来之窗人工智-商家信息-医院职工 {//2024-09-22 cyber_getMerchant_CardUser_V20240922: function(appikkey,merchant_id,store_id,ecogen_sponsor_appid,openid,frommsg,wlzc_callback) {//2023-7-6 里程碑var wlzcapi"加入url";wx.re…

深度学习自编码器 - 去噪自编码器篇

序言 在深度学习的广阔天地中,自编码器作为一种强大的无监督学习工具,通过重构输入数据的方式,不仅实现了数据的有效压缩,还探索了数据的内在表示。而去噪自编码器( Denoising Autoencoder, DAE \text{Denoising Auto…

ES6 -- 2015

学习视频 1. let和const 1.1 let 变量必须先声明再使用同一变量不能重复声明变量有块级作用域 1.2 const 声明常量,常量不能改变常量必须有初始值,不能先声明再赋值 2. 解构 1 数组解构 保持左右的结构一样,安装顺序一一对应 完全解构…

CVE-2024-46101

前言 自己挖的第一个CVE~ 喜提critical 这里简单说一下。 漏洞简介 GDidees CMS < 3.9.1 的版本&#xff0c;存在一个任意文件上传漏洞。允许登录后的攻击者上传webshell获得网站的权限。 影响版本&#xff1a; GDidees CMS < 3.9.1 &#xff08;其它的我没测。。&am…

日志系统扩展二:日志服务器的实现

日志系统扩展二&#xff1a;日志服务器的实现 一、设计1.为何要这么扩展&#xff1f;2.应用层协议的选择1.HTTP&#xff1f;2.自定义应用层协议 二、自定义应用层协议的实现1.声明日志器1.服务器和客户端这里日志器的关联2.枚举类型的定义3.sinks数组的定义 2.打印日志1.logMes…

MySQL record 06 part

事务、存储过程 事务&#xff1a; MySQL的同步&#xff0c;同步是指 together done&#xff0c;要么一起前进&#xff0c;要么一起后退的意思。 注意&#xff0c;回滚 rollback 对已经提交 commit 的数据是无效的&#xff0c;也就是说&#xff0c;只能对没有被提交 commit …

CSS 布局三大样式简单学习

目录 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 relative 2.3 fixed 3. css 盒子模型 3.1 效果1 3.2 效果2 3.3 效果3 3.4 效果4 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 …

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

希尔排序(C语言实现)

目录 1.希尔排序( 缩小增量排序 ) 2.动图 ​编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结&#xff1a; 1.希尔排序( 缩小增量排序 ) 基本思想&#xff1a; 1.先选定一个…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试&#xff1a;unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的&#xff0c;然后没改东西&#xff0c;点完应用Apply以后&#xff0c;就可以调试了...&#xff08;不…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等

code-with-quarkus code-with-quarkus 是使用官网生成的demo项目 这个项目使用Quarkus&#xff08;使用3.13.0版本&#xff0c;该版本支持JDK21&#xff09;&#xff0c;超音速亚原子Java框架。官网地址: https://quarkus.io/. 环境要求 OS: Windows 10.0 jdk 11 maven 3.9…