从Inputstream获取意外数据



我从我的朋友那里有一些奇怪的设备,这些设备没有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());

三行中的五个错误:

  1. 您正在滥用available(),从而提出可能的读数为零,或者比缓冲区长度更多。
  2. 您忽略了字节数,该代码可能为零,或-1表示流的末端。
  3. 如果字节计数为零,则在自旋环中而不是封锁。
  4. 然后,您忽略了数据,只需完全读取。
  5. 然后您将记录下一个字节。

应该是:

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));

最新更新