BLE 丢失数据包(协议/规范问题)
BLE Missing Packets (Protocol / Spec question)
我最近一直在学习 BLE 的具体细节,因为我打算使用 BLE 堆栈进行一些开发工作。我从在线文档和规范中学到了很多东西,但有一个方面我似乎找不到。
BLE 使用跳频进行通信。一旦连接了两个设备(一个主设备和一个从设备),看起来所有的通信都是通过主设备启动的,从设备响应每个数据包。我的问题涉及空中数据包丢失。我关心的主要有两个案例:
- Master 发送一个数据包,Slave 接收到数据包,Slave 将数据包发回给Master。 master 没有收到数据包,或者如果收到,则数据包已损坏。
- Master 发送了一个数据包,但没有被 Slave 接收到。
案例 1 对我来说是“不关心”(我认为)。基本上主人没有得到回复,但至少,奴隶得到了数据包并且可以“同步”到它。 master 做任何事情并尝试在下一个连接事件中传输数据包。
情况 2 是更难的情况。从机未收到数据包,因此无法将其通信“同步”到当前频道。
当数据包在空中丢失时(特别是情况 2),设备之间究竟如何同步信道跳变序列?是的,有一个频道映射,所以从技术上知道下一个连接事件要跳转到什么频率。然而,我能看到所有这一切发生的唯一方法是通过基于连接参数的“自定时”机制。这够好了吗?我的意思是,考虑到时钟漂移,主设备和从设备在同一通道上传输和接收的时间量会略有不同……最终它们将关闭 1 个通道……2 个通道,等等。是这不是真正的问题,因为根据 500ppm 时钟规范,要实现 'a lot' 的时间需要经过吗?我知道有一个主管计时器会在一段时间内没有传输有效数据后声明连接已死。但是,我仍然对“跳跃漂移”感到疑惑,这让我想到了下一点。
协议中使用/规定了多少“自我计时”?从属设备是否在每个连接间隔都使用来自主设备的有效数据包开始来重新同步信道跳变?例如,如果 (connection interval + some window) 过去了,跳到下一个频道,或者如果收到数据包重新同步/重启超时计时器。这将是一个独立于主管计时器的跳跃计时器。
我真的无法在核心 5.2 规范中找到此信息。它非常密集,只有 3000 多页......如果有人可以指出规范或其他地方的相关部分......甚至回答问题,那就太好了。
从机知道通道映射。如果没有从主机收到一个数据包,它将在一个连接间隔后在下一个通道上再次侦听。如果它也没有收到,它会增加一个额外的连接间隔和下一个频道。
当检测到最后一个从主设备接收到的数据包时,无论 crc 是否正确,从设备也会存储一个时间戳(或事件计数器)。这称为锚点。这与用于监管超时的时间点不同。
锚点和下一个预期数据包之间的时间量乘以主设备 + 从设备精度(例如 500 ppm)以获得接收 window,加上 16 微秒。因此从站在预期数据包到达时间之前和之后监听这段时间。
我最近一直在学习 BLE 的具体细节,因为我打算使用 BLE 堆栈进行一些开发工作。我从在线文档和规范中学到了很多东西,但有一个方面我似乎找不到。
BLE 使用跳频进行通信。一旦连接了两个设备(一个主设备和一个从设备),看起来所有的通信都是通过主设备启动的,从设备响应每个数据包。我的问题涉及空中数据包丢失。我关心的主要有两个案例:
- Master 发送一个数据包,Slave 接收到数据包,Slave 将数据包发回给Master。 master 没有收到数据包,或者如果收到,则数据包已损坏。
- Master 发送了一个数据包,但没有被 Slave 接收到。
案例 1 对我来说是“不关心”(我认为)。基本上主人没有得到回复,但至少,奴隶得到了数据包并且可以“同步”到它。 master 做任何事情并尝试在下一个连接事件中传输数据包。
情况 2 是更难的情况。从机未收到数据包,因此无法将其通信“同步”到当前频道。
当数据包在空中丢失时(特别是情况 2),设备之间究竟如何同步信道跳变序列?是的,有一个频道映射,所以从技术上知道下一个连接事件要跳转到什么频率。然而,我能看到所有这一切发生的唯一方法是通过基于连接参数的“自定时”机制。这够好了吗?我的意思是,考虑到时钟漂移,主设备和从设备在同一通道上传输和接收的时间量会略有不同……最终它们将关闭 1 个通道……2 个通道,等等。是这不是真正的问题,因为根据 500ppm 时钟规范,要实现 'a lot' 的时间需要经过吗?我知道有一个主管计时器会在一段时间内没有传输有效数据后声明连接已死。但是,我仍然对“跳跃漂移”感到疑惑,这让我想到了下一点。
协议中使用/规定了多少“自我计时”?从属设备是否在每个连接间隔都使用来自主设备的有效数据包开始来重新同步信道跳变?例如,如果 (connection interval + some window) 过去了,跳到下一个频道,或者如果收到数据包重新同步/重启超时计时器。这将是一个独立于主管计时器的跳跃计时器。
我真的无法在核心 5.2 规范中找到此信息。它非常密集,只有 3000 多页......如果有人可以指出规范或其他地方的相关部分......甚至回答问题,那就太好了。
从机知道通道映射。如果没有从主机收到一个数据包,它将在一个连接间隔后在下一个通道上再次侦听。如果它也没有收到,它会增加一个额外的连接间隔和下一个频道。
当检测到最后一个从主设备接收到的数据包时,无论 crc 是否正确,从设备也会存储一个时间戳(或事件计数器)。这称为锚点。这与用于监管超时的时间点不同。
锚点和下一个预期数据包之间的时间量乘以主设备 + 从设备精度(例如 500 ppm)以获得接收 window,加上 16 微秒。因此从站在预期数据包到达时间之前和之后监听这段时间。