BLE 设备丢包理解

前言

  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.xdnf.cn/news/1541425.html

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

相关文章

力扣中等 153.寻找旋转排序数组中的最小值

文章目录 题目介绍题解 题目介绍 题解 正解:可以和数组最后一个数比较,来判定二分的位置是在最小值的左侧还是在最小值的右侧。 在0到n-2二分,如果nums[mid] > nums[n - 1],则mid在最小值的左侧,mid和其左侧染成红…

[每周一更]-(第115期):不同系统安装godoc

文章目录 主要功能 安装WindowsmacOSLinux环境变量配置WindowsmacOS 和 Linux 如何使用 godoc 生成自己项目的文档1. 安装 godoc2. 编写注释3. 启动 godoc 服务器4. 访问文档 生成静态文档示例输出总结 godoc 是一个 Go 语言的工具,用于生成和查看 Go 代码的文档。它…

SAP HCM 每月生成年假解决方案(PT_QTA00)

每月生成年假定额:HCM复杂的模块,年假生成就是一个比较复杂的模块,每次做项目都比较怕做年假、余假生成的业务,因为企业业务复制,SAP的这块配置也很复杂,因为这里面涉及的知识面很多,工龄计算、…

数据采集与预处理,前后端结合案例(有代码),Python连接MySQL,对MySQL的增删改查

Python对MySQL的增删改查 通过Python连接MySQL """连接MySQL数据库,并进行增删改查,同时查询了MySQL版本号,并做了动态注册的账号,实现过程:先向userinfo当中添加account、password新字段&#xff0c…

mysqldump使用cmd窗口和powersell窗口导出sql中文乱码的问题

项目场景 我在使用Mariadb数据库更新数据的时候,由于数据库的表格中含有中文,在使用mysqldump导出sql语句的时候,中文显示乱码,如下图所示: 环境描述 系统:windows10数据库: Mariadb -10.6.16…

空间解析几何2:空间中两线段/直线的距离【附MATLAB代码】

目录 理论公式 MATLAB代码 理论公式 MATLAB代码 公式实现 function [dis,P,Q,t1,s1]line2LineDistance(A1,B1,C1,D1) %求两线段的最短距离 % input % A1,B1为线段一的两端点 C1,D1为线段二的两端点 % output % dis,为两线段的最短距离,P,Q为距离最短时在两线段上…

综述论文“Towards Personalized Federated Learning”分享

综述论文“Towards Personalized Federated Learning”分享 文章目录 综述论文“Towards Personalized Federated Learning”分享I. 引言A. 联邦学习的分类B. 个性化联邦学习的动机C. 贡献 II. 个性化联邦学习的策略策略I:全局模型个性化策略II:学习个性…

简单多状态dp第一弹 leetcode -面试题17.16.按摩师 -213.打家劫舍II

a​​​​​​​面试题 17.16. 按摩师 按摩师 题目: 分析: 使用动态规划解决 状态表示: dp[i] 表示:选择到 i 位置时,此时的最长预约时长。 但是我们这个题在 i 位置的时候,会面临 选择 或者 不选择 两种抉择,所依赖的状态需要…

集成学习详细介绍

以下内容整理于: 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble):选择一个由一系列假设h1, h2, …, hn构成的集合…

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一:子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二:显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…

从理论再到实践:AI大模型学习路线,提升核心竞争力,看这篇就够了

一、初聊大模型 1、什么是大模型? 大模型,通常指的是在人工智能领域中的大型预训练模型。你可以把它们想象成非常聪明的大脑,这些大脑通过阅读大量的文本、图片、声音等信息,学习到了世界的知识。这些大脑(模型&#…

基于 Qwen2.5-Coder 模型和 CrewAI 多智能体框架,实现智能编程系统的实战教程

9 月 19 日,阿里开源了 Qwen2.5 系列大模型全家桶:除常规的语言模型 Qwen2.5 之外,还发布了专门针对编程的Qwen2.5-Coder模型和数学的 Qwen2.5-Math 模型,并且针对每个模型都提供了不同规模参数版本,包括: …

CSP-CCF★★★201909-2小明种苹果(续)★★★

一、问题描述 二、解答 关键:判断是否发生苹果掉落,使用flag[]数组来标记,1为掉落,0为没有掉落,这样也是为了后续比较连续三棵树是否掉落 误区:用最后一次正数(即最后一次统计苹果个数&#x…

芯片开发(1)---BQ76905---底层参数配置

主要开发思路:AFE主要是采集、保护功能、均衡,所以要逐一去配置芯片的寄存器 采集、均衡功能主要是配置引脚 保护功能主要是参数寄存器配置,至于如何使用命令修改寄存器参数该系列芯片提供了子命令和直接命令两种方式 BQ76905的管脚配置 I、参数配置 …

AI赋能篇:万物皆可播,AI视频直播新趋势,轻松打造24h不间断开播!

AI赋能篇:万物皆可播,AI视频直播新趋势,轻松打造24h不间断开播! 在数字化浪潮的推动下,人工智能(AI)正以前所未有的速度渗透到我们生活的每一个角落,其中,AI视频直播作为…

工控一体机在高精度玻璃检测机中的应用

工控一体机在高精度玻璃检测机中的应用主要体现在以下几个方面: 一、数据采集与处理 工控一体机作为工业控制计算机,能够高效采集来自高精度玻璃检测机中各种传感器和执行器的数据。这些数据包括但不限于玻璃表面的图像信息、厚度、温度、光学特性等。…

05 基于STM32的DHT11温湿度获取及OLED显示(库函数)

本专栏所有源资料都免费获取,无任何隐形消费。 注意事项:STM32仿真会存在各种各样BUG,且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列,在PROTUES仿真里,32单片机一般只用一种型号,如需其他型号,可改名。 本次功能…

初中数学证明集锦之三角形内角和

导言 非常喜欢数学那套,由简单到复杂,逐层递进的证明之美。 既证了,而且明了 😃 让人不得不信服! 由人教版教材看到的三角形内角和180度的证明法,觉得现在课本不单传播了知识,而且点睛数学之…

STM32CubeIDE | 使用HAL库的ADC读取内部传感器温度

1、cubemx配置 1.1、系统配置 1.2、GPIO配置 PB2设置为“GPIO_Output” user label设置为“LED” 1.3、串口配置 模式选择为“Asynchronous”,其他默认 1.4、时钟树配置 全部保持默认 2、ADC配置 通道选择“Temperature Sensor Channel”,其他默认 …