蓝牙低能量 - 重复更新的特征值(Bluetooth Low Energy - updating a

2019-07-29 04:29发布

后续问题上的电气工程Stackexchange

我想重复写在短时间内蓝牙低功耗特性的值(作为可能的使用情况,想象鼠标)。

  • 与128位的UUID的特征是20个字节长。 因此,可以写在一个单一的低能源交易。
  • 写入发生在50Hz的速率,即等于每20ms一次写入。
  • 因此,20×50×8 = 8 kbit / s的写入。
  • 我使用的命令 / 写而不响应模式来写的特征。 因此,没有确认发生在属性层上。
  • 没有其他的蓝牙或蓝牙低功耗设备连接。 没有什么是通过WLAN进行。 没有其他特性,如阅读或在测试期间写的。

我测试通过发送从iPhone 4S含有序列号的分组的程序。 序列号由一个发送各个分组之后递增。

在接收侧,可编程开发板,内置有CSR1000 BLE芯片,用于接收所述分组,并且打印所接收到的序列号到串行连接。

我的问题如下:

  • 一段时间后,包开始越来越下降。 第一〜100包做工精细@ 50赫兹。 从此,包开始越来越下降。

      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千比特/秒,而不管写入的频率的。 这是明显低于〜305 kbit / s的,应该是技术上是可行的蓝牙低能量。

  • 该问题也将出现相反的方向,当我从开发板到iPhone 4S的发送数据包。 同样,5 kbit / s的是,我得到了最大。 通知机制用于此方案。 同样,没有确认发生在属性层上。

  • 当我尝试在两个方向上同时发送,做起事情来炸毁的地方我一定要复位两个开发板和iPhone 4S的地步。

问题:

  • 愿这是蓝牙低功耗芯片的问题,那就是在开发板上用吗?

    如果是的话,为什么问题也会发生到相反的方向,让iPhone充当接收器?

    是否有支持特性高频接入市场上任何的开发板?

  • 可能是什么问题的根源?

    也请尽量引用蓝牙规格/演示幻灯片/品及其零件,除了假设。

目前市场上存在低功耗蓝牙鼠标。 小鼠具有125赫兹的典型轮询率,必须至少派两名16字节值加上每个时钟周期的额外开销HID。 因此,对于我的问题的解决方案应该是可用的。

更新

LE连接完成事件蓝牙规范版本4.0卷第2部分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

Answer 1:

发行5 Kbit / s到33〜kbit / s的一个连接参数更新解决了这个问题,并提高产量。 然而,这仍然低于预期〜305千比特/秒。

Conn_Interval = 0x000f = 18.75 ms
Conn_Latency  = 0x0000
Supervision_Timeout = 0x00fc

是否有任何方法来达到全〜305 kbit / s的?

后续问题上的电气工程Stackexchange

可以通过燃烧TSI和等待了一个月得到苹果回复。

基本上,他们告诉该行为意图的iOS 5.1。 它在某种程度上是有道理的,因为他们不希望你的应用程序的性能取决于另一个应用是使用蓝牙或WiFi。

每工程师的意见 - 在的iOS 5.1应该有一个连接间隔期间6对的通知,这意味着6 * PACKETSIZE * 1000 /间隔。 这应转化为〜55kbps最大(最小间隔为20ms,PACKETSIZE是23个字节)。 我们作出决定,限制每个区间对的数量,有一个最小间隔归因于iPhone和iPad这两个有共同的经典BT,BT LE和WiFi天线之间的事实。

iOS的LE被设计为低功率传输。 对于更高的吞吐量BT经典是一个更好的传输方法。

回到我身边 - 基于上述工程师的意见,如果这种愿望是实现了200个KBS吞吐量,经典蓝牙就是答案。 然而,如果这种愿望是在iPhone上的应用程序的工作,我能理解,这是没有简单的变化 - 经典BT需要MFI授权。



Answer 2:

主要的问题似乎是,这是您所使用的芯片上的缓存问题。 从核心规格,第3卷,F部分,3.3.2:

对于通知,不具有一个响应PDU,没有流控制和通知可以在任何时候被发送。

不需要响应命令没有任何流量控制。 注意:一个服务器可以与命令被淹没,和更高的层规范可以定义如何防止这种情况发生。

命令和接收,但不能被处理的通知,由于缓冲器上溢或其它原因,应被丢弃。 因此,对这些PDU必须被认为是不可靠的。



Answer 3:

什么时候包被丢弃,你所看到的是由于缓冲器在iPhone上侧溢出是(最有可能的,我认为),或在主机端。 与iOS 11.2开始,苹果提供了一种机制,允许你检查缓冲区写入下一个数据包之前准备好; canSendWriteWithoutResponse:

如果等到canSendWriteWithoutResponse是写一个数据包之前真,交货guarantied已被放置在接收缓冲区,但不guarantied,它已被处理(未确认)。 另一件事,可以帮助是在185B谈判MTU尺寸大于20苹果支持MTU,以及高达251(扩展的数据长度也称为EDL)。 通过在MTU-3尺寸的组块数据的数据包,数据包==(MTU-3)×1每连接时间间隔。 @ 185B MTU,24毫秒的连接间隔我吞吐量48kbps的周围没有丢弃的数据包。 当从设备发送数据到iPhone,对端SDK将需要相当于“canSendWriteWithoutResponse”,这在我的情况下,使用SILABS硬件/ SDK确实有如

```

 do {
     result = gecko_cmd_gatt_server_send_characteristic_notification(
              0xFF,
              evt->data.evt_gatt_server_attribute_value.attribute,
              chunk.length,
     [chunk bytes])->result;
 } while(result == bg_err_out_of_memory); 
  //retry until buffer is empty and ready for more 
 //then update the offset
 offset += thisChunkSize;

```

下面是苹果解释不同BLE技术和预期速度的视频和.pdf。 MTU +连接间隔是你用什么来确定最大吞吐量。 48kps应该很容易实现的,而且的96kbps也许有点高是可能的。

在蓝牙核心的新增功能

video: https://devstreaming-cdn.apple.com/videos/wwdc/2017/712jqzhsxoww3zn/712/712_hd_whats_new_in_core_bluetooth.mp4?dl=1
pdf: https://devstreaming-cdn.apple.com/videos/wwdc/2017/712jqzhsxoww3zn/712/712_whats_new_in_core_bluetooth.pdf 


文章来源: Bluetooth Low Energy - updating a characteristic value repeatedly