Я реализую в своем приложении связь через BLE со спортивным устройством, которое работает следующим образом:
После обнаружения и подключения я могу отправить аналогичное сообщение, чтобы получить полезные данные для моего приложения:
[0x01, 0x00, 0xFF, 0x01, 0x03, 0x00, 0x36, блок, 0xC0]
Где «блок» - это следующий блок, который мне нужен от моего устройства.
В настоящее время я использую следующую функцию для записи:
func outgoingData () {
var block: UInt8 = 0x00
for index in 1...10 {
block = block + 1
let bytes : [UInt8] = [0x01, 0x00, 0xFF, 0x01, 0x03, 0x00, 0x36, block, 0xC0]
writeNewValue(data: bytes)
readNewValue(dataBack : byte)
// dataBack should contain characteristic.value
}
}
// writeNewValue functions
func writeNewValue(data: [UInt8]){
let valueString = NSData(bytes: data, length: data.count)
print (valueString)
if let blePeripheral = blePeripheral{
if let txCharacteristic = txCharacteristic {
blePeripheral.writeValue(valueString as Data, for: txCharacteristic, type: CBCharacteristicWriteType.withoutResponse)
}
}
}
Проблема в том, что после writeValue устройство должно отправлять некоторые данные, но функция readValue возвращает только значение 0x00.
Если я использую делегат didUpdateValue, все работает, но это в асинхронном режиме
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
if characteristic == txCharacteristic {
recived.removeAll()
recived.append(contentsOf: characteristic.value!)
}
}
}
Есть ли решение для создания синхронизированных writeValue и readValue, другими словами, мне нужно извлечь Characteristic.value, используя readValue в том же цикле For.
Заранее спасибо