这是我在使用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
专家可以看到我的代码中有什么问题并提供一些指导。
答案 0 :(得分:1)
Core Bluetooth发送队列的空间有限。如果updateValue
返回false
,则传输队列中没有足够的空间用于更新。您的程序必须对进一步的更新排队,直到您调用peripheralManagerIsReady(toUpdateSubscribers)
CBPeripheralManagerDelegate
方法为止。