ios - BLE设备随机断开

标签 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)
    }

这将开始读取值

最佳答案

首先,我同意 CodeBender 的观点,即该区域拥有大量设备可能具有挑战性,但有关您的代码的一些事情让我感到怀疑。

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

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

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

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

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

我怀疑您连接的设备比您想象的要多,当您与其中一台设备断开连接时,您会重置管理器并干扰其他设备。可能不是这样,可能是很多事情,但这是您在此处发布的代码中最可疑的部分。

关于ios - BLE设备随机断开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063825/

相关文章:

android - 强制重新启动完整的应用程序以刷新 Cordova 中的包

ios - SpriteKit 正确处理声音

swift - 将 FirebaseData 传递到 tablviewCell 时出现 fatal error : Index out of range,

iOS:拖放交互,无需隐藏键盘

bluetooth - 将 IPOGA 蓝牙游戏 handle 与 Retropie 结合使用

Android - BluetoothAdapter getAddress 在某些手机中返回不匹配的地址

objective-c - ios潜在的泄漏如何解决?

ios - 检查 iOS 模拟器类型和版本

ios - 如何从我的 UI 测试访问我的 swift 类?

ios - 从 ipad 控制 mac