Ionic BLE iOS -无法加密连接,连接意外超时

2jcobegt  于 2023-01-28  发布在  Ionic
关注(0)|答案(2)|浏览(221)

我正在使用@capacitor-community/bluetooth-le将我的Ionic 6应用程序连接到特定BLE设备。在Android中,一切正常。在iOS中,第一次连接到BLE成功,但下次(配对后)尝试连接时出现以下错误:加密连接失败,连接意外超时。
我已经尝试了很多不同的方法:扫描后连接。扫描时连接。但没有任何工作。奇怪的是在第一次一切正常(配对后)。
有人帮忙吗?

7kqas0il

7kqas0il1#

不幸的是,这是iOS中的一个已知问题。我认为正在发生的是,由于您已经在操作系统级别与设备配对/绑定,因此当远程BLE设备可被发现时,连接将在操作系统级别重新建立。当您尝试从应用重新连接到远程设备时,已在操作系统级别建立连接,这是在应用程序级别失败的原因。或者,可能是绑定过程中存储的密钥导致重新绑定/配对过程发生冲突。您可以通过执行以下操作确认此问题:-
1.进入iOS设置,蓝牙,然后取消配对设备(如果存在)。
1.尝试从iOS应用程序重新连接到设备。
1.断开设备与iOS应用的连接(这次不要取消与蓝牙设置的配对)。
1.尝试从您的Android应用(或您可以在iOS设备之外使用的任何其他设备)连接到远程设备。如果连接不成功,则意味着iOS设备仍连接到远程设备。
1.如果从Android设备连接成功,请尝试断开连接,然后从iOS设备重新连接,如果连接成功,您将知道问题是与OS级别的连接,如果连接不成功,您将知道问题是与存储的绑定/配对密钥冲突。
至于解决方案,我不认为有一个简单和直接的不幸。下面是一个建议的解决方案,我发现在过去有用(您可能需要修改您的离子应用程序):-
在某些情况下,如HID设备,绑定外设后,iOS会在看到外设广告时自动连接到该外设。此行为独立于任何应用发生,外设可以连接到iOS设备,但不能连接到最初建立绑定的应用。如果绑定的外设与iOS设备断开连接,然后在iOS级别重新连接,应用将需要检索外围设备对象(retrieveConnectedPeripherals(with[Services/Identifiers]:)),并通过CBCentralManager再次显式连接以建立应用级别的连接。要使用此方法检索你的设备,你必须从以前返回的CBPeripheral对象中指定Apple分配的设备标识符,或指定它包含的至少一个服务。
iOS不允许开发者应用该高速缓存中清除外围设备的绑定状态。若要清除绑定,用户必须转至iOS设置的蓝牙部分并明确“忽略”外围设备。如果此信息会影响用户体验,则将其包含在应用的UI中可能会有所帮助,因为大多数用户并不知道这一点。
您可以在下面的链接中找到更多信息:-

cld4siwp

cld4siwp2#

在我的情况下,iPhone与外设配对后,再也没有连接过。奇怪的是,在我的iPhone 6 s与iOS 15. 5中,一切都很好。
该pugin有这个代码(有可能有些是错误的?)
https://github.com/capacitor-community/bluetooth-le/blob/main/ios/Plugin/Plugin.swift

let CONNECTION_TIMEOUT: Double = 10
let DEFAULT_TIMEOUT: Double = 5

@objc func connect(_ call: CAPPluginCall) {
    guard self.getDeviceManager(call) != nil else { return }
    guard let device = self.getDevice(call, checkConnection: false) else { return }
    let timeout = self.getTimeout(call, defaultTimeout: CONNECTION_TIMEOUT)
    device.setOnConnected(timeout, {(success, message) -> Void in
        if success {
            // only resolve after service discovery
            call.resolve()
        } else {
            call.reject(message)
        }
    })
    self.deviceManager?.setOnDisconnected(device, {(_, _) -> Void in
        let key = "disconnected|\(device.getId())"
        self.notifyListeners(key, data: nil)
    })
    self.deviceManager?.connect(device, timeout, {(success, message) -> Void in
        if success {
            log("Connected to peripheral. Waiting for service discovery.")
        } else {
            call.reject(message)
        }
    })

}

我已经尝试了其他插件,结果是相同的。

相关问题