多BLE设备同时连接时数据丢失与不稳定问题求助
双BLE设备连接后数据传输不稳定问题排查与解决请求
问题背景
自研硬件基于BlueNRG-LP模块实现BLE通信,Windows10平台使用Python Bleak库开发数据接收存储与图形监控代码。单设备连接时数据存储正常,但同时连接两台BLE设备后,数据传输变得不稳定,两台设备存储的数据量存在明显差异(例如一台存800条,另一台仅400条)。通过带索引的实时图形监控,已确认双设备连接后的数据不稳定问题。仅当BLE设备信号稳定时数据传输正常,但这种不稳定性对系统运行造成严重影响。
已尝试但未解决的方案
- 最大化BLE设备的TX功率
- 按照数据手册设置推荐的连接间隔
当前参数配置
MAX_ATT_MTU_CONF:1000字节- 广播间隔:最大值、最小值均设为30ms
- 通知数据:每次通过
aci_gatt_srv_notify函数发送约30字节数据
核心Python代码片段
import asyncio import queue from threading import Lock, Thread from bleak import BleakClient # 假设SUBIN_BLE1、SUBIN_BLE2、charcteristic_uuid、socketio已提前定义 class BLE: def __init__(self, address): self._client = None self._connect = False self._address = address self.index = 0 self.roll = 0 self.pitch = 0 self.emg = 0 self.emgQueue = queue.Queue() self.rollQueue = queue.Queue() self.pitchQueue = queue.Queue() self._data_lock = Lock() self._connect_lock = Lock() @property def data_lock(self): return self._data_lock @property def client(self): return self._client @property def connect(self): return self._connect @connect.setter def connect(self, value): self._connect = value @property def address(self): return self._address def Data_Notify(self, sender:int , data:bytearray): with self.data_lock: data = data.decode() check_data = False try: index, data = data.split(':') data = data.split(',') self.index = index self.emg, self.roll, self.pitch = data check_data = True if check_data: self.index = int(self.index) self.emg = int(self.emg) self.roll = float(self.roll) self.pitch = float(self.pitch) if not self.emgQueue.full() and not self.rollQueue.full() and not self.pitchQueue.full(): self.emgQueue.put(self.emg) self.rollQueue.put(self.roll) self.pitchQueue.put(self.pitch) except: pass async def start(self): while True: if not self._connect: try: async with BleakClient(self._address, timeout=5) as self._client: print(self._address, 'connected!') self._connect = True await self._client.start_notify(charcteristic_uuid, self.Data_Notify) while True: if not self._client.is_connected: await asyncio.sleep(5) await asyncio.sleep(0.01) print(self._address, 'disconnected!') self._connect = False except Exception as e: print(e) await asyncio.sleep(1) async def check_connect(self): while True: if self._connect: if self._address == SUBIN_BLE1: socketio.emit('connect1', self._address) elif self._address == SUBIN_BLE2: socketio.emit('connect2', self._address) else: if self._address == SUBIN_BLE1: socketio.emit('disconnect1', self._address) elif self._address == SUBIN_BLE2: socketio.emit('disconnect2', self._address) await asyncio.sleep(1) ble1 = BLE(SUBIN_BLE1) ble2 = BLE(SUBIN_BLE2) def BLE1_start(): asyncio.run(ble1.start()) def BLE1_check(): asyncio.run(ble1.check_connect()) def BLE2_start(): asyncio.run(ble2.start()) def BLE2_check(): asyncio.run(ble2.check_connect()) DataReadThread1 = Thread(target=BLE1_start, daemon=True) DataReadThread1.start() BLECheckThread1 = Thread(target=BLE1_check, daemon=True) BLECheckThread1.start() DataReadThread2 = Thread(target=BLE2_start, daemon=True) DataReadThread2.start() BLECheckThread2 = Thread(target=BLE2_check, daemon=True) BLECheckThread2.start()
请求
恳请告知解决该双设备连接后数据传输不稳定问题的方法。
内容的提问来源于stack exchange,提问作者subin
相关产品推荐
相关产品推荐

