【问题标题】:RFCOMM receiving data with 1 L2CAP packet missingRFCOMM 接收缺少 1 个 L2CAP 数据包的数据
【发布时间】:2013-01-22 06:43:00
【问题描述】:

我使用蓝牙的 RFCOMM 编写了 android 应用程序。我通过相同的 RFCOMM UUID 向 android 应用程序发送 1 MB 数据。

我注意到我的应用程序中丢失了 1 个 L2CAP 数据包数据。有关详细信息,请参阅以下信息。

我的 android 移动蓝牙支持最大 RFCOMM 有效负载为 990 字节,因此远程设备正在发送每个有效负载为 990 字节的 L2CAP 数据包。每当我从远程设备发送 1K 的数据时,它都会被分成 2 个 990 和 34 字节的 L2CAP 数据包。

在我的 android 应用程序中接收数据后,我检查了每个 1K 数据,我注意到 1 个 L2CAP 数据包,即 android 中跳过了 990 个字节。

我使用分析仪检查了从远程设备发送的所有数据。它完美地发送了 1 MB 数据,没有任何失败。

但仅在我的 android 应用程序中,我无法接收。这不是我的应用程序的问题,因为我在这里使用了蓝牙聊天示例代码。

这个我测试了好几次,每次运行测试的1MB数据中丢失的990字节数据并不是同一个索引。

我用 3 部 android 2.2、2.3.3 和 2.3.6 版本的手机对此进行了测试,每部手机都面临同样的问题

但我在从 RFCOMM 套接字的 InputStream 接收数据时也没有遇到任何异常。

如果有人遇到并解决了我的问题,请帮助我。

【问题讨论】:

  • 澄清一下,您是说在接收到的数据流中,您收到了连续字节的数据,而在发送流中,它们之间有 990 个字节的数据?换句话说,您发送了“AB”并收到了“AB”?
  • @DavidSchwartz 正是我只是这样。 1MB 数据中的 1 次
  • 我可以想到很多可能的原因,而且几乎所有这些都是您代码中的错误。试试这个实验——记录你每次调用低级接收函数时接收到的字节数。看看它们是否等于您发送的字节数。如果是这样,并且仍然缺少 990 个字节,则证明您的代码丢失了它们。
  • 我做了同样的事情,还做了一些实验
  • 当你这样做时,你对接收函数的所有调用中接收到的字节数的总和是多少?是发送的字节数吗?还是少了 990?

标签: android bluetooth rfcomm


【解决方案1】:

您能否使用 HCIDump 工具检查两个设备之间传输/接收的 ACL 数据。如果数据与 HCI ACL 数据包/发送和接收匹配,则接收端的 L2CAP 正在丢弃一些数据包。

看看这个链接,看看 mtu 是否会导致这个问题。

http://people.csail.mit.edu/albert/bluez-intro/x559.html

谢谢 马尼文南

【讨论】:

  • 丢弃数据包不会导致数据被丢弃。 RFCOMM 是一种reliable 协议,即使在丢包的情况下也不会破坏数据。
  • @David:同意 RFCOMM 是可靠的。但我试图想出一种方法来证实 yugendra 的论点
【解决方案2】:

您可能希望在发送完所有数据后刷新流, RFCOMM 可能会缓冲一些等待其 PDU 填满的数据。 看到这个 - OutputStream::flush()

【讨论】:

  • 我的远程设备是在windows中编写USB无线类驱动开发的usb蓝牙加密狗和蓝牙栈。我用 USB 分析仪检查它正在将所有数据包发送到蓝牙无线电。
猜你喜欢
  • 2017-11-13
  • 2013-05-08
  • 2014-01-19
  • 1970-01-01
  • 2021-10-25
  • 2022-09-28
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多