簡體   English   中英

CoreBluetooth外圍設備:didDiscoverServices不觸發

[英]CoreBluetooth peripheral:didDiscoverServices not firing

我有一個簡單的應用程序,在其中實現了可連接到外圍設備並對其進行讀寫操作的Central。

由於某些原因,這總是可行的 ,但是現在我不知道為什么委托方法didDiscoverServices沒有觸發。 我在didConnect方法中調用了pheral.discoverServices () 當調用discoverServices方法時,我不斷收到委托方法未實現或為nil的錯誤 但是該方法已實現,我正在尋找存在的服務。

這是我的代碼

class SearchForPeripheralsTableViewController: UITableViewController, CBCentralManagerDelegate, CBPeripheralDelegate {

var centralManager: CBCentralManager?
var cbPeripheral: CBPeripheral!
var peripherals: [DiscoveryPeripherals] = []

 var listOfServices: [ServiceIdentifier] = []


 fileprivate func fillServices(){
        listOfServices.append(ServiceIdentifier(CBUUID(string: "FFF0")))
    }

 override func viewWillAppear(_ animated: Bool) {
    tableViewSearchPeripherals.dataSource = self
    tableViewSearchPeripherals.delegate = self

    initCentralManager()
}

override func viewDidAppear(_ animated: Bool) {
    tableViewSearchPeripherals.reloadData()
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("Peripheral connected")
    let service = listOfServices.first(where: { $0.uuid == CBUUID(string:"FFF0")})
     peripheral.discoverServices([(service?.uuid)!])
}

override func viewDidLoad() {
    super.viewDidLoad()
    fillServices()
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    if error != nil {
        print("Error discovering services: \(String(describing: error?.localizedDescription))")
        return
    }

    if let services = peripheral.services {
        for service in services {
            let characteristics = listOfCharacteristics.map({ (element) -> CBUUID in return element.uuid})
           //   let characteristic = GetCharacteristicByCBUUID(uuid: CBUUID(string: "FFF1"))
            peripheral.discoverCharacteristics(characteristics, for: service)
        }
    }
}

}

您必須將對象設置為CBPeripheral的委托,才能調用CBPeripheralDelegate函數:

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("Peripheral connected")
    peripheral.delegate = self
    let service = listOfServices.first(where: { $0.uuid == CBUUID(string:"FFF0")})
     peripheral.discoverServices([(service?.uuid)!])
}

迅捷3

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {

    peripheral.delegate = self

    self.selectPeripheral.discoverServices(nil)
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {

    if let errorService = error{

        print(errorService)

        return
    }   
    else if let services = peripheral.services as [CBService]!{

        for service in services{

            peripheral.discoverCharacteristics(nil, for: service)
        }
    }
    print("==>",peripheral.services!)
}

您還需要初始化CBCentralManagera並在info.plist中添加“ Privacy-Bluetooth Peripheral Usage Description”消息。

請在Swift 3.0中檢查此代碼將為您提供幫助。 https://github.com/JCGuidi/BLE-iOS-Swift-3.0/blob/master/Project/BluetoothLE/ViewController.swift

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM