You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:26:00