Не могу записать JSON на периферийное устройство с CoreBluetooth - PullRequest
0 голосов
/ 24 марта 2020

У меня есть спаренное периферийное устройство Bluetooth, которое я должен отправить некоторые учетные данные в JSON, как показано ниже

{"SSID":"WIFI_SSID", "Password": "WIFI_PASSWORD"}

И после отправки информации периферийное устройство должно подключиться к предоставленным учетным данным WiFi, но Я не совсем уверен, что процесс выполняется правильно.

Как только периферийное устройство Bluetooth подключится, я запускаю процесс,

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {

    // As soon as the device has connected 
    peripheral.delegate = self
    // Only discover the service I know it's for writing
    peripheral.discoverServices([SERVICE_UUID])
}

discoverServices вызовет peripheral(:didDiscoverServices error)

func peripheral( _ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    for service in peripheral.services! {
        peripheral.discoverCharacteristics(nil, for: service)
    }
}

Вызов следующего метода, в котором я делаю все логи c

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {

    for characteristic in service.characteristics! {
        let characteristic = characteristic as CBCharacteristic

        debugPrint(characteristic.properties)
        // This prints the following properties, reading + writing
        // __C.CBCharacteristicProperties(rawValue: 10)

        if characteristic.uuid.isEqual(RX_UUID) {
            do {
                let msgDictionary = ["SSID": wiFiCredentials.SSID, "Password": wiFiCredentials.Password]
                let jsonData = try JSONSerialization.data(withJSONObject: msgDictionary,options:[])

                peripheral.writeValue(jsonData, for: characteristic, type: CBCharacteristicWriteType.withResponse)

            } catch let error as NSError {
                debugPrint("Error in auth message JSON: \(error.description)")
            }
        }
    }
}

До этого момента я думал, что все правильно. После вызова writeValue и установки type на CBCharacteristicWriteType.withResponse я должен ожидать что-то в методе peripheral(:didWriteValueFor characteristic: error). В этом методе я получаю следующую ошибку

Error Domain=CBATTErrorDomain Code=3 \"Writing is not permitted.\" UserInfo={NSLocalizedDescription=Writing is not permitted.}"

Я предполагаю, что когда я пишу значение JSON, я не должен использовать флаг .withResponse и использовать .withoutResponse. Если я это сделаю, я получу следующий журнал в консоли.

[CoreBluetooth] WARNING: Characteristic <CBCharacteristic: 0x28388a040, UUID = 3E9D2532-2F00-11E9-9602-A44CC81C989A, properties = 0xA, value = (null), notifying = NO> does not specify the "Write Without Response" property - ignoring response-less write

, который подтверждает мне, что я должен использовать .writeWithResponse.

Есть ли что-то, чего мне не хватает в обработать? JSON должен быть отправлен с использованием GATT и AFAIK, это правильный подход для этого. Правильно ли напечатаны CBCharacteristicProperties?

То, что я сделал:

  • JSON не проблема. Я попытался написать случайную переменную "1".data(using: .ascii) и все еще получаю ту же ошибку.
...