CoreBluetooth: didWriteValueFor () не вызывается после writeValue () - PullRequest
0 голосов
/ 03 сентября 2018

Согласно документации разработчика Apple, функция didWriteValueFor () вызывается после вызова функции writeValue (). (см. 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 голосов
/ 11 сентября 2018

Когда вы вызываете writeValue (), вы можете указать, хотите ли вы получить ответ от удаленного устройства или нет. В вашем случае вы указали CBCharacteristicWriteType.withResponse, который сообщает удаленному устройству, что ему необходимо отправить ответ, и указывает, была ли запись успешной или нет. Когда удаленное устройство отправляет ответное сообщение, это вызовет функцию didWriteValueFor (). Если ваше устройство НЕ отправляет ответ, то didWriteValueFor () не вызывается. Вы можете прочитать об этом в документации Apple здесь . Вам потребуется запустить захват сниффера Bluetooth, чтобы подтвердить это, но я подозреваю, что ваше устройство Bluetooth не отвечает должным образом на запрос writeValue ().

Обратите внимание, что каждая характеристика BLE имеет набор свойств, которые определяют ее поведение. Некоторые из этих свойств включают в себя: назад, написать, написать без ответа, уведомить, сообщить. Проверьте свойства используемого вами признака и убедитесь, что он поддерживает свойство write. Если ваш признак поддерживает «запись без ответа», но не поддерживает «запись», то ваше устройство не будет отправлять необходимое сообщение обратно в ваше приложение, и поэтому didWriteValuefor () не будет вызываться. Обычно вы можете найти это в документации или использовать приложение Bluetooth, такое как «LightBlue Explorer», чтобы просмотреть эту информацию для вашего устройства.

0 голосов
/ 03 сентября 2018

Как уже упоминалось @ Paulw11, значение записывается только после явного чтения. Я исправил это, вызвав readValue () внутри функции didWrite ().

...