在CoreBluetooth中使用两个特征不起作用

时间:2018-12-28 16:38:32

标签: ios swift core-bluetooth

这是我在使用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)")
        }
    }
}

运行代码时,我可以在调试器控制台中看到,第一个特征(myCharacOne)调用了最后一个函数( peripheral:didUpdateValueFor:error ),但第二个特征(myCharacTwo)没有调用)。这意味着只传输信息的第一部分。

我希望一些CoreBluetooth专家可以看到我的代码中有什么问题并提供一些指导。

1 个答案:

答案 0 :(得分:1)

Core Bluetooth发送队列的空间有限。如果updateValue返回false,则传输队列中没有足够的空间用于更新。您的程序必须对进一步的更新排队,直到您调用peripheralManagerIsReady(toUpdateSubscribers) CBPeripheralManagerDelegate方法为止。