Использование двух характеристик в CoreBluetooth не работает - PullRequest
0 голосов
/ 28 декабря 2018

Вот одна проблема, с которой я сталкиваюсь при использовании 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 эксперт сможет увидеть, что не так в моем коде, и дать мне некоторое руководство.

1 Ответ

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

Базовая очередь передачи Bluetooth ограничена.Если updateValue возвращает false, в очереди передачи недостаточно места для обновления.Ваша программа должна ставить очередные обновления в очередь до тех пор, пока вы не получите вызов метода peripheralManagerIsReady(toUpdateSubscribers) CBPeripheralManagerDelegate.

...