У меня есть спаренное периферийное устройство 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)
и все еще получаю ту же ошибку.