BLE丢失数据包协议/规范问题

问题描述

我最近一直在学习BLE的基本知识,因为我打算使用BLE堆栈进行一些开发工作。我从在线文档和规范中学到了很多东西,但是似乎找不到一个方面。

BLE使用跳频进行通信。一旦连接了两个设备(一个主设备和一个从设备),则似乎所有通信都通过主设备启动,而从设备则响应每个数据包。我的问题涉及空中丢失数据包。我关注的主要情况有两个:
  1. 主设备发送从设备接收的数据包,而从设备将数据包发送回主设备。主机没有收到数据包,或者如果收到,则说明数据包已损坏。
  2. 主设备发送从设备未收到的数据包。

对我而言,情况1是“不关心”(我认为)。基本上,主机不会收到答复,但至少,从机会收到数据包并可以“同步”它。主机做任何事情,并在下一个连接事件尝试传输数据包。

情况2是最困难的情况。从站未接收到数据包,因此无法将其通信“同步”到当前频道。

当数据包在空中丢失时(具体情况2),设备如何准确地彼此同步信道跳变序列?是的,有一个通道映射,因此从站从技术上知道下一次连接事件要跳到的频率。但是,我可以看到所有这些情况的唯一方法是通过基于连接参数的“自定时”机制。这样够好吗?我的意思是,考虑到时钟漂移,主机和从机在同一通道上进行发送和接收的时间量会略有不同...最终它们将相差1个通道。.2个通道,等等。这不是一个真正的问题,因为要做到这一点,基于500ppm时钟规格需要花费大量时间?我知道有一个主管计时器,该计时器会在一段时间内未传输有效数据后宣布连接中断。但是,我仍然对“跳跃漂移”感到好奇,这使我进入了下一个观点。

协议中采用/规定了多少“自我计时”?从设备是否在每个连接间隔内使用来自主设备的有效数据包开头来重新同步通道跳动?例如,如果经过了(连接间隔+某个窗口),则跳到下一个通道,或者如果接收到的数据包重新同步/重启超时计时器。这将是与主管计时器分开的跳跃计时器。

我在5.2核心规范中找不到真正的信息。它只有3000多个页面,非常密集...如果有人可以将我指向规范中的相关部分或其他地方,甚至回答问题,那将很棒。

解决方法

从站知道通道映射。如果未从主机接收到一个数据包,它将在下一个通道上的一个连接间隔后再次侦听。如果还没有收到,则会增加一个额外的连接间隔和下一个频道。

从站也将在检测到最后一次从主站收到的数据包时存储时间戳(或事件计数器),而不管crc是否正确。这称为锚点。这不是用于监督超时的时间点。

锚点和下一个预期数据包之间的时间量乘以主机+从机精度(例如500 ppm)以获得接收窗口加上16微秒。因此,从站会在预期的数据包到达时间之前和之后监听这段时间。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...