0
我在Swift 3中使用CoreBluetooth來模擬BTLE的串行端口。該服務對中央設備可見,並且任何更新外設(快速)端都更新中央端而沒有問題。委託方法未被調用? (CoreBluetooth)
當我從中央側發送讀取或寫入請求時,其中一個peripheralManager()委託方法應該處理該事件;然而,不管發生什麼事情都不會調用委託方法,並且中央設備最終會失去它的連接(由於超時,我相信)。
class BTConnectionHandler: NSObject, CBPeripheralManagerDelegate {
var cbManager: CBPeripheralManager!
var serialService: CBMutableService!
var tx: CBMutableCharacteristic!
var rx: CBMutableCharacteristic!
override init() {
super.init()
cbManager = CBPeripheralManager(delegate: self, queue: nil)
cbManager.startAdvertising(ADVERTISEMENT_DATA)
serialService = CBMutableService(type: SERIAL_UUID, primary: true)
tx = CBMutableCharacteristic(type: TX_UUID, properties: TX_PROPERTIES, value: nil, permissions: TX_PERMISSIONS)
rx = CBMutableCharacteristic(type: RX_UUID, properties: RX_PROPERTIES, value: nil, permissions: RX_PERMISSIONS)
serialService.characteristics = [tx,rx]
cbManager.add(serialService)
}
// PERIPHERAL (this) Write to TX
internal func write(string: String) -> Bool {
let data = string.data(using: String.Encoding.utf8)!
tx.value = data
return cbManager.updateValue(data,for: tx,onSubscribedCentrals: nil)
}
// PERIPHERAL (this) Read from RX
internal func read() -> String? {
if let outString = String(data: rx.value!, encoding: String.Encoding.utf8) {
return outString
} else {
print("RX buffer is empty")
return nil
}
}
// CENTRAL read from TX
func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
print("Read request received from central device")
request.value = tx.value
cbManager.respond(to: request, withResult: .success)
}
// CENTRAL write to RX
func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {
print("Write request(s) received from central device")
for request in requests {
rx.value = request.value
cbManager.respond(to: request, withResult: .success)
}
}
// Print state of peripheral manager as it changes
func peripheralManagerDidUpdateState(_ peripheral:CBPeripheralManager) {
print(peripheral.state)
}
}
奇怪的是,這個代碼工作和接收的連接,因爲你需要等待,直到你'peripheralManagerDidUpdateState'得到通電狀態然後才能宣傳任何服務。 – Paulw11
另外,您的接收代碼看起來不正確;您不應該將接收到的數據存儲到'rx'特性中。相反,您應該將其添加到應用程序要讀取的某個緩衝區(並且最好發佈通知或調用回調以通知您的代碼數據可用) – Paulw11
我打算將rx用作所描述的緩衝區,那不行嗎?此外,peripheralManagerDidUpdateState方法也不會被調用,我在那裏有一個開關箱,只在通電時纔開始廣告,但它從未被調用過:P –