一码农 2023-12-22 17:05 采纳率: 68.8%
浏览 12

linux蓝牙bluez中LE连接参数更新时数据包丢失,如何解决?

在linux下通过bluez中的l2cap与蓝牙从机建立SOCKET连接后,从机发送数据的MTU是100,如果从机有一个120字节的数据要发送,那么主机这边会先收到一个100的ATT包,再收到一个20的ATT包,现在有个问题是,蓝牙连接成功数据传输一会儿后,从机会发起LE CONNECTION PARAM UPDATE请求,这个请求似乎会打断正在进行的数据传输,比如现在正在发送一个120字节的包,那主机这边应用中的的L2CAP socket只会收到100,20就收不到,而通过btmon观察,主机底层是收到这20个字节了的,那为什么L2CAP应用的SOCKET收不到这20字节?如果没有连接参数更新过程,数据传输就一直没问题,有没有办法禁用这个参数更新过程?或者有没有办法让上层能收到这完整的120字节?

  • 写回答

1条回答 默认 最新

  • 灬涛声依旧 2023-12-23 14:57
    关注

    在Linux系统中,通过bluez的l2cap与蓝牙设备进行连接时,如果遇到LE连接参数更新,可能会打断正在进行的数据传输。具体表现为,主机在接收到一个120字节的数据包时,先收到一个100字节的数据包,再收到一个20字节的数据包。然后通过btmon观察,发现主机底层是收到了这20个字节的数据,但在L2CAP应用的SOCKET中却无法接收到这20字节的数据。
    这是因为LL_CONNECTION_UPDATE_REQ连接更新请求并不是一旦发送就立刻生效,而是在约定的时刻进行更新。BLE的同步是通过一个连接事件计数器控制的。
    为解决这个问题,你可以尝试禁用连接参数更新过程。首先,需要理解的是,连接参数更新是BLE协议的一部分,用于在连接过程中优化和改进连接质量。禁用这一过程可能会对连接质量产生负面影响。因此,建议在禁用前充分了解可能带来的后果。同时,由于这个问题可能涉及到具体的硬件和软件配置,因此可能需要根据你的具体情况进行适当的调整和优化。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月22日