Adr*_*ord 8 android inputstream character-encoding
我使用了来自BluetoothChat示例的代码来发送和接收来自蓝牙音阶的字节数据.标尺从设备接收命令,然后发回一个字节数组.{2,198,48,48,48,48,199,3}我们的通信协议中2 = STX,198 =数据包开始,199 =数据包结束,3 = ETX.
一切正常,除了BluetoothChatService.java中的以下代码奇怪地做出反应,因为它丢弃了前两个字节.
/**
* This thread runs during a connection with a remote device.
* It handles all incoming and outgoing transmissions.
*/
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket, String socketType) {
Log.d(TAG, "create ConnectedThread: " + socketType);
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
final byte[] buffer = new byte[1024];
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(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
// Start the service over to restart listening mode
BluetoothChatService.this.start();
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题,特别是以下代码部分:
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
Run Code Online (Sandbox Code Playgroud)
在调试之前,在mmInStream.read(缓冲区)执行之前查看缓冲区的内容时,缓冲区包含由缩放设备发回的正确数据,即:
{2,198,48,48,48,48,48,199,3}
Run Code Online (Sandbox Code Playgroud)
但是一旦代码被逐步执行,缓冲区的前两个字节就被剥离了,它现在错误地包含:
{48,48,48,48,48,199,3}
Run Code Online (Sandbox Code Playgroud)
然后消息处理程序最终传递给活动.
为了更加清楚,我必须补充一点,比例发送的字节流是十字形字符,范围在00到FF之间.由于某些奇怪的原因,字符串实际上在调试器中看起来像这样:
{2,-58,48,48,48,48,48,-57,3}
Run Code Online (Sandbox Code Playgroud)
然后2,-58被丢弃.
我注意到当我通过套接字发送字节数组时,我需要执行以下操作:
byte[] sendBytes = {2,(byte)198,48,48,48,48,48,(byte)199,3}
Run Code Online (Sandbox Code Playgroud)
当调试此数组的内容时,它将给出{2,-58,48,48,48,48,48,-57,3}
请理解我是Android新手 - java,还有很多需要学习的地方.所有帮助将不胜感激.谢谢阿德里安
I have added log.i entries to better understand what is happening based on Radu's advice. It appears that after I write data to my device over Bluetooth, it responds, and we read for some reason only first two bytes, then send these to the message handler, then read the rest of the packet sent from the device, and then send this off to the message handler, but before the handler has even responded the first time, the buffer has already been overwritten, thus by the time the handler tries to read the first two bytes, it is reading the 3rd and 4th bytes of the response packet, then immediately responds again and reads the entire packet from 3-17th position. So if I can put it simply .. the message handler only responds to the sent buffer after it has been overwritten. See the log below:
09-05 13:16:52.093: V/BluetoothSocket.cpp(11279): writeNative
09-05 13:16:52.118: I/IN_BUFFER(11279): The entire buffer after read stream into buffer: 2
09-05 13:16:52.118: I/IN_BUF_AFTER(11279): 2
09-05 13:16:52.118: I/IN_BUF_AFTER(11279): -58
09-05 13:16:52.118: I/IN_BUF_AFTER(11279): 0
09-05 13:16:52.118: I/IN_BUF_AFTER(11279): 0
...truncated to save space ...
09-05 13:16:52.163: I/IN_BUF_AFTER(11279): 0
09-05 13:16:52.163: I/IN_BUFFER(11279): We now send to handler.
09-05 13:16:52.168: I/IN_BUFFER(11279): Read Stream into Buffer:
09-05 13:16:52.168: V/BluetoothSocket.cpp(11279): readNative
09-05 13:16:52.168: I/IN_BUFFER(11279): The entire buffer after read stream into buffer: 17
09-05 13:16:52.168: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.168: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.168: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.173: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.173: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.173: I/IN_BUF_AFTER(11279): 44
09-05 13:16:52.173: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.178: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.178: I/IN_BUF_AFTER(11279): 49
09-05 13:16:52.178: I/IN_BUF_AFTER(11279): 50
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 48
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 44
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 85
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 13
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): -57
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 3
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 6
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 0
...truncated to save space ...
09-05 13:16:52.188: I/IN_BUF_AFTER(11279): 0
09-05 13:16:52.188: I/IN_BUFFER(11279): We now send to handler.
09-05 13:16:52.193: I/IN_BUFFER(11279): Read Stream into Buffer:
09-05 13:16:52.208: V/BluetoothSocket.cpp(11279): readNative
09-05 13:16:52.208: I/MESSAGE_READ(11279): I am reading 2 bytes
09-05 13:16:52.208: I/Content(11279): The entire array:
09-05 13:16:52.208: I/some hardcoded tag(11279): 0
09-05 13:16:52.208: I/some hardcoded tag(11279): 0
09-05 13:16:52.273: I/MESSAGE_READ(11279): I am reading 17 bytes
09-05 13:16:52.273: I/Content(11279): The entire array:
09-05 13:16:52.273: I/some hardcoded tag(11279): 0
...truncated to save space ...
09-05 13:16:52.283: I/some hardcoded tag(11279): 0
09-05 13:16:52.283: I/some hardcoded tag(11279): 0
09-05 13:16:54.528: V/BluetoothSocket.cpp(11279): writeNative
09-05 13:16:54.553: I/IN_BUFFER(11279): The entire buffer after read stream into buffer: 2
09-05 13:16:54.553: I/IN_BUF_AFTER(11279): 2
09-05 13:16:54.553: I/IN_BUF_AFTER(11279): -58
09-05 13:16:54.558: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.558: I/IN_BUF_AFTER(11279): 0
...truncated to save space ...
09-05 13:16:54.618: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.618: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.618: I/IN_BUFFER(11279): We now send to handler.
09-05 13:16:54.618: I/IN_BUFFER(11279): Read Stream into Buffer:
09-05 13:16:54.618: V/BluetoothSocket.cpp(11279): readNative
09-05 13:16:54.623: I/IN_BUFFER(11279): The entire buffer after read stream into buffer: 17
09-05 13:16:54.623: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.623: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.623: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.623: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.628: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.628: I/IN_BUF_AFTER(11279): 44
09-05 13:16:54.628: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.628: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.633: I/IN_BUF_AFTER(11279): 49
09-05 13:16:54.633: I/IN_BUF_AFTER(11279): 50
09-05 13:16:54.638: I/IN_BUF_AFTER(11279): 48
09-05 13:16:54.638: I/IN_BUF_AFTER(11279): 44
09-05 13:16:54.638: I/IN_BUF_AFTER(11279): 85
09-05 13:16:54.638: I/IN_BUF_AFTER(11279): 13
09-05 13:16:54.638: I/IN_BUF_AFTER(11279): -57
09-05 13:16:54.648: I/IN_BUF_AFTER(11279): 3
09-05 13:16:54.648: I/IN_BUF_AFTER(11279): 6
09-05 13:16:54.648: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.648: I/IN_BUF_AFTER(11279): 0
...truncated to save space ...
09-05 13:16:54.653: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.653: I/IN_BUF_AFTER(11279): 0
09-05 13:16:54.653: I/IN_BUFFER(11279): We now send to handler.
09-05 13:16:54.653: I/IN_BUFFER(11279): Read Stream into Buffer:
09-05 13:16:54.653: V/BluetoothSocket.cpp(11279): readNative
09-05 13:16:54.658: I/MESSAGE_READ(11279): I am reading 2 bytes
09-05 13:16:54.658: I/Content(11279): The entire array:
09-05 13:16:54.658: I/some hardcoded tag(11279): 0
09-05 13:16:54.663: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/MESSAGE_READ(11279): I am reading 17 bytes
09-05 13:16:54.723: I/Content(11279): The entire array:
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.723: I/some hardcoded tag(11279): 0
09-05 13:16:54.728: I/some hardcoded tag(11279): 0
09-05 13:16:54.728: I/some hardcoded tag(11279): 0
09-05 13:16:54.728: I/some hardcoded tag(11279): 0
Run Code Online (Sandbox Code Playgroud)
我的新代码也在读取最新流之前将缓冲区重置为0,因此消息处理程序只看到0,在我这样做之前,日志显示如下:
09-05 13:06:20.508: V/BluetoothSocket.cpp(10176): writeNative
09-05 13:06:20.533: I/IN_BUFFER(10176): The entire buffer after read stream into buffer: 2
09-05 13:06:20.533: I/IN_BUF_AFTER(10176): 2
09-05 13:06:20.533: I/IN_BUF_AFTER(10176): -58
09-05 13:06:20.533: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.533: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.538: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.538: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.548: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.548: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.548: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.553: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.553: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.568: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.573: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.573: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.573: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.573: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.573: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.578: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.578: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.578: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.578: I/IN_BUFFER(10176): We now send to handler.
09-05 13:06:20.578: I/IN_BUFFER(10176): Read Stream into Buffer:
09-05 13:06:20.578: V/BluetoothSocket.cpp(10176): readNative
09-05 13:06:20.578: I/IN_BUFFER(10176): The entire buffer after read stream into buffer: 17
09-05 13:06:20.578: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.578: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.583: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.583: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.583: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 44
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 49
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 51
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 48
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 44
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 85
09-05 13:06:20.593: I/IN_BUF_AFTER(10176): 13
09-05 13:06:20.598: I/IN_BUF_AFTER(10176): -57
09-05 13:06:20.598: I/IN_BUF_AFTER(10176): 3
09-05 13:06:20.613: I/IN_BUF_AFTER(10176): 6
09-05 13:06:20.613: I/IN_BUF_AFTER(10176): 0
...truncated to save space ...
09-05 13:06:20.623: I/IN_BUF_AFTER(10176): 0
09-05 13:06:20.623: I/IN_BUFFER(10176): We now send to handler.
09-05 13:06:20.623: I/IN_BUFFER(10176): Read Stream into Buffer:
09-05 13:06:20.623: V/BluetoothSocket.cpp(10176): readNative
09-05 13:06:20.628: I/MESSAGE_READ(10176): I am reading 2 bytes
09-05 13:06:20.628: I/Content(10176): The entire array:
09-05 13:06:20.628: I/some hardcoded tag(10176): 48
09-05 13:06:20.628: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/MESSAGE_READ(10176): I am reading 17 bytes
09-05 13:06:20.688: I/Content(10176): The entire array:
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.688: I/some hardcoded tag(10176): 44
09-05 13:06:20.688: I/some hardcoded tag(10176): 48
09-05 13:06:20.693: I/some hardcoded tag(10176): 48
09-05 13:06:20.693: I/some hardcoded tag(10176): 49
09-05 13:06:20.693: I/some hardcoded tag(10176): 51
09-05 13:06:20.693: I/some hardcoded tag(10176): 48
09-05 13:06:20.693: I/some hardcoded tag(10176): 44
09-05 13:06:20.693: I/some hardcoded tag(10176): 85
09-05 13:06:20.693: I/some hardcoded tag(10176): 13
09-05 13:06:20.693: I/some hardcoded tag(10176): -57
09-05 13:06:20.693: I/some hardcoded tag(10176): 3
09-05 13:06:20.693: I/some hardcoded tag(10176): 6
09-05 13:06:21.788: V/BluetoothSocket.cpp(10176): writeNative
09-05 13:06:21.803: I/IN_BUFFER(10176): The entire buffer after read stream into buffer: 2
09-05 13:06:21.803: I/IN_BUF_AFTER(10176): 2
09-05 13:06:21.803: I/IN_BUF_AFTER(10176): -58
09-05 13:06:21.803: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.803: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.808: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.808: I/IN_BUF_AFTER(10176): 44
09-05 13:06:21.818: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.818: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.818: I/IN_BUF_AFTER(10176): 49
09-05 13:06:21.823: I/IN_BUF_AFTER(10176): 51
09-05 13:06:21.823: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.828: I/IN_BUF_AFTER(10176): 44
09-05 13:06:21.828: I/IN_BUF_AFTER(10176): 85
09-05 13:06:21.833: I/IN_BUF_AFTER(10176): 13
09-05 13:06:21.848: I/IN_BUF_AFTER(10176): -57
09-05 13:06:21.848: I/IN_BUF_AFTER(10176): 3
09-05 13:06:21.848: I/IN_BUF_AFTER(10176): 6
09-05 13:06:21.853: I/IN_BUF_AFTER(10176): 0
...truncated to save space ...
09-05 13:06:21.853: I/IN_BUF_AFTER(10176): 0
09-05 13:06:21.853: I/IN_BUFFER(10176): We now send to handler.
09-05 13:06:21.858: I/IN_BUFFER(10176): Read Stream into Buffer:
09-05 13:06:21.858: V/BluetoothSocket.cpp(10176): readNative
09-05 13:06:21.858: I/IN_BUFFER(10176): The entire buffer after read stream into buffer: 17
09-05 13:06:21.858: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.863: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.863: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.863: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.863: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.863: I/IN_BUF_AFTER(10176): 44
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 49
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 51
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 48
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 44
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 85
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 13
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): -57
09-05 13:06:21.868: I/IN_BUF_AFTER(10176): 3
09-05 13:06:21.873: I/IN_BUF_AFTER(10176): 6
09-05 13:06:21.873: I/IN_BUF_AFTER(10176): 0
...truncated to save space ...
09-05 13:06:21.893: I/IN_BUF_AFTER(10176): 0
09-05 13:06:21.893: I/IN_BUFFER(10176): We now send to handler.
09-05 13:06:21.893: I/IN_BUFFER(10176): Read Stream into Buffer:
09-05 13:06:21.898: V/BluetoothSocket.cpp(10176): readNative
09-05 13:06:21.903: I/MESSAGE_READ(10176): I am reading 2 bytes
09-05 13:06:21.903: I/Content(10176): The entire array:
09-05 13:06:21.903: I/some hardcoded tag(10176): 48
09-05 13:06:21.903: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/MESSAGE_READ(10176): I am reading 17 bytes
09-05 13:06:21.958: I/Content(10176): The entire array:
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 44
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 49
09-05 13:06:21.958: I/some hardcoded tag(10176): 51
09-05 13:06:21.958: I/some hardcoded tag(10176): 48
09-05 13:06:21.958: I/some hardcoded tag(10176): 44
09-05 13:06:21.958: I/some hardcoded tag(10176): 85
09-05 13:06:21.958: I/some hardcoded tag(10176): 13
09-05 13:06:21.958: I/some hardcoded tag(10176): -57
09-05 13:06:21.963: I/some hardcoded tag(10176): 3
09-05 13:06:21.963: I/some hardcoded tag(10176): 6
Run Code Online (Sandbox Code Playgroud)
我希望这并没有混淆这个问题,但实际上已经证明了这个问题,很多人似乎都在使用BluetoothChat演示代码,而这些代码是为了自己的用途而添加的.不知何故,我们需要保持缓冲区被覆盖,直到消息处理程序读取它为止?问候
阿德里安·韦弗福德
由于Sleep,更新的代码工作得更好!
public void run() {
Log.i(TAG, "BEGIN IN mConnectedThread");
byte[] buffer = new byte[1024];
int bytes;
// Keep listening to the InputStream while connected
while (true) {
try {
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bytes = mmInStream.available();
Log.i("IN_BUFFER", "mmInStream-available bytes: " + Integer.toString(bytes)+ " ");
if (bytes>0){
for(int i=0; i<30; i++){
buffer[i] = 0;}
// Read from the InputStream
Log.i("IN_BUFFER", "Read Stream into Buffer:");
bytes = mmInStream.read(buffer);
Log.i("IN_BUFFER", "The entire buffer after read stream into buffer: " + Integer.toString(bytes)+ " ");
for(int i=0; i<30; i++)
Log.i("IN_BUF_AFTER", buffer[i] + " ");
// Send the obtained bytes to the UI Activity
Log.i("IN_BUFFER", "We now send to handler.");
mHandler.obtainMessage(BluetoothScale.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();}
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
// Start the service over to restart listening mode
BluetoothScaleService.this.start();
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在日志看起来如下:
09-05 20:57:15.833: V/BluetoothSocket.cpp(25368): availableNative
09-05 20:57:15.838: I/IN_BUFFER(25368): mmInStream-available bytes: 0
09-05 20:57:15.888: V/BluetoothSocket.cpp(25368): availableNative
09-05 20:57:15.888: I/IN_BUFFER(25368): mmInStream-available bytes: 0
09-05 20:57:15.943: V/BluetoothSocket.cpp(25368): availableNative
09-05 20:57:15.943: I/IN_BUFFER(25368): mmInStream-available bytes: 0
09-05 20:57:15.958: V/BluetoothSocket.cpp(25368): writeNative
09-05 20:57:15.988: V/BluetoothSocket.cpp(25368): availableNative
09-05 20:57:15.993: I/IN_BUFFER(25368): mmInStream-available bytes: 2
09-05 20:57:15.993: I/IN_BUFFER(25368): Read Stream into Buffer:
09-05 20:57:15.993: V/BluetoothSocket.cpp(25368): readNative
09-05 20:57:15.998: I/IN_BUFFER(25368): The entire buffer after read stream into buffer: 19
09-05 20:57:15.998: I/IN_BUF_AFTER(25368): 2
09-05 20:57:15.998: I/IN_BUF_AFTER(25368): -58
09-05 20:57:16.003: I/IN_BUF_AFTER(25368): 48
...truncated to save space ...
09-05 20:57:16.033: I/IN_BUF_AFTER(25368): 85
09-05 20:57:16.033: I/IN_BUF_AFTER(25368): 13
09-05 20:57:16.033: I/IN_BUF_AFTER(25368): -57
09-05 20:57:16.033: I/IN_BUF_AFTER(25368): 3
09-05 20:57:16.038: I/IN_BUF_AFTER(25368): 6
09-05 20:57:16.038: I/IN_BUF_AFTER(25368): 0
...truncated to save space ...
09-05 20:57:16.043: I/IN_BUF_AFTER(25368): 0
09-05 20:57:16.043: I/IN_BUFFER(25368): We now send to handler.
09-05 20:57:16.058: I/MESSAGE_READ(25368): I am reading 19 bytes
09-05 20:57:16.058: I/Content(25368): The entire array:
09-05 20:57:16.058: I/some hardcoded tag(25368): 2
09-05 20:57:16.058: I/some hardcoded tag(25368): -58
09-05 20:57:16.058: I/some hardcoded tag(25368): 48
...truncated to save space ...
09-05 20:57:16.063: I/some hardcoded tag(25368): 13
09-05 20:57:16.063: I/some hardcoded tag(25368): -57
09-05 20:57:16.063: I/some hardcoded tag(25368): 3
09-05 20:57:16.063: I/some hardcoded tag(25368): 6
09-05 20:57:16.093: V/BluetoothSocket.cpp(25368): availableNative
09-05 20:57:16.093: I/IN_BUFFER(25368): mmInStream-available bytes: 0
Run Code Online (Sandbox Code Playgroud)
Notice that the mmInStream.available() returns 2 bytes, then on the next line of code when we read the buffer, 19 bytes are read .. really strange, how it fills up between these two supposedly immediate steps. The sleep appears to allow enough time for the handler to read the message from passed buffer, before the buffer is rewritten to.
I would have expected the handler.obtainmessage... to send a unique buffer, but appears to send the reference to the thread buffer, thus the hassle. How can I send a unique buffer each time? Thx Adrian
我看到人们在使用蓝牙聊天示例之前遇到了这类问题.示例代码的问题在于发送给它的消息对象Handler只包含对byte[]用于每个后续read()操作的实际数组的引用.这意味着只要Handler获得消息并开始检查阵列,read()蓝牙套接字上的后续操作就已经有机会将更新的数据写入该阵列.
在这行代码中:
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget()
Run Code Online (Sandbox Code Playgroud)
数组未被复制; 而是消息只是将对象引用传递给同一个数组.
蓝牙聊天示例为其原始目的而工作的唯一原因是因为其目的是以人类打字速度传达短串角色.如果你发送任何比这更快的东西Handler,该数组的读取变成垃圾.
答案是发送数组的副本(例如System.arraycopy())或使用简单的循环缓冲区,这是我自己的蓝牙应用程序使用的.
前两个字节被破坏的事实很奇怪,但它可能只是特定设备上蓝牙堆栈中底层读取操作的具体实现.一个简单的事实是,一旦你read()用缓冲区调用,你就不应该在此期间接触那个缓冲区或者关心其中的内容.也许您设备上的特定蓝牙套接字读取实现与缓冲区中的前几个字节有关,因为它与其内部操作有关.但你不应该关心缓冲区在read()阻塞时是什么样的有趣的中间状态,因为当时没有其他线程应该试图理解它.您关心的只是缓冲区在read()返回时处于有效状态并且具有有效数据.
使用该sleep()操作显然部分地"解决"了这个问题的原因是因为Handler在后续read()操作获得数组之前,这是一种粗略的方式来让你有时间查看数组.但这不是一个好的解决方案.
您遇到的第二个问题是由于在Java byte中签名.这就是调试器将字节显示为有符号值的原因.在您的应用程序中,如果您需要使用给定字节作为int并且字节最初是无符号的,则执行以下操作:
int someValue = myByteArray[someIndex] & 0xff;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10280 次 |
| 最近记录: |