核心蓝牙外围设备:发现服务未触发



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

由于某些原因,这总是有效,但现在我不知道为什么委托方法 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)
        }
    }
}

}

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

swift 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 中添加"隐私 - 蓝牙外围设备使用说明"消息

请在 Swift 3.0 中查看此代码将为您提供帮助。 https://github.com/JCGuidi/BLE-iOS-Swift-3.0/blob/master/Project/BluetoothLE/ViewController.swift

最新更新