React Native使用ble-plx库蓝牙连接异常问题求助
不要直接传递Device实例
ble-plx的Device对象内部绑定了BLE连接的上下文状态,跨页面路由传递(比如通过navigation params)会导致实例丢失内部状态。改成传递设备MAC地址7C:CC:FC:B4:77:E9,在第二页通过bleManager.device('7C:CC:FC:B4:77:E9')重新获取有效实例,不要用序列化/反序列化的方式传对象。处理异步连接的竞态问题
第一页连接成功后,别急着立刻跳转第二页——BLE的连接状态可能还没完全同步到模块内部。等connect()的Promise完全resolve后,再执行跳转逻辑。第二页初始化时,先调用device.isConnected()检查状态,返回false就重新发起连接,不要直接执行读写操作。清理页面间的BLE监听
第一页跳转前,务必清除所有绑定在Device实例上的事件监听(比如onDisconnected、onCharacteristicChanged),可以在useEffect的返回清理函数里执行device.removeAllListeners(),避免残留监听干扰第二页的连接状态。重置无效连接状态
既然断开后再连接能正常工作,那可以在第二页首次连接前,主动调用一次device.cancelConnection()(不管当前是否显示已连接),清除模块内部可能存在的无效连接缓存,然后再调用device.connect()发起新连接。补充日志定位问题
在第一页连接成功后打印console.log('第一页连接状态:', await device.isConnected()),第二页获取实例后也打印同样的日志,对比两次的状态差异;同时监听bleManager.onStateChange,确保第二页加载时BLE模块处于PoweredOn状态,排除模块状态异常的可能。
内容的提问来源于stack exchange,提问作者Furkan Törkyılmaz

