【问题标题】:Android bluetooth chunk sizeAndroid蓝牙块大小
【发布时间】:2013-08-19 10:07:25
【问题描述】:

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


情况:

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

  • 第一个在输出流上创建一个简单的write(byte[] message)
  • 第二个在输入流上创建一个简单的read(byte[] buffer)

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

现在好了:

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

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


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

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

提前致谢。

【问题讨论】:

    标签: android android-bluetooth


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      因此,如果我发送 4 500 个字节的数据包,它最终可能会发送一个 1600 字节的数据包和一个 400 字节的数据包,或者我发送它的方式。堆栈溢出问题说使用字节数组中的一些随机值来判断消息何时完成(How to read all bytes together via Bluetooth?)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 2020-09-05
        • 1970-01-01
        • 2023-03-17
        • 2023-02-13
        • 2013-10-25
        • 2023-03-16
        相关资源
        最近更新 更多