iOS BLE периферийное writeValue не работает, если я читаю Value - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть периферийное устройство в приложении MacOS и центральное на iOS.Центральный имеет следующий код:

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    for characteristic in service.characteristics! {
        print(characteristic.uuid)
        switch characteristic.uuid {
        case bleCharacteristics().read:
            print("Read it!")
            peripheral.setNotifyValue(true, for: characteristic)
            peripheral.readValue(for: characteristic)
            break
        case bleCharacteristics().write:
            print("Write to it!")
            peripheral.writeValue("Heyooo".data(using: .utf8)!, for: characteristic, type: .withResponse)
            break
        case bleCharacteristics().notify:
            print("Subscribe to it!")
            peripheral.setNotifyValue(true, for: characteristic)
            break
        default:
            print("Got to the characteristics default somehow")
        }
    }
}

readValue работает нормально, но writeValue не работает вообще (так как в didReceiveWriteRequests для периферийного менеджера никогда не вызывается).Если я закомментирую readValue, тогда writeValue работает просто отлично.В документах нигде не говорится, что readValue - это блокирующая асинхронная операция или что-то подобное, поэтому я понятия не имею, что происходит.

Если у кого-то есть идеи, что я делаю неправильно, я буду очень признателен.

1 Ответ

0 голосов
/ 14 декабря 2018

Ну, иногда вам нужно опубликовать вопрос, чтобы выяснить ответ.В моем периферийном коде у меня было:

func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
    let response = "Hey there".data(using: .utf8)
    request.value = response
    peripheral.updateValue(response!, for: characteristics![0] as! CBMutableCharacteristic, onSubscribedCentrals: [request.central])
}

, которое "считывало" значение из-за метода updateValue, но не закрывало запрос на чтение.Добавление строки:

peripheral.respond(to: request, withResult: .success)

- это правильный способ ответить на запрос чтения и сделать так, чтобы writeValue работал как положено.Правильный периферийный код:

func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
    let response = "Hey there".data(using: .utf8)
    request.value = response
    peripheral.respond(to: request, withResult: .success)
}
...