我正在经历蓝牙插座的奇怪行为(在我看来),我想知道是否有人可以向我澄清。
我有两个通过蓝牙插座连接在一起的Android应用程序:
write(byte[] message)
。read(byte[] buffer)
。在阅读器方面,我使用 1024 字节的缓冲区。发送方发送的消息比接收缓冲区大小稍大: 1024 + 108 字节(始终是相同的消息)。
在阅读器应用程序上,我经常收到第一块 1024 字节,它填满缓冲区(如预期的那样),然后是第二块 108 字节。
但是经常(可能有40%的时间)我收到第一块 1008 字节,然后第二块 124 字节。
我真的很想理解这一点,因为我很想错过一个重要的蓝牙概念。起初我想把字节读取的数量与缓冲区大小进行比较,以了解整个消息是否已经收到,但是这个实验表明这可能不是一个好主意。
有人可以向我解释这种行为吗?
提前致谢。
答案 0 :(得分:2)
为了记录,我现在使用 Google Guava 方法对流进行读/写,一切正常。
答案 1 :(得分:1)
我发现了同样的事情 - 似乎是因为蓝牙通过流而不是数据包发送数据。
因此,如果我发送4个500字节的数据包,最终可能会发送一个1600字节的字节和一个400字节的数据包,或者我发送它的方式。堆栈溢出问题说在字节数组中使用一些随机值来告诉消息何时完成(How to read all bytes together via Bluetooth?)。
应该有更好的方法,但我打算使用一个非常不可能的字符集来尝试查找消息的结尾 - 并将其填充到我的每条消息的末尾。其他一些堆栈溢出问题建议使用' \ n'但我最终可能会使用几个来使其更不可能,例如:" \ t~ \ t" - 永远不应该在我的游戏中键入(或者希望不会从正在进行的大量其他内容中提取)。 希望有所帮助!