Вот одна проблема, с которой я сталкиваюсь при использовании CoreBluetooth
.До сих пор я всегда использовал один сервис и одну характеристику, и все работало нормально.Но здесь я должен использовать две характеристики, и вещи не совсем работают.
Что происходит, так это то, что передается только первая характеристика, а не вторая.
Поскольку в моем случае должна быть ошибкаПрограмма, я стараюсь поставить ниже весь соответствующий код, с некоторыми комментариями.Если кто-то считает, что для решения проблемы необходима другая часть кода, пожалуйста, сообщите мне.
// Declarations relevant to the following code.
var cbPerifMngr:CBPeripheralManager!, mutaSRVC:CBMutableService!,
myCharacOne,myCharacTwo:CBMutableCharacteristic!
...................
// Code to update the CBMutableCharacteristic objects:
let strBuffOne = "abc123_my-information_1"
let strBuffTwo = "GHK678_my-information_2"
if cbPerifMngr.updateValue(Data(strBuffOne.utf8), for: myCharacOne,
onSubscribedCentrals: nil) {
// All is OK.
if cbPerifMngr.updateValue(Data(strBuffTwo.utf8), for: myCharacTwo,
onSubscribedCentrals: nil) {
// All is OK.
} else {
print("1) For some reason, the CBPeripheralManager update was not performed in \(#function).")
}
} else {
print("2) For some reason, the CBPeripheralManager update was not performed in \(#function).")
}
...................
// Code for the CBPeripheralManagerDelegate protocol:
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
print(#function)
if peripheral.state == .poweredOn {
mutaSRVC = CBMutableService(type: serviceDB_UUID, primary: true)
myCharacOne = CBMutableCharacteristic(type: myChrcOne_UUID,
properties: [.read, .notify],
value: nil, permissions: .readable)
myCharacTwo = CBMutableCharacteristic(type: myChrcTwo_UUID,
properties: [.read, .notify],
value: nil, permissions: .readable)
mutaSRVC.characteristics = [myCharacOne,myCharacTwo]
cbPerifMngr?.add(mutaSRVC)
}
}
...................
// Code for the CBPeripheralDelegate protocol:
func peripheral(_ peripheral: CBPeripheral,
didDiscoverCharacteristicsFor service: CBService,
error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
} else {
// Here service.characteristics? contains 2 items.
peripheral.setNotifyValue(true,
for: (service.characteristics?[0])!)
peripheral.setNotifyValue(true,
for: (service.characteristics?[1])!)
}
}
func peripheral(_ peripheral: CBPeripheral,
didUpdateValueFor characteristic: CBCharacteristic,
error: Error?) {
print(#function)
if error != nil {
print("Error in \(#function) :\n\(error!)")
} else {
if let dataStr = String(data: characteristic.value!,
encoding: String.Encoding.utf8) {
print("dataStr:: \(dataStr)")
}
}
}
При запуске кода в консоли отладчика я вижу, что последняя функция ( периферийная:didUpdateValueFor: error ) вызывается для первой характеристики (myCharacOne), но не для второй (myCharacTwo).Это означает, что передается только первая часть информации.
Я надеюсь, что какой-то CoreBluetooth
эксперт сможет увидеть, что не так в моем коде, и дать мне некоторое руководство.