如何在PeripheralManager中处理长特征值的读取请求和订阅?

时间:2019-03-30 23:48:40

标签: ios swift bluetooth bluetooth-lowenergy core-bluetooth

我已经在我的iOS应用中创建了一个外围设备,该外围设备具有我正在用来发送大约540字节数据的特征。我无法在中央端(非iOS)上接收数据。我应该如何响应订阅事件并从连接的Central读取请求以成功获取数据?

我尝试了以下方法。

1。订阅特征并进行数据分块

当中央服务器订阅(启用通知)特征时,我会呼叫

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个字节。 我不确定这种分块和发送方法是否正确,或者我是否正确地进行了分块。

2。如果有关于该特性的通知,则中心将发出读取请求。

对于这种方法,当从中央到该特征的订阅时,外围设备将呼叫

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,但其中未描述分块的方法。

这些方法正确吗?有没有其他方法可以处理长特征值的读取/订阅?

0 个答案:

没有答案