CoreBluetooth:在writeValue()之后未调用didWriteValueFor()

时间:2018-09-03 10:13:23

标签: ios swift core-bluetooth

根据Apple开发人员文档,在调用writeValue()函数之后,将调用didWriteValueFor()函数。 (请参阅https://developer.apple.com/documentation/corebluetooth/cbperipheraldelegate/1518823-peripheral

我有一个可写的特征,我按照https://developer.apple.com/documentation/corebluetooth/cbcharacteristicproperties/1519089-write

的内容查找了该属性

现在,当我调用writeValue()函数时,didWriteValueFor()函数从未被调用,为什么?我认为它的结构类似于readValue()函数,该函数调用didUpdateValueFor()函数,对我来说很好。 这是我的代码:

        func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    for characteristic in service.characteristics!{
        print(characteristic)
        if(characteristic.uuid == TX_CHARACTERISTIC){
            elsa.writeValue(dataWithHexString(hex: VALID_GET_VERSION_REQUEST), for: characteristic, type: CBCharacteristicWriteType.withResponse)//calls didWriteValueFor if Type = withResponse
        }
        if(characteristic.uuid == RX_CHARACTERISTIC){
            elsa.setNotifyValue(true, for: characteristic)//calls didUpdateNotificationStateFor
        }
    }
}

func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
    guard let data = characteristic.value else { return }
    print("\nValue: \(data.toHexEncodedString()) \nwas written to Characteristic:\n\(characteristic)")
    if(error != nil){
        print("\nError while writing on Characteristic:\n\(characteristic). Error Message:")
        print(error as Any)
    }
}

2 个答案:

答案 0 :(得分:0)

正如@ Paulw11所述,仅在显式读取值之后才写入该值。我通过在didWrite()函数中调用readValue()来解决此问题。

答案 1 :(得分:0)

当调用writeValue()时,可以指定是否要从远程设备进行响应。在您的情况下,您指定了CBCharacteristicWriteType.withResponse,它告诉远程设备它需要发送回一个响应,并指示写入是否成功。当远程设备发送响应消息时,这将触发对didWriteValueFor()的调用。如果您的设备未发送响应,则不会调用didWriteValueFor()。您可以在apple documentation here中阅读有关此内容的信息。您可能需要运行蓝牙嗅探器捕获以确认这一点,但是我怀疑您的蓝牙设备无法正确响应writeValue()请求。

请注意,每个BLE特性都有一组属性,这些属性控制该特性的行为方式。其中一些属性包括:后方,写入,无响应写入,通知,通知。检查您正在使用的特性的属性,并确保其支持'write'属性。如果您的特征支持“无响应写入”但不支持“写入”,则您的设备将不会将所需消息发送回您的应用程序,因此将不会调用didWriteValuefor()。通常,您可以在文档中找到此信息,也可以使用蓝牙应用程序(例如“ LightBlue Explorer”)来查看设备的此信息。