我已经在我的iOS应用中创建了一个外围设备,该外围设备具有我正在用来发送大约540字节数据的特征。我无法在中央端(非iOS)上接收数据。我应该如何响应订阅事件并从连接的Central读取请求以成功获取数据?
我尝试了以下方法。
当中央服务器订阅(启用通知)特征时,我会呼叫
let isSuccessful = peripheralManager.updateValue(data, for: characteristic, onSubscribedCentrals: nil)
数据约为540字节。当我检查返回值时,即使它仅将20个字节传输到订阅的中心,它也会返回true。
如果它返回false(由于某种原因不是),我就是这么做的
if !isSuccessful {
let range = 0 ..< 19
globalDataVariable?.removeSubrange(range)
}
我期望下面的外围设备管理器委托方法被触发,但事实并非如此。
func peripheralManagerIsReady(toUpdateSubscribers peripheral: CBPeripheralManager) {
guard let data = globalDataVariable else { return }
let isSuccessful = peripheral.updateValue(data, for: characteristic, onSubscribedCentrals: nil)
if !isSuccessful {
print("Data still pending..... ")
let range = 0 ..< 19
shareData?.removeSubrange(range)
}
}
对于分块,我将要发送的数据存储在class属性中,然后删除已发送的数据。中心的maximumUpdateValueLength
是20个字节。
我不确定这种分块和发送方法是否正确,或者我是否正确地进行了分块。
对于这种方法,当从中央到该特征的订阅时,外围设备将呼叫
characteristic.value = data // doing this for handling the read request
peripheralManager.updateValue(data, for: characteristic, onSubscribedCentrals: nil)
当中心收到部分数据的通知时,它将向外围设备发出读取请求。
在外围设备上,我正在这样处理。
func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
switch(request.characteristic.uuid) {
case characteristicUUID:
print(request.offset)
guard let data = characteristic.value else { return }
guard request.offset < data.count else {
print("Invalid Offset")
peripheralManager.respond(to: request, withResult: .invalidOffset)
return
}
request.value = data.subdata(in: request.offset ..< data.count)
peripheralManager.respond(to: request, withResult: .success)
default:
print("Unknown Characteristic")
}
}
这种方法适用于我具有的另一种特性,但是该特性用于发送相对少量的数据(少于500个字节),但是对于超过512个字节的数据则失败。
我也关注了这个话题 Reading long characteristic values using CoreBluetooth,但其中未描述分块的方法。
这些方法正确吗?有没有其他方法可以处理长特征值的读取/订阅?