根据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)
}
}
答案 0 :(得分:0)
正如@ Paulw11所述,仅在显式读取值之后才写入该值。我通过在didWrite()函数中调用readValue()来解决此问题。
答案 1 :(得分:0)
当调用writeValue()时,可以指定是否要从远程设备进行响应。在您的情况下,您指定了CBCharacteristicWriteType.withResponse,它告诉远程设备它需要发送回一个响应,并指示写入是否成功。当远程设备发送响应消息时,这将触发对didWriteValueFor()的调用。如果您的设备未发送响应,则不会调用didWriteValueFor()。您可以在apple documentation here中阅读有关此内容的信息。您可能需要运行蓝牙嗅探器捕获以确认这一点,但是我怀疑您的蓝牙设备无法正确响应writeValue()请求。
请注意,每个BLE特性都有一组属性,这些属性控制该特性的行为方式。其中一些属性包括:后方,写入,无响应写入,通知,通知。检查您正在使用的特性的属性,并确保其支持'write'属性。如果您的特征支持“无响应写入”但不支持“写入”,则您的设备将不会将所需消息发送回您的应用程序,因此将不会调用didWriteValuefor()。通常,您可以在文档中找到此信息,也可以使用蓝牙应用程序(例如“ LightBlue Explorer”)来查看设备的此信息。