我从我的朋友那里有一些奇怪的设备,这些设备没有UUID,但我想通过蓝牙从中读取数据。所以我创建了这样的东西
class ReadData extends Thread {
byte[] buffer = new byte[1024];
ByteArrayInputStream arrayData;
OutputStream outputData;
InputStream inputData;
InputStreamReader inputDataReader;
int bytes;
MessageDigest md = null;
ReadData(BluetoothSocket bluetoothSocket) throws IOException {
outputData = bluetoothSocket.getOutputStream();
inputData = bluetoothSocket.getInputStream();
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//byte [] bytesToSend = {0x0F, 'T', 0x01, 0x08, 0x00, 0x02, 0x05, 0x10, 0x06, 0x02, 0x00, 0x01, 0x09, 0x00, 0x00, md.digest()[0], md.digest()[1], 0x0D };
//byte [] bytesToSend = {0x0F, 'R', md.digest()[0], md.digest()[1], 0x0D };
//byte [] bytesToSend = {0x0F, 'S', md.digest()[0], md.digest()[1], 0x0D };
byte [] bytesToSend = {0x0F, 'A', md.digest()[0], md.digest()[1], 0x0D };
Log.i("BYTES TO SEND", "" + bytesToSend);
outputData.write(bytesToSend);
Log.i("DATA_TO_SEND", outputData.toString());
}
public void run(){
while(true){
try {
bytes = inputData.read(buffer, 0, inputData.available());
inputDataReader = new InputStreamReader(inputData);
Log.i("RETRIVED_DATA", "" + inputDataReader.read());
outputData.close();
inputData.close();
} catch( IOException e){
} catch ( IllegalStateException e){
Log.e("ERROR_APEARED", "" + bytes);
}
}
}
这就是我获得蓝牙插座的方式以及如何将其传递给readdata的构造函数:
BluetoothAdapter bluetoothAdapter = null;
BluetoothSocket clientSocket = null;
BluetoothDevice remoteDevice = bluetoothAdapter.getRemoteDevice(devices.get(i).getAddress());
Method m = remoteDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
clientSocket = (BluetoothSocket) m.invoke(remoteDevice, 1);
但是,当我从设备中接收到的数据时,我出于某种原因获得了数字15,为什么?我在做什么错?
ps。bytestosend数组这些是我需要发送到设备查询的命令。但是我不确定是正确的,我得到的文档说:
commands:
'R' - request for current RTC status
<0x0F><'R'><CKSH><CKSL><0x0D>
正确吗?像我在做的那样发送查询?或者我误解了文档。
bytes = inputData.read(buffer, 0, inputData.available());
inputDataReader = new InputStreamReader(inputData);
Log.i("RETRIVED_DATA", "" + inputDataReader.read());
三行中的五个错误:
- 您正在滥用
available()
,从而提出可能的读数为零,或者比缓冲区长度更多。 - 您忽略了字节数,该代码可能为零,或-1表示流的末端。
- 如果字节计数为零,则在自旋环中而不是封锁。
- 然后,您忽略了数据,只需完全读取。
- 然后您将记录下一个字节。
应该是:
bytes = inputData.read(buffer);
// Note that bytes cannot now be zero, as buffer.length > 0
if (bytes == -1)
break;
Log.i("RETRIEVED_DATA", new String(buffer, 0, bytes));
nb以下:
Log.i("DATA_TO_SEND", outputData.toString());
是徒劳的。I/O流转换为字符串时不会产生任何有趣的东西。应该是:
Log.i("DATA_TO_SEND", Arrays.toString(bytesToSend));