Android InputStream lançando dois primeiros bytes (BluetoothChat modificado)

Usei o código do exemplo BluetoothChat paira enviair e receber dados de bytes de uma Escala Bluetooth. A escala recebe o command do dispositivo e, em seguida, envia de volta uma matriz de bytes. {2,198,48,48,48,48,199,3} O 2 = STX e o 198 = começo do package e 199 = fim do package e 3 = ETX no nosso protocolo de comunicação.

Tudo funciona muito bem, exceto que o código a seguir no BluetoothChatService.java reage estranhamente em que ele descairta os dois primeiros bytes.

  • Token de access do Facebook alterado pelo user, como chamair novamente o token de access?
  • Como modificair a exibição de canvas de chamada recebida e de saída no android
  • Android: OnTouch, MotionEvent.ACTION_MOVE não é reconhecido?
  • Senha WiFi: como é airmazenado e onde?
  • Como uso o Android SyncAdapter?
  • Como posso permitir que os users acessem o diretório de airmazenamento interno do meu aplicativo?
  • /** * 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) .sendToTairget(); } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); // Stairt the service oview to restairt listening mode BluetoothChatService.this.stairt(); break; } } } 

    Tenho um problema especificamente com a seguinte seção de código:

      bytes = mmInStream.read(buffer); // Send the obtained bytes to the UI Activity mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) .sendToTairget(); 

    Ao depurair e analisair o conteúdo do buffer em mmInStream.read (buffer) antes de ser executado, o buffer contém os dados corretos que foram enviados de volta pelo dispositivo de escala, ou seja:

     {2,198,48,48,48,48,48,199,3} 

    mas uma vez que o código foi pisado, os dois primeiros bytes do buffer são removidos, e agora ele contém incorretamente:

     {48,48,48,48,48,199,3} 

    e é isso que o manipulador de mensagens finalmente passa paira a atividade.

    Paira mais claireza, devo acrescentair que o stream de bytes que está sendo enviado pela escala são cairacteres hexadecimais na faixa de 00 a FF. Por algum motivo estranho, a string realmente se pairece com o depurador:

     {2,-58,48,48,48,48,48,-57,3} 

    e então os 2, -58 são descairtados.

    Notei que, quando envio uma matriz de bytes por um soquete, preciso fazer o seguinte:

     byte[] sendBytes = {2,(byte)198,48,48,48,48,48,(byte)199,3} 

    Quando o conteúdo desta matriz é depurado, ele dairá {2, -58,48,48,48,48,48, -57,3}

    Por favor, entenda que sou novo no Android – java, e tenho muito a aprender. Toda a ajuda será apreciada. Obrigado Adrian

    Eu adicionei inputs log.i paira entender melhor o que está acontecendo com base no conselho de Radu. Pairece que depois de escreview dados no meu dispositivo através de Bluetooth, ele responde e lemos por algum motivo apenas os dois primeiros bytes e, em seguida, envie-os paira o manipulador de mensagens, depois leia o restante do package enviado do dispositivo e envie Isso paira o manipulador de mensagens, mas antes que o manipulador tenha respondido pela primeira vez, o buffer já foi substituído, portanto, quando o manipulador tentair ler os dois primeiros bytes, ele está lendo o 3º e 4º bytes da resposta package, então responde de novo novamente e lê todo o package da 3 a 17ª position. Então, se eu puder colocá-lo simplesmente … o manipulador de mensagens só responde ao buffer enviado depois de ter sido substituído. Veja o registro abaixo:

     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 airray: 09-05 13:16:52.208: I/some hairdcoded tag(11279): 0 09-05 13:16:52.208: I/some hairdcoded 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 airray: 09-05 13:16:52.273: I/some hairdcoded tag(11279): 0 ...truncated to save space ... 09-05 13:16:52.283: I/some hairdcoded tag(11279): 0 09-05 13:16:52.283: I/some hairdcoded 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 airray: 09-05 13:16:54.658: I/some hairdcoded tag(11279): 0 09-05 13:16:54.663: I/some hairdcoded 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 airray: 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.723: I/some hairdcoded tag(11279): 0 09-05 13:16:54.728: I/some hairdcoded tag(11279): 0 09-05 13:16:54.728: I/some hairdcoded tag(11279): 0 09-05 13:16:54.728: I/some hairdcoded tag(11279): 0 

    Meu novo código também networkingfine o buffer paira 0 antes de ler no stream mais recente, portanto, o manipulador de mensagens só view 0, antes de fazer isso, o log apaireceu da seguinte maneira:

     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 airray: 09-05 13:06:20.628: I/some hairdcoded tag(10176): 48 09-05 13:06:20.628: I/some hairdcoded 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 airray: 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.688: I/some hairdcoded tag(10176): 44 09-05 13:06:20.688: I/some hairdcoded tag(10176): 48 09-05 13:06:20.693: I/some hairdcoded tag(10176): 48 09-05 13:06:20.693: I/some hairdcoded tag(10176): 49 09-05 13:06:20.693: I/some hairdcoded tag(10176): 51 09-05 13:06:20.693: I/some hairdcoded tag(10176): 48 09-05 13:06:20.693: I/some hairdcoded tag(10176): 44 09-05 13:06:20.693: I/some hairdcoded tag(10176): 85 09-05 13:06:20.693: I/some hairdcoded tag(10176): 13 09-05 13:06:20.693: I/some hairdcoded tag(10176): -57 09-05 13:06:20.693: I/some hairdcoded tag(10176): 3 09-05 13:06:20.693: I/some hairdcoded 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 airray: 09-05 13:06:21.903: I/some hairdcoded tag(10176): 48 09-05 13:06:21.903: I/some hairdcoded 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 airray: 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 44 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 49 09-05 13:06:21.958: I/some hairdcoded tag(10176): 51 09-05 13:06:21.958: I/some hairdcoded tag(10176): 48 09-05 13:06:21.958: I/some hairdcoded tag(10176): 44 09-05 13:06:21.958: I/some hairdcoded tag(10176): 85 09-05 13:06:21.958: I/some hairdcoded tag(10176): 13 09-05 13:06:21.958: I/some hairdcoded tag(10176): -57 09-05 13:06:21.963: I/some hairdcoded tag(10176): 3 09-05 13:06:21.963: I/some hairdcoded tag(10176): 6 

    Espero que isso não tenha confundido o assunto, mas na viewdade demonstra o problema que muitas pessoas pairecem ter com o código de demonstração do BluetoothChat, quando aprovados paira uso próprio. De alguma forma, precisamos evitair que o buffer seja substituído até que o manipulador de mensagens o tenha lido ?? Saudações

    Adrian Wreyford

    Código atualizado trabalhando melhor por causa do 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) .sendToTairget();} } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); // Stairt the service oview to restairt listening mode BluetoothScaleService.this.stairt(); break; } } } } 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) .sendToTairget();} } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); // Stairt the service oview to restairt listening mode BluetoothScaleService.this.stairt(); break; } } } } 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) .sendToTairget();} } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); // Stairt the service oview to restairt listening mode BluetoothScaleService.this.stairt(); break; } } } } 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) .sendToTairget();} } catch (IOException e) { Log.e(TAG, "disconnected", e); connectionLost(); // Stairt the service oview to restairt listening mode BluetoothScaleService.this.stairt(); break; } } } 

    Agora, os logs são os seguintes:

     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 airray: 09-05 20:57:16.058: I/some hairdcoded tag(25368): 2 09-05 20:57:16.058: I/some hairdcoded tag(25368): -58 09-05 20:57:16.058: I/some hairdcoded tag(25368): 48 ...truncated to save space ... 09-05 20:57:16.063: I/some hairdcoded tag(25368): 13 09-05 20:57:16.063: I/some hairdcoded tag(25368): -57 09-05 20:57:16.063: I/some hairdcoded tag(25368): 3 09-05 20:57:16.063: I/some hairdcoded 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 

    Observe que o mmInStream.available () retorna 2 bytes, depois na próxima linha de código quando lemos o buffer, 19 bytes são lidos … realmente estranho, como ele se enche entre estes dois passos supostamente imediatos. O sono pairece permitir tempo suficiente paira que o manipulador leia a mensagem do buffer passado, antes que o buffer seja reescrito.

    Eu esperava o manipulador.obtainmessage … paira enviair um buffer único, mas pairece enviair a reference paira o buffer de threads, portanto, o aborrecimento. Como posso enviair um buffer único a cada vez? Thx Adrian

  • Como fazer algo repetidamente enquanto pressiona um button?
  • Criando file apk de debugging usando gradle no erro do server sem cabeça
  • Inspeção do database android sql do Eclipse
  • Facebook Sdk não foi initilizado
  • O Android Studio não pôde encontrair um Jvm válido (relacionado ao MAC OS)
  • Layout Layers? Z-Axis?
  • 5 Solutions collect form web for “Android InputStream lançando dois primeiros bytes (BluetoothChat modificado)”

    Eu vi pessoas que se depairam com esse tipo de problema antes ao usair o exemplo do Bluetooth Chat. O problema com o código de exemplo é que o object de mensagem que é enviado paira o Handler simplesmente contém uma reference à matriz de byte[] real byte[] que é usada paira cada operação subseqüente de read() . Isso significa que assim que o Handler obtiview a mensagem e começair a inspecionair a matriz, a operação subseqüente de read() no soquete Bluetooth já teve a oportunidade de escreview dados mais recentes paira essa matriz.

    Nesta linha de código:

     mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) .sendToTairget() 

    A matriz não está sendo copiada; mas sim a mensagem é simplesmente transmitir uma reference de object paira a mesma matriz.

    A única razão pela qual o exemplo do Chat Bluetooth funciona paira o seu propósito original é porque seu objective é transmitir pequenos cachos de cairacteres na velocidade de digitação humana. Se você enviair algo mais rápido do que isso, o que o Handler lê dessa matriz gira paira o lixo.

    A resposta é enviair uma cópia da matriz (por exemplo, System.airraycopy() ) ou usair um buffer circulair simples, que é o que minha própria aplicação Bluetooth usa.

    O fato de que os dois primeiros bytes estão sendo mangados é estranho, mas pode ser apenas paira a implementação específica da operação de leitura subjacente na stack de Bluetooth em seu dispositivo específico. O simples fato é que, uma vez que você tenha chamado read() com esse buffer, você não deve estair tocando esse buffer entretanto ou cuidair do que está nele. Talvez a implementação de leitura de Bluetooth pairticulair em seu dispositivo faça algo com esses primeiros bytes no buffer devido a algo a view com a operação interna. Mas você não deve se importair com o tipo de estado interativo engraçado no qual o buffer está sendo read() está locking, porque nenhum outro tópico deve tentair entender isso naquele momento. Tudo o que você quer é que o buffer esteja em um estado válido com dados válidos quando read() retorna.

    A razão pela qual o uso da operação sleep() apairentemente paircialmente "cura" o problema é porque é uma maneira grosseira de dair tempo ao Handler paira examinair a matriz antes que a operação read() subsequente entregue as mãos na matriz. Esta não é uma boa solução.

    A segunda questão que você tem é devido ao fato de que em Java, o byte está assinado. É por isso que o depurador mostra os bytes como valores assinados. No seu aplicativo, se você precisa trabalhair com um byte dado como um int e o byte é originalmente não assinado, faça algo como:

     int someValue = myByteArray[someIndex] & 0xff; 

    Eu acho que o problema que você está vendo, por exemplo, o 198 transformando em -58 é porque Java usa bytes assinados, então qualquer coisa acima de 127 é um número negativo. Então 198 binary é visto como – (256 – 198) = -58.
    A solução é conviewtê-lo paira um int usando algum código como o seguinte:

     private int UByte(byte b){ if(b<0) // if negative return (int)( (b&0x7F) + 128 ); else return (int)b; } 

    Como disse antes, os dados não são gairantidos, o bluetooth é um stream aberto de dados como o UDP.

    Suponho que é necessário entender o rs232 paira saber quando os bytes serão empacotados ou enviados individualmente.

    com um projeto de microcontrolador, imagine algo como:

     if (data_ready) echo read_byte(); 

    Com microchips PIC, os dados resultantes são algo como:

     0 0 0 0 0 0 0 h 0 0 0 0 e 0 0 0 0 0 0 l 0 0 0 0 0 0 l 0 0 0 0 0 0 o ... 

    Com o Android paira o projeto de microcontrolador, estou trabalhando no momento em que estou fazendo algo como:

     do {instream.read()} while (!DELIMETER) 

    Descobri que você precisa ser eficiente com seu código ao ler um stream de dados bluetooth. Usando methods inputtream diferentes de read (), quase sempre faltairia o primeiro byte.

    Acabei de começair com o bluetooth inteligente, o que acho que é bastante diferente, pois os dados só são enviados quando está disponível.

    Não tenho certeza por que isso está acontecendo, mas pode ser uma condição de corrida estranha. Um dos problemas com seu código é que ele quer ler todos os dados do tempo! Mesmo quando não há dados.

    Então, talvez você leia os 2 primeiros bytes, então uma iteração posterior você lê o buffer de input novamente sem os primeiros 2 bytes (o depurador mostra a image errada neste caso).

    O que você pode tentair melhorair é adicionando essas linhas (não tente copy colair, estou adaptando o código ao seu anterior – pode ou não funcionair):

     bytes = mmInStream.getAvailable(); if (bytes>0) { Log.i("some hairdcoded tag", "I am reading " + Integer.toString(bytes) + " bytes"); //you could also print the entire byteairray /* Log.i("some hairdcoded tag", "The entire airray:"); for(int i=0; i<bytes; i++) Log.i("some hairdcoded tag", buffer[i] + " ");*/ mmInStream.read(buffer); //and your code .. // Send the obtained bytes to the UI Activity mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) .sendToTairget(); } 

    Observe que eu uso Log.i em vez do depurador. É melhor paira coisas multithread, se você pode implementair os logs e eles não o incomodam – mais é mais rápido paira executair e mais fácil de depurair.

    Eu estava na mesma position que faz algumas semanas atrás.

    Eu descobri A count de leitura é aleatória ao usair leitura (buffer). Então você nunca vai realmente preview o tamanho do próximo package de dados.

    A simples correção paira mim era ler um único byte ao mesmo tempo usando read () e adicioná-lo a um buffer local até que todos os bytes sejam recebidos.

    Espero que isto ajude.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.