2016-06-23 205 views
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) 

} 


} 
+0

奇怪的是,這個代碼工作和接收的連接,因爲你需要等待,直到你'peripheralManagerDidUpdateState'得到通電狀態然後才能宣傳任何服務。 – Paulw11

+0

另外,您的接收代碼看起來不正確;您不應該將接收到的數據存儲到'rx'特性中。相反,您應該將其添加到應用程序要讀取的某個緩衝區(並且最好發佈通知或調用回調以通知您的代碼數據可用) – Paulw11

+0

我打算將rx用作所描述的緩衝區,那不行嗎?此外,peripheralManagerDidUpdateState方法也不會被調用,我在那裏有一個開關箱,只在通電時纔開始廣告,但它從未被調用過:P –

回答

0

我有一個類似的問題,讓我難倒了好幾個小時。 我的問題是屬性。當我加入.read特性,didReceiveRead回調被稱爲:

myCharacteristic = CBMutableCharacteristic(
    type: myUUID, 
    properties: [CBCharacteristicProperties.notify, CBCharacteristicProperties.read], //*** Need Read Permission to READ!! 
    value: nil, 
    permissions: CBAttributePermissions.readEncryptionRequired 
) 
相關問題