我正在为蓝牙手表开发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个特性,一个用于读取,一个用来写入。
根据我的工作流程使用写特性:
- 使用WRITECHARACTERSTIC,我以块的形式发送固件代码的数据
[MYDEVICEINSTANCE写入值:NSDATACHUNK特点:书面风格type:CCBCharacteristicWriteWithResponse];
- 在委托方法"didWriteValueForCharacteristic"方法中,我通知读取特性如下
[MYDEVICEINSTANCE setNotifyValue:TRUEforCharacteristic:READCHARACTERISTIC];
- 它调用"didUpdateNotificationStateForCharacteristic"委托方法,在该方法中我正在检查READCHARACTERISTIC是否正在通知,然后我调用
[MYDEVICEINSTANCE readValueForCharacteristic:READCHARACTERISTIC];
- 它调用委托方法"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
通过CBPeripheral
的maximumWriteValueLength(for: …)
使该值可用。
也就是说,除非你确切地知道你的BLE外围设备的行为,否则恐怕你不能依赖这个值。有一些设备声称支持具有QUEUED WRITES的BLE 5.0规范,这将导致相当高的MTU,例如512。但是他们没有实现它,因此大于其原生MTU的包将被静默截断,并且从iOS 14开始,iOS将不会检测到这一点!