我正在使用我需要验证的BLE设备。我正在使用的BLE代码位于
之下//Pragma Bluetooth Methods
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(withServices: nil, options: nil)
} else {
print("Bluetooth not available.")
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){
if let peripheralName = advertisementData[CBAdvertisementDataLocalNameKey] as? String {
if peripheralName == "test-device1" {
self.manager.stopScan()
self.peripheral = peripheral
self.peripheral.delegate = self
self.manager.connect(peripheral, options: nil)
}
}
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.discoverServices(nil)
}
private func peripheral(peripheral: CBPeripheral, didDiscoverServices error: Error?) {
for service in peripheral.services! {
let thisService = service as CBService
if service.uuid == SERVICE_UUID {
peripheral.discoverCharacteristics(
nil,
for: thisService
)
}
}
}
该过程遵循预期路线,通过didDiscover并将名称验证为“test-device1”。但是,虽然它通过didConnect方法并运行peripheral.discoverServices(nil),但它永远不会到达didDiscoverServices方法。我已经多次介入它,它总是停在didConnect()。
我错过了什么?
答案 0 :(得分:1)
来自doc的方法:
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)
此致:
func peripheral(peripheral: CBPeripheral, didDiscoverServices error: Error?)
删除它并重写它,让XCode自动完成功能可以帮助您,从文档中复制/粘贴它,或者只添加一个缺少的_
。
该方法是可选的,内部CoreBluetooth框架检查委托是否响应选择器(respondsToSelector()
)并且选择器包括" _"你没有的。所以它不会匹配,因为它不一样,所以不会打电话给它。
答案 1 :(得分:0)
如果这不起作用
func peripheral(_ peripheral:CBPeripheral,didDiscoverServices错误:错误?)
然后首先尝试使用BLE扫描仪iOS扫描BLE设备,如果在该应用程序中它显示服务然后在您的代码中出现问题,否则如果BLE扫描仪显示0服务然后问题在外围设备内, 或者您可以在连接到外围设备后使用print(peripheral.services)检查服务,如果它打印为nil,则发现未调用的服务,否则调用它。
或者您可以在存储到缓存中的数据中重启iPhone。