我使用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 []响应,打印+存储它。
答案 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;
}
}
}
另请注意,代码未经过测试,但建议作为解决问题中提到的问题的一种方法。事实上它需要在几个地方进行修正。请测试并通知结果。