iOS-用于在iOS设备和外部附件(蓝牙手表)之间传输BLE数据的MTU大小



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

我想知道我们如何使用核心蓝牙框架在iOS设备和外部设备之间进行数据传输。

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

我搜索了一个苹果示例代码:BTLE_传输:https://developer.apple.com/Library/ios/samplecode/BTLE_Transfer/Introduction/Intro.html

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

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

更新:

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

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

  1. 使用WRITECHARACTERSTIC,我以块的形式发送固件代码的数据

[MYDEVICEINSTANCE写入值:NSDATACHUNK特点:书面风格type:CCBCharacteristicWriteWithResponse];

  1. 在委托方法"didWriteValueForCharacteristic"方法中,我通知读取特性如下

[MYDEVICEINSTANCE setNotifyValue:TRUEforCharacteristic:READCHARACTERISTIC];

  1. 它调用"didUpdateNotificationStateForCharacteristic"委托方法,在该方法中我正在检查READCHARACTERISTIC是否正在通知,然后我调用
[MYDEVICEINSTANCE readValueForCharacteristic:READCHARACTERISTIC];
  1. 它调用委托方法"didUpdateValueForCharacteristic",我正在使用READCHARACTERISTIC.value读取响应

我的查询:

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

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

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

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

或者有人可以说苹果对MTU的最大限制是多少

感谢您的每一个建议,

提前感谢

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

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

例如,如果他们想使用等于50的MTU,那么如果你的MTU低于50,就会使用这个;否则,您选择的高于50的值都没有意义,因为50会被选中。

在将设备连接到应用程序后,您应该使用以下内容编写"特征":

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

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

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

在iOS设备上,可用的mtu为20。这意味着,当您将其设置为BLE外围设备时,每次可以发送20字节的数据。如果你想通信超过20个字节,你必须自己处理,参考APPLE中央外设样本代码

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

参与设备之间在低级别上协商最大MTU。CoreBluetooth通过CBPeripheralmaximumWriteValueLength(for: …)使该值可用。

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

最新更新