3

我正在经历蓝牙插座的奇怪行为(在我看来),我想知道是否有人可以向我澄清。


情况:

我有两个通过蓝牙套接字连接在一起的 Android 应用程序:

  • 第一个简单write(byte[] message)的输出流。
  • 第二个read(byte[] buffer)对输入流进行了简单的处理。

在阅读器方面,我使用1024字节的缓冲区。发送方发送的消息比接收方缓冲区大小稍大:1024 + 108字节(总是相同的消息)。

好的,现在的行为:

在阅读器应用程序上,我最常收到第一个1024字节的块,它填满了缓冲区(如预期的那样),然后是108个字节的第二个。

但实际上经常(可能是 40% 的时间)我收到第一块1008字节,然后收到第二块124字节。


我真的很想了解这一点,因为我害怕错过一个重要的蓝牙概念。起初我想将读取的字节数与缓冲区大小进行比较,以了解是否已收到整个消息,但这个实验表明这可能不是一个好主意。

有人可以向我解释这种行为吗?

提前致谢。

4

2 回答 2

2

作为记录,我现在使用Google Guava方法对流进行读/写,一切正常。

于 2014-02-24T10:40:35.480 回答
1

我发现了同样的事情——这似乎是因为蓝牙以流而不是数据包的形式发送数据。

因此,如果我发送 4 500 个字节的数据包,它最终可能会发送一个 1600 字节的数据包和一个 400 字节的数据包,或者我发送它的方式。堆栈溢出问题说在字节数组中使用一些随机值来判断消息何时完成(如何通过蓝牙一起读取所有字节?)。

应该有更好的方法,但我计划使用一个非常不可能的字符集来尝试找到消息的结尾 - 并将其填充到我每条消息的结尾。其他一些堆栈溢出问题建议使用'\n',但我最终可能会使用几个以使其更不可能,例如:“\t~\t”- 永远不应该在我的游戏中输入的东西(或者希望不是从正在发生的大量其他事情中提取的)。希望有帮助!

于 2016-03-24T07:37:55.120 回答