我想在短时间内重复写入低功耗蓝牙特性的值(作为一个可能的用例,想象一下鼠标)。
- 128 位 UUID 的特征是20 字节长。因此,它可以写在单个 Low Energy 事务中。
- 写入以 50 Hz 的速率发生,即每 20ms写入一次。
- 因此,写入20 * 50 * 8 = 8 kbit/s 。
- 我正在使用无响应的命令/写入模式来写入特征。因此,属性层上不会发生任何确认。
- 未连接其他蓝牙或蓝牙低功耗设备。没有通过 WLAN 执行任何操作。在测试期间不会读取或写入其他特征。
我通过从 iPhone 4S 发送包含序列号的数据包来测试程序。每发送一个数据包后,序列号就加一。
在接收端,使用包含CSR1000 BLE 芯片的可编程开发板接收数据包并将接收到的序列号打印到串行连接。
我的问题如下:
一段时间后,数据包开始被丢弃。前约 100 个数据包在 50 Hz 下工作正常。从那时起,数据包开始被丢弃。
0x00 - 0x46 received 0x47, 0x48 missing 0x49, 0x4a, 0x4b, 0x4c received 0x4d missing 0x4e, 0x4f, 0x50, 0x51 received 0x52 missing 0x53, 0x54, 0x55, 0x56 received 0x57 missing ...
大多数情况下,一包四个数据包可以很好地传输(很少,只有 2 个数据包)。然后,1-7 个数据包丢失。
当我减小特征值大小时,问题仍然存在。
当我以 100Hz 而不是 50Hz 写入时,情况是一样的 - 只是在大约 35 个数据包之后开始发生丢包,并且在四个数据包的成功传输之间丢弃了 5-7 个数据包。
对于丢失的数据包,无论写入频率如何,最终的传输速率约为 5 kbit/s。这显然低于蓝牙低功耗技术上应该可行的约 305 kbit/s。
当我从开发板向 iPhone 4S 发送数据包时,问题也出现在相反的方向。同样,5 kbit/s 是我得到的最大值。通知机制用于这种情况。同样,属性层上不会发生任何确认。
当我尝试同时向两个方向发送时,事情开始恶化到我必须重置开发板和 iPhone 4S 的地步。
问题:
这可能是开发板上使用的蓝牙低功耗芯片的问题吗?
如果是,为什么问题也会出现在相反的方向,即 iPhone 充当接收器?
市面上有支持高频访问特性的开发板吗?
问题的根源可能是什么?
除了假设之外,还请尝试参考蓝牙规范/演示幻灯片/文章的部分内容。
市场上有蓝牙低功耗鼠标。鼠标的典型轮询速率为 125 Hz,并且必须至少发送两个 16 字节的值以及每个滴答的额外 HID 开销。因此,我的问题的解决方案应该是可用的。
更新
LE 连接完成事件在蓝牙规范版本 4.0 Vol 2 Part E 第 7.7.65.1 节中进行了描述。我收到以下不同连接参数的值:
Parameter Value Description
--------------------------------------------------
Conn_Interval 0x0054 Time = 105 ms
Conn_Latency 0x0000 Time = 0 ms
Supervision_Timeout 0x00fc Time = 2520 ms
Master_Clock_Accuracy 0x05 50 ppm