CoreBluetooth 外围设备:didDiscoverServices 未触发

Posted

技术标签:

【中文标题】CoreBluetooth 外围设备:didDiscoverServices 未触发【英文标题】:CoreBluetooth peripheral:didDiscoverServices not firing 【发布时间】:2017-11-08 08:22:34 【问题描述】:

我有一个简单的应用程序,我在其中实现了一个可以连接到外围设备并对其进行读取或写入的 Central。

由于某些原因,这总是有效的,但现在我不知道为什么委托方法 didDiscoverServices 没有触发。我在 didConnect 方法中调用 peripheral.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)
        
    

【问题讨论】:

您是否将您的班级设置为外围设备的代表?我在任何地方都看不到。 是的,我做到了。我现在编辑了 在哪里?我还是看不到peripheral.delegate = selfself.cbPeripheral.delegate = self 天哪,我太笨了。我忘了这样做。谢谢 【参考方案1】:

您必须将您的对象设置为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)!])

【讨论】:

【参考方案2】:

斯威夫特 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!)

【讨论】:

【参考方案3】:

您还需要初始化 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

【讨论】:

以上是关于CoreBluetooth 外围设备:didDiscoverServices 未触发的主要内容,如果未能解决你的问题,请参考以下文章

CoreBluetooth:检索多个断开连接的外围设备的正确方法是啥?

未使用 CoreBluetooth (iPhone 6) 接收外围设备发现回调

如何解决 [CoreBluetooth] 警告:对于具有多个设备连接的外围设备来说,这不是一个有效的特征

而委托为 nil 或未实现外围设备:didDiscoverCharacteristicsForService:error: (Corebluetooth, Swift)

如何在 CoreBluetooth 中测试两个 CBPeripheral 的相等性?

corebluetooth : didDisconnectPeripheral 减少超时