捆绑inputStream.read消息

时间:2014-06-03 15:52:07

标签: java android android-bluetooth

我使用Android Bluetooth Chat sample代码与蓝牙设备聊天(发送命令+接收响应)。当我发送命令时它工作正常,我从设备接收传递给消息处理程序的响应。我遇到的问题是响应被切成碎片。

示例:

我发送字符串"{Lights:ON}\n",我的活动正确显示Me: {Lights:ON}。设备指示灯亮起,并返回响应"{FLash_Lights:ON}\n"。不过,我的活动会显示DeviceName: {Fla,新行,DeviceName: sh_Lights:ON}(或某些变体等)。

现在我不熟悉线程和蓝牙,但我已将问题追溯到连接的线程类(在bluetoothchatservice中),更具体地说是public void run()来监听传入的字节。

     public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");
            byte[] buffer = new byte[9000];
            int bytes;

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    // Send the obtained bytes to the UI Activity
                    mHandler.obtainMessage(BluetoothActivity.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    // Start the service over to restart listening mode
                    BluetoothThreading.this.start();
                    break;
                }
            }
        }

我知道这是为了侦听任何进入的字节(作为聊天服务)。但是我确切地知道我要写给设备的是什么,而且我知道我应该接收的响应,我想要做的是在将此响应发送回mHandler之前将其捆绑。

任何有关这方面的帮助都会令人惊叹! 谢谢!

注意:我知道使用此示例作为向设备发送命令并接收响应的方式有点过分(特别是因为我确切知道我发送的内容和需要事后直接接收)。如果能够指出您可能知道的任何简化样本,那将会很棒。在一天结束时,我只需要搜索,连接到设备,按下按钮发送byte []到设备,接收byte []响应,打印+存储它。

1 个答案:

答案 0 :(得分:0)

'read()'是阻塞调用,当通过蓝牙接收到少量字节时返回。 “少数”的计数并不固定,这就是为什么传入的响应似乎被分解成碎片的原因。因此,要检索完整的响应,所有这些部分必须连接在一起。

如果响应流以特定字符终止,则后面的代码逻辑可以累积在终止字符之前到达的字节。并且一旦检测到终止字符,就将累积的响应发送到主要活动。 (请注意,在下面的代码片段中,使用的终止字符是0x0a)。

public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[9000];
int bytes;
ByteArrayOutputStream btInStream = new ByteArrayOutputStream( );

// Keep listening to the InputStream while connected
while (true) {
    try {
        // Read from the InputStream
        bytes = mmInStream.read(buffer);

        btInStream.write(Arrays.copyOf(buffer, bytes) );

        if (buffer[bytes - 1] == 0x0a){
            mHandler.obtainMessage(MainActivity.MESSAGE_READ, btInStream.size(), 0,btInStream.toByteArray());
            .sendToTarget();
            btInStream.reset();
        }
    } catch (IOException e) {
        Log.e(TAG, "disconnected", e);
        connectionLost();
        // Start the service over to restart listening mode
        BluetoothThreading.this.start();
        break;
    }
}
}

另请注意,代码未经过测试,但建议作为解决问题中提到的问题的一种方法。事实上它需要在几个地方进行修正。请测试并通知结果。