【问题标题】:iOS - MTU Size for BLE data transfer between iOS device and External Accessory(BluetoothWatch)iOS - iOS 设备和外部附件(蓝牙手表)之间 BLE 数据传输的 MTU 大小
【发布时间】:2014-12-30 00:25:47
【问题描述】:

我正在为使用 BLE(CoreBluetooth)的蓝牙手表开发 iOS 应用程序(Objective-C),并且我的手表具有 GATT 蓝牙配置文件,iOS 应用程序最低支持来自 iOS7。

我想知道如何使用 Core Bluetooth 框架在 iOS 设备和外部设备之间进行数据传输。

实际上,我正在开发蓝牙手表的固件升级部分, 每当收到任何更新时,我的 iOS 应用程序都会从​​ Web 服务获取固件代码(二进制数据),然后它将数据发送到蓝牙手表。

我已经搜索并获得了一个 Apple 示例代码: BTLE_Transfer:https://developer.apple.com/Library/ios/samplecode/BTLE_Transfer/Introduction/Intro.html

我猜示例代码在我的情况下没有用,因为它同时具有 Central 和 Peripheral 代码并在两个 iOS 设备之间传输数据。

除了这个 BLE 数据传输示例代码之外,还有其他方法吗?或者仅使用此示例代码有可能?(如果是的话如何?)

更新:

我的设备有 1 个服务,其中有 2 个特性,一个用于读取,一个用于写入。

根据我使用写特性的工作流程:

  1. 使用 WRITECHARACTERISTIC 我正在分块发送固件代码数据

[MYDEVICEINSTANCE 写入值:NSDATACHUNK forCharacteristic:WRITECHARACTERISTIC 类型:CBCharacteristicWriteWithResponse];

  1. 在委托方法“didWriteValueForCharacteristic”方法中,我通知读取特征如下

[MYDEVICEINSTANCE setNotifyValue:TRUE forCharacteristic:READCHARACTERISTIC];

  1. 在里面调用“didUpdateNotificationStateForCharacteristic”委托方法,我正在检查是否 READCHARACTERISTIC isNotifying 然后我调用
[MYDEVICEINSTANCE readValueForCharacteristic:READCHARACTERISTIC];
  1. 调用委托方法“didUpdateValueForCharacteristic”,我正在使用 READCHARACTERISTIC.value 读取响应

我的查询:

我想确认 Apple 允许的 MTU 最大限制,用于从 iOS 应用程序进行外部设备通信,我从第 1 步开始,将 NSDATACHUNK 发送到 BLE Watch从 iOS 应用使用 writeValue

我已经测试过我可以发送 MTU=255 大小的 NSDATACHUNK 并且 BLE 手表可以成功接收。

我在“Apple Sample code: BTLE_Transfer”中发现他们正在使用 MTU=20 但是,我猜该示例代码是用于 iOS 设备到 iOS 设备的通信(如果我错了,请纠正我)

那么,如果我在 iOS 应用程序中使用 MTU=250 进行 BLE 通信,苹果是否有可能拒绝我的应用程序?

或者有没有人可以说Apple 允许的 MTU 最大限制是多少?

感谢您的每一个建议,

提前致谢

【问题讨论】:

  • 如何在 iOS 中设置 MTU 大小?

标签: ios bluetooth bluetooth-lowenergy core-bluetooth data-transfer


【解决方案1】:

最大 MTU 是在低级别的参与设备之间协商的。 CoreBluetooth 通过CBPeripheralmaximumWriteValueLength(for: …) 提供此值。

也就是说,除非您确切知道您的 BLE 外围设备的行为,否则恐怕您不能依赖此值。有些设备声称支持带有 QUEUED WRITES 的 BLE 5.0 规范——这将导致相当高的 MTU,例如 512。但他们没有实现它,因此大于其原生 MTU 的包将被静默截断 从 iOS 14 开始,iOS 将不会检测到这一点!

【讨论】:

    【解决方案2】:

    在 iOS 设备上,可用 mtu 为 20。这意味着当您将其设置为 BLE 外设时,您每次可以发送 20 个字节的数据。如果要通信超过 20 个字节,则必须自己处理,参考 APPLE Central Peripheral sample code

    在您的情况下,问题不是 iOS 设备的 mtu,而是您的外部 BLE 设备,因为您的 BLE 设备是外围设备。由于您的 BLE 设备能够传输大量数据 - 255 字节,因此拥有该 mtu 就可以了。

    【讨论】:

    • 这在技术上是不正确的。 BLE 有 3 个字节的开销,所以如果 BLE MTU 为 20,那么一次可以发送的数据是 MTU-3 或 17 个字节。默认的 BLE MTU 为 23,因此一个数据包中的默认数据量为 20 字节,我相信这就是您所指的。
    【解决方案3】:

    您可以使用任何您想要的 MTU 大小(最大为 512)。

    连接将使用的值始终是您和他们之间的最小值。

    因此,例如,如果他们想使用等于 50 的 MTU,那么如果您的 MTU 低于 50,则将使用该 MTU;否则,您在 50 以上选择的任何一个值都是没有意义的,因为 50 会被选中。

    【讨论】:

    • 有什么方法可以从 BLE 读取字节,因为我的应用程序只读取 20 个字节,怎么能超过这个?什么配置?? ,我为此检查了 ios 示例
    • 嗨,我们可以更改 MTU 大小并给出具体的 MTU = 244,我在我的 iOS 应用程序中从一个 BLE 设备获取数据,它向我发送 244 字节,但我只收到 182 字节。请建议。谢谢
    • @Niks 即使你使用的是MTU=244,如果对方只支持182,那么会使用182。然而,即使对于更长的特征(例如 400 字节),操作系统也应该支持使用后续请求读取整个数据。如果没有,那么您应该向他们的 SW 解决方案提交票证。
    • 我面临同样的问题,在我的 iOS 应用程序中接收 182 字节而不是 234 字节的数据。您有什么解决方案可以获取全长数据吗?
    【解决方案4】:

    连接你的设备和你的应用后,你应该写一个“特征”:

     [YOURDEVICEINSTANCE writeValue:NSDATAVALUE forCharacteristic:YOURCHARACTESITIC type:CBCharacteristicWriteWithResponse];
    

    我们花了很多时间使用我的自定义 BLE 设备,我的结论是:

    • 连接不对称。 (您将花费 5 毫秒从您的 BLE 设备传输到您的应用,从您的应用到您的 BLE 设备需要 20 毫秒)

    【讨论】:

    • 嗨,David,感谢您的回复,您能否查看我更新的问题,让我知道您在 iOS 应用程序中使用的 MTU 大小是多少?
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多