使用存储的服务扫描特定的ble设备

时间:2018-06-15 05:15:07

标签: swift bluetooth-lowenergy pairing

我有一个提供配对按钮的应用程序。单击该按钮后,应用程序将扫描具有特定名称的某些设备并将其显示在tableview中。以下是scan函数:

func scan() {
    let bonding = userDefaults.bool(forKey: UserDefaultsKey.BONDING)
    if bonding {
        let serviceCount = userDefaults.integer(forKey: UserDefaultsKey.SERVICE_COUNT)
        var cbuuids = [CBUUID]()
        for i in 0..<serviceCount {
            if let serviceString = userDefaults.string(forKey: "SERVICE\(i)") {
                print("[BLEManager] SERVICE\(i): \(serviceString)")
                cbuuids.append(CBUUID(string: serviceString))
            }
        }
        centralManager.scanForPeripherals(withServices: temp, options: nil)
    } else {
        centralManager.scanForPeripherals(withServices: nil, options: nil)
    }
}

当选择了ble设备时,应用程序将连接到它并使用UserDefaults保存其服务:

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    guard error == nil else{
        print("ERROR: \(#file, #function)")
        return
    }
    var index = 0
    for service in peripheral.services!{
        connectPeripheral.discoverCharacteristics(nil, for: service)
        userDefaults.set(service.uuid.uuidString, forKey: "SERVICE\(index)")
        index = index + 1
    }
    userDefaults.set(index, forKey: UserDefaultsKey.SERVICE_COUNT)
    userDefaults.set(true, forKey: UserDefaultsKey.BONDING)
}    

当所有UserDeaults事物尚未存在时,所有东西都是第一次完美运行。但是在我断开并重新启动我的应用程序并再次按下相同的配对按钮后,这使得我的中央管理器使用以前存储的服务扫描外围设备,没有任何反应。我预计之前连接的ble设备应该显示在tableview上。这是否意味着我无法使用这种方式与特定设备配对?

1 个答案:

答案 0 :(得分:1)

我认为您想将“ var cbuuids”(您先前扫描的UUID)传递给scanForPeripherals。

centralManager.scanForPeripherals(withServices: cbuuids, options: nil)

您当前正在传递“ temp”。我的猜测是它不是正确的UUID。