BLE设备随机断开

时间:2019-07-16 18:58:43

标签: ios swift bluetooth bluetooth-lowenergy

我正在使用BLE设备,并使用swift将其连接到通孔。当我打开它时,它将连接,断开连接,然后重新连接。我不知道为什么它会首先断开连接,电池电量为100%,而且我什么也不会触发断开连接,任何人都知道会发生什么情况吗?这是我的一些功能供参考

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        kestrelPeripheral = peripheral
        kestrelPeripheral.delegate = self
        manager.connect(kestrelPeripheral)
        manager.stopScan()
        self.kestrelIsConnected = true

    }
    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {

        delegate?.didDisconnect()
        cancelReading()
        self.kestrelIsConnected = false
        self.manager = CBCentralManager(delegate: self, queue: nil)
    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        self.isInitialReading = false
        kestrelPeripheral.discoverServices(nil)
        delegate?.didConnect()
    }

更多内容:

func startReading() {
        self.manager = CBCentralManager(delegate: self, queue: nil)
        self.takeReading = true
        progressHUD = ReadingProgressHUD(text: "Taking Reading")
        self.vc!.view.addSubview(self.progressHUD)
    }

这将开始读取值

1 个答案:

答案 0 :(得分:0)

首先,我同意CodeBender的观点,即在该区域拥有很多设备可能具有挑战性,但是关于您的代码的几件事使我感到怀疑。

首先,您没有记录任何内容,因此很难确切知道发生了什么。您肯定要记录每个步骤。

确保要扫描的正是您想要的服务;不要通过nil中的scanForPeripherals。同样,请勿将nil传递给discoverServices

但是最可疑的部分在这里,我怀疑这可能是原因:

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    ...
    self.manager = CBCentralManager(delegate: self, queue: nil)
    ...
}

您不应该在每次外围设备断开连接时都创建新的管理器。中央管理人员处理所有外围设备;不只是一种联系。您应该为程序的整个运行设置一次manager,并且通常应该避免在系统中有多个CBCentralManager对象。让多个经理一起工作不是没有可能,但是我发现他们经常会互相干扰。

我怀疑您连接到的设备数量超出了您的想象,并且当您断开其中一台设备的连接时,您会重置管理器并破坏其他设备。可能并非如此,可能有很多事情,但这是您在此处发布的代码中最可疑的部分。