【问题标题】:Bluetooth Low Energy data transmission on iOSiOS 上的低功耗蓝牙数据传输
【发布时间】:2019-01-11 19:08:28
【问题描述】:

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

所以我主要关心的是当我收到来自peripheral(_:didUpdateValueFor:error:) 的通知时会收到什么数据块?它是否仅与协商的 MTU 大小一样大?或者,iOS 可能会收到有关块大小的信息,并在触发peripheral(_:didUpdateValueFor:error:) 之前等待全部接收?

当外围设备发送块时,假设每个块 100 字节,我可以假设我将始终在单个通知中获得 100 字节吗?或者它可能是前一个块的最后 50 个字节和下一个块的前 50 个字节?这将非常棘手并且难以检测到我的框架的开始位置。

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

我的猜测是我总是收到一个单一的特征状态。因此,这意味着块取决于外围端的实现。但是如果特征大于 MTU 大小怎么办?

【问题讨论】:

    标签: ios bluetooth bluetooth-lowenergy core-bluetooth


    【解决方案1】:

    首先,请记住,通过特性发送流数据并不是特性的设计目的。特征点是表示一些小的(约 20 字节)信息,如当前电池电量、设备名称或当前心跳。这个想法是,只有当基础值发生变化时,特性才会发生变化。它从未被设计为串行协议。所以你的默认假设应该是由你来管理这一切。

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

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

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

    如果您能够以 iOS 11+ 为目标,请查看 L2CAP,它是为串行协议设计的,而不是使用 GATT。

    如果您做不到,我建议您观看 WWDC 2013 Session 703,其中详细介绍了此用例。 (但是,我再也找不到指向它的链接了。)

    【讨论】:

    • 感谢您的宝贵回答。这就是我认为特性不是为流式传输数据而设计的。但是,也有一些制造商提供 BLE 串行端口服务,例如:u-blox.com/sites/default/files/…
    • 我相信 L2CAP 在 ios11+ 中可用
    • 感谢保罗;你是对的。我忘了我是因为 iOS10 才推迟的。
    • @WojciechKulik 很多人使用 GATT 来传输数据。我以这种方式流式传输大文件,并通过 GATT 运行双向串行协议。 Apple 甚至曾经有示例代码来引导您完成它(如果您能找到我上面列出的会话)。它只是设计 用于此目的:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多