BLE 设备随机断开连接
BLE device randomly disconnecting
我正在使用 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
对象。让多个经理一起工作并非不可能,但我发现他们经常互相妨碍。
我怀疑您连接的设备比您想象的要多,当您断开与其中一个设备的连接时,您会重置您的管理器并扰乱其他设备。可能不是那个,可能有很多东西,但这是您在此处发布的代码中最可疑的部分。
我正在使用 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
对象。让多个经理一起工作并非不可能,但我发现他们经常互相妨碍。
我怀疑您连接的设备比您想象的要多,当您断开与其中一个设备的连接时,您会重置您的管理器并扰乱其他设备。可能不是那个,可能有很多东西,但这是您在此处发布的代码中最可疑的部分。