今天上班解决了一个问题:android程序通过蓝牙socket读取数据时,需要读多次才能把完整的响应APDU读全。当前用的方法来自android示例程序:
<!--EndFragment-->public void run() { Log.i(TAG, "BEGIN mConnectedThread"); byte[] buffer = new byte[1024]; int bytes; // Keep listening to the InputStream while connected while (true) { try { // Read from the InputStream Log.i(TAG, "Read from the InputStream..."); bytes = mmInStream.read(buffer); Log.i(TAG, "Read from the InputStream, length is "+bytes); // 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(); break; } } }
响应APDU是
02001580FFFFFFFF00A4040010D15600010180038000000001000000006A03,
接收三次,每次的结果都不一样:
(1)02001580FFFFFFFF00A4040010D1560001018003 8000000001000000006A 03
(2)02 001580FFFFFFFF00A4040010D15600010180038000000001000000006A 03
(3)02001580FFFFFFFF00A4040010D15600010180038000000001000000006A 03
修改示例代码:响应APDU是可以解析的,第3个字节的值加上10就等于响应APDU的长度,其中10是前缀和后缀的长度之和。
public void run() { Log.i(TAG, "BEGIN mConnectedThread"); byte[] buffer = new byte[1024]; // int bytes; int len = 0; int i = 0; // Keep listening to the InputStream while connected while (true) { try { // Read from the InputStream Log.i(TAG, "Read from the InputStream..."); // bytes = mmInStream.read(buffer); buffer[i++] = (byte) mmInStream.read(); if (i == 3) { len = buffer[2] + 10; } Log.i(TAG, "Read from the InputStream, data is " + buffer[i - 1]); if (i == len) { // Send the obtained bytes to the UI Activity mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, len, -1, buffer).sendToTarget(); len = 0; i = 0; } } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); break; } } }