为什么Android蓝牙套接字会继续阅读相同的消息?

时间:2017-06-21 04:04:19

标签: android networking bluetooth

我正在编写一个使用orroids BluethoothSocket类和BluetoothServerSocket的应用程序。目前我正在使用两台设备进行测试,一台是服务器,另一台是客户端,我正在尝试实施我的应用特定消息,其格式如下;

[1byte MessageType][2byte length of whole message][1byte clientID][XXXbytes whatever data specific to this message]

以上"标题"部分是我从套接字解析,看看我应该如何解释我收到的。问题是我连续多次获得相同的消息。除非我在某个地方缺少逻辑,否则我不认为我的应用程序多次发送它。它基于请求/响应周期,所以它实际上只有在某个动作被触发时才会发生。例如,

用户连接
服务器 - >向客户发送他的身份证 客户 - >发送响应(我收到你的消息。服务器可以停止发送它)

我是否遗漏了有关BluetoothSocket类或一般基本网络协议的细微差别?看起来套接字正在反复读取相同的消息,即使它没有被发送。我的服务器读取功能如下所示:

byte[] buffer = new byte[BTUtils.MAX_SOCKET_READ]; // byte[2048]
        int bytes;
        // Keep listening to the InputStream while connected
        while (m_state == BTStates.STATE_CONNECTED) {
            try {
                // Read from the InputStream
                bytes = m_inputStream.read(buffer);
                // Send the obtained bytes to the UI Activity
                m_uiHandler.obtainMessage(BTMessages.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                disconnectClient(m_clientId);
                break;
            }
        }

1 个答案:

答案 0 :(得分:0)

所以,经过一些谷歌搜索并查看堆栈溢出后,我在这里找到了答案:

Android InputStream dropping first two bytes (modified BluetoothChat)

  

我看到人们在使用蓝牙聊天示例之前遇到了这类问题。示例代码的问题在于发送给Handler的消息对象只包含对用于每个后续read()操作的实际byte []数组的引用。这意味着只要处理程序获得消息并开始检查数组,蓝牙套接字上的后续read()操作就已经有机会将更新的数据写入该数组。

即使该帖子的OP在他的流中有2个字节,但它看起来像我遇到的类似问题,有时候这些消息都会混乱而且看起来很奇怪。我实际上要研究循环缓冲解决方案,因为我认为最终我会需要它。但是如果你不熟悉蓝牙技术(比如我),未来的海报会仔细考虑蓝牙的例子。