0

我正在开发一个 android 应用程序,它通过蓝牙从Asuro一个小机器人接收字节数组。

这个字节数组是一个命令协议,因此固定大小为 15 此外,应用程序将字节数组发送给 Asuro,Asuro 将其发回。

但是,如果我使用 read(byte[],0,15) 函数并将此数组提供给 Log.d,则此字节数组会被拆分。

请看下面的代码:

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

        // Keep listening to the InputStream while connected
while (true) {
    try {
    // Read from the InputStream
    bytes = mmInStream.read(buffer, 0, 15);
    if (buffer[0] != 0) {
        Log.d("Asuro-Android", "Input :" + Arrays.toString(buffer));
    }
    buffer = new byte[15];      
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}

我要发送给 Asuro:

Output: [58, 48, 49, 48, 48, 48, 49, 48, 48, 48, 51, 48, 48, 48, 48]

连接等工作。为了简化它,我创建了一个数组并将其刷新到输出流中。

但我得到:

Input :[58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Input :[48, 49, 48, 48, 48, 49, 48, 48, 48, 51, 0, 0, 0, 0, 0]
Input :[48, 48, 48, 48, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

这可能是我(应用程序)的错误,还是只能是 asuro 的错误?

4

1 回答 1

1

这是蓝牙 SPP 配置文件的本质,它不提供帧边界。因此,它可以由发送方 SPP 本身或接收方根据其缓冲区容量等进行拆分。在您的情况下,由于数据包始终是固定大小的,您可以进行简单的重新组装,或者在更一般的情况下添加您赢得的标头并重新组装一个框架。

于 2013-01-29T15:33:31.353 回答