¿Cómo leer todos los bytes juntos vía Bluetooth?

Tengo una aplicación que utiliza el bluetooth para recibir algunos datos (bytes) de otro dispositivo. Todo va bien, pero tengo un pequeño problema al recibir los bytes todos juntos. Después de recibir los bytes, les muestro en un brindis solo para probarlos. Cuando el otro dispositivo envía 10 bytes (por ejemplo: "ABCDEFGHIJ"), el programa tomará el primer byte "A" solamente y lo mostrará en un Toast, luego pasará a la segunda iteración y leerá los otros 9 bytes y mostrará " BCDEFGHIJ "en el brindis. Aquí está mi código:

byte[] buffer = new byte[1024]; // Read 1K character at a time. int bytes = 0; // Number of bytes. while(true) { try { // Read from the InputStream. bytes = bInStream.read(buffer); // Send the obtained bytes to the MainActivity. mainActivityHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); } catch(IOException e) { connectionLost(); break; } } 

En MainActivity, tengo:

 // The Handler that gets information back from the BluetoothManager. private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case MESSAGE_READ: byte[] readBuf = (byte[]) msg.obj; // construct a string from the valid bytes in the buffer. String readMessage = new String(readBuf, 0, msg.arg1); Toast.makeText(MainActivity.this, readMessage, Toast.LENGTH_SHORT).show(); break; // ... } } }; 

¿Cómo puedo recibir todos los bytes juntos ?!

Mmm más probable es que el culpable está en la forma en que está enviando los mensajes. Su recepción no tiene problemas, recibirá tantos bytes (hasta su 1024) como se escribe.

Si no tienes control sobre la forma en que se envían los mensajes, probablemente puedas leer un byte a la vez y luego enviar un mensaje de manejador cuando llegas a un terminador predefinido. Ejemplo: "ABCDEFGHIJ #" donde # es el terminador.

 String msg = ""; byte ch; while((ch=mInStream.read())!='#') { bytes++; msg+=ch; } 

La conexión Bluetooth se basa en la corriente, no basada en paquetes. No hay garantía o intento de preservar la paquetería. Así que cualquier número de escrituras puede dar lugar a cualquier número de lecturas, sólo el flujo de bytes se garantiza que sea correcto. Si necesita detectar paquetes, debe proporcionar su propia estructura de paquetes para envolver sus datos. Por ejemplo, agregue un campo de longitud antes de cada paquete de datos para que pueda reconstruir en el lado de recepción.

La respuesta aceptada de @broody es correcta. Pero si los datos en sí contienen '#', puede ser difícil obtener los datos. Por lo tanto, el mejor enfoque según mi es añadir '\ n' seguido de '\ r' (o cualquier otro carácter que sea poco probable que figure como datos Refer ASCII Table ) en el dispositivo que envía datos a su aplicación de Android. Simplemente actúa como alimentación de línea y marca el final de los datos.

Por ejemplo: ABCDEFGH \ n \ r

Entonces su código puede ser algo como esto:

 byte[] buffer = new byte[1024]; while (true) { // Read from the InputStream buffer[bytes] = (byte) mmInStream.read(); // Send the obtained bytes to the UI Activity if ((buffer[bytes] == '\n')||(buffer[bytes]=='\r')) { mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget(); bytes=0; } else bytes++; } 

Espero que ayude Recuerdos

Una manera de manejar mensajes más largos que el buffer (puede ser peligroso porque puede ocupar su memoria si nunca se borra) es manejarlos en trozos:

 String inString = ""; byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() while (true) { try { bytes = mmInStream.read(buffer); String chunk = new String(buffer, 0, bytes); if(chunk.contains(";")) { inString += chunk.substring(0,chunk.indexOf(';')); Message msg = new Message(); msg.obj = inString; handler.sendMessage(msg); inString = chunk.substring(chunk.indexOf(';')); } else { inString += chunk; } } catch (IOException e) { break; } } 
  • ¿Cómo puedo compartir varios archivos a través de un intento?
  • Matriz de rotación de Android
  • Android: la adición de vistas a las imágenes no se actualiza - onClick
  • Lona de Android, múltiples rutas con diferentes cantidades de zoom
  • No se puede resolver el método setOnChildClickListener
  • String.concat () no hace concatenación
  • Correcta forma de convertir entre Bitmap y Mat en OpenCV en Android?
  • Emulador de Android no se carga en netbeans
  • ¿Cómo puedo hacer que mi código sea seguro? - Privado vs. Pública
  • No se invoca el método Java cuando se llama desde pthread nativo
  • Rastro de la pila de la consola de Google Play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.