代码之家  ›  专栏  ›  技术社区  ›  Wojciech Kulik

基于iOS的蓝牙低能数据传输

  •  1
  • Wojciech Kulik  · 技术社区  · 6 年前

    我最近在做一个使用蓝牙低能耗的项目。我实现了大部分的通信协议,但是我开始担心,实际上我不知道数据传输是如何工作的,我实现的解决方案是否会在所有设备上以相同的方式运行。

    所以我主要关心的是当我收到来自 peripheral(_:didUpdateValueFor:error:) ? 是不是只有协商好的MTU大小?或者iOS接收到关于块大小的信息,并在触发之前等待全部接收 外围设备(didUpdateValueFor:错误:) ?

    当一个外设发送数据块时,比如说每个100字节,我可以假设我总是在一个通知中得到100字节吗?或者可能是前一个块的最后50个字节,下一个块的前50个字节?这将是相当棘手的,很难发现哪里是我的框架的开始。

    我试图在苹果的文档中找到更多的信息,但是没有任何相关信息。

    我的猜测是,我总是收到一个单一的特征状态。因此,这意味着块依赖于外设端的实现。但如果特性大于MTU大小呢?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rob Napier    6 年前

    首先,请记住,通过特性发送流数据并不是特性的目的。特征点是表示一些小的(大约20字节)信息,如当前电池电量、设备名称或当前心跳。其思想是,只有当参考底图值更改时,特征才会更改。它从未被设计成串行协议。所以你默认的假设应该是一切都由你来管理。

    您不应该向特征写入的数据超过从中获取的值 maximumWriteValueLength(for:) . 分块是你的工作。

    你所写的每一个单独的值都会以原子的方式呈现给接收者。请记住,这些值都是单独的值,而不是从较大的数据流中分块出来的,因此重叠来自同一个特征的值是没有意义的。”原子“意味着它全部或全部到达。所以如果你的MTU可以处理100个字节,你写100个字节,另一方将收到100个字节或什么都没有。

    也就是说,BLE中几乎没有错误检测,而且您绝对可以丢弃数据包。由你来验证数据是否正确到达。

    如果你能瞄准iOS 11+,请看看L2CAP,它是为串行协议而不是使用GATT设计的。

    如果您不能这样做,我建议您观看WWDC 2013会话703,它详细介绍了这个用例。(不过,我再也找不到它的链接了。)