¿Cómo puedo conectar correctamente una aplicación de Android a un socket RFCOMM en un microcontrolador Arduino habilitado para Bluetooth?

Estoy trabajando con algunos estudiantes de mi universidad desarrollando una sencilla aplicación Bluetooth Android que se utilizará para la comunicación serial (RFCOMM) a un microcontrolador Arduino con un módulo Bluetooth conectado a él.

A lo mejor de mi conocimiento, estoy utilizando la correcta dirección Bluetooth y UUID para RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB . Mi aplicación inicia un subproceso que intenta conectarse al dispositivo mediante BluetoothDevice.createRfcommSocketToServiceRecord(UUID) . Pero por una razón u otra, no estamos viendo una conexión exitosa. La operación siempre falla al invocar connect() en el BluetoothSocket resultante que viene de la invocación anterior.

Cuando se prueba en mi HTC Evo , la variante de HTC de Gingerbread , la llamada connect() generalmente falla con el mensaje de excepción "No se pudo iniciar el descubrimiento de servicio". Hice un poco de lectura y encontré que algunos dijeron que la implementación de HTC para RFCOMM en la pila de Bluetooth era buggy, así que decidimos probarlo en el Samsung Galaxy S de otro estudiante. La primera vez que funcionó el código, todo funcionó perfectamente. El microcontrolador Arduino está conectado a un pequeño motor eléctrico que comenzó a funcionar como se esperaba. No he descartado si el problema podría estar en el lado del microcontrolador.

Posteriormente, los usos posteriores de la aplicación en el dispositivo Samsung fallaron, ahora con un mensaje que decía "falla de descubrimiento del servicio". Para mí, parece que tal vez el módulo Bluetooth en el lado del dispositivo piensa que el servicio RFCOMM todavía está en uso. Pero hemos reiniciado el microcontrolador y todavía vimos el mismo resultado.

Acabo de enumerar el código del hilo, ya que es todo lo que es realmente relevante. He leído que hay una solución bastante común (hack) para estos problemas con la reflexión. Mis intentos en él también han fracasado, pero están allí y comentado. Espero que alguien pueda guiarme en la dirección correcta aquí. También tenga en cuenta que tengo los permisos necesarios habilitados en el manifiesto y en ambos casos, el dispositivo se emparejó correctamente al Arduino usando la interfaz de usuario de Android.

 private class ClientThread extends Thread { private String _btAddress; /** * A handle to the local device's Bluetooth adapter hardware. */ private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter(); /** * A handle to the remote device Bluetooth context. */ private BluetoothDevice _btRemoteDevice; /** * A handle to the Bluetooth serial socket. */ private BluetoothSocket _btSocket; /** * Constructor. * @param btAddress The BluetoothHardware address. */ public ClientThread(String btAddress) { _btAddress = btAddress; } public void run() { // Retrieves the device identified by the _btAddress property. _btRemoteDevice = retrieveDevice(); if ( _btRemoteDevice == null ) sendUIMessage( CONNECTION_BT_DEVICE_NOT_BONDED ); else sendBeacon(); } /** * Retrieves the device associated with this client thread. * @return */ private BluetoothDevice retrieveDevice() { Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices(); for (BluetoothDevice btd : btDevices) { String addr = btd.getAddress(); String name = btd.getName(); if ( addr.equalsIgnoreCase(_btAddress) ) return btd; } return null; } /** * Sends the beacon to the Bluetooth device. */ private void sendBeacon() { // Holds the output stream of the BluetoothDevice. OutputStream os = null; try { _btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord( UUID.fromString( "00001101-0000-1000-8000-00805F9B34FB" ) ); //Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); //_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1); _btSocket.connect(); os = _btSocket.getOutputStream(); os.write('L'); } catch (IOException e) { String message = e.getMessage(); e.printStackTrace(); sendUIMessage(CONNECTION_FAILURE_IO); } catch (Exception e) { e.printStackTrace(); sendUIMessage(CONNECTION_FAILURE_UNKNOWN); } finally { try { if (_btSocket != null) _btSocket.close(); } catch (IOException e) { System.out.println("Failed closing Bluetooth output stream."); e.printStackTrace(); } } } } 

EDIT: El módulo Bluetooth es un MDFLY RF-BT0417CB. Sé que el código que se está ejecutando en el arduino no es mucho y simplemente se está comunicando con el módulo BT usando Serial.available () y Serial.read (). Sin embargo tengo una nueva pieza de información que puede ser de más uso. Cuando mi aplicación se instaló en el dispositivo Samsung, funcionó sólo una vez y falló en ensayos posteriores. Un tiempo atrás, el otro estudiante con el que estoy trabajando, utilizó Android App Inventor (una herramienta de arrastrar y soltar GUI que también puede crear artefactos de trabajo lógicos) para crear una aplicación sencilla que conecta el mismo módulo BT / arduino bordo, que funcionó. Dijo que cuando se instaló mi aplicación, que la otra aplicación no pudo conectarse al módulo BT, lo que me lleva a creer que el sistema permaneció pensando que el recurso fue asignado a mi aplicación. Después de que desinstaló mi aplicación, el otro fue capaz de conectarse. Él no tiene el código fuente de la otra aplicación, pero voy a probar App Inventor a mí mismo para ver si el código fuente que genera genera está haciendo algo diferente. A lo mejor de mi conocimiento, estoy cumpliendo con la mayoría de las prácticas estándar definidas en la documentación de Android, así que quizás es algo extraño sobre el módulo BT o el hecho de que el código arduino no necesariamente controla mediante programación el módulo BT.

OTRO EDIT: No soy un experto en Bluetooth, pero fuimos capaces de resolver un problema. Como algunos son conscientes, hay un montón de BluetoothDevice API pública, ocultos en tiempo de compilación, pero son legalmente público en tiempo de ejecución utilizando la reflexión. Uno de ellos es createRfCommSocket (int). Esta API no está en la documentación oficial ya que está oculta, pero puede leerla aquí . No lo he probado todavía con la API de la documentación admitida, pero el problema parecía ser algo de un problema de concurrencia entre el teléfono y la placa serie. El microteléfono envió un mensaje, que es por supuesto una llamada de bloqueo, y cuando volvió de allí, cerró la conexión. El escudo en la placa serial también cerraría la conexión y por lo tanto los datos no estarían disponibles para la aplicación arduino. Nos dimos cuenta de esto cuando testigo de la comunicación exitosa en el modo de depuración en el lado de Android, pero el fracaso en el modo de liberación. La adición de un retraso de medio segundo en el lado de Android, entre la transmisión y el cierre de la BluetoothSocket solucionado el problema. No puedo decir si este tema fue atribuido por el código arduino o no, ya que no estoy muy familiarizado con la arquitectura, pero como estudiantes carecemos de experiencia por lo que no me sorprendería.

 [Communication Between Android And Arduino With Bluetooth(1)][1] 

Creo que esto te será de ayuda. ¿Puede proporcionar algún detalle sobre esto? He visto un enlace, también puede ver esto. Hazme saber si esto es útil o no? Cómo crear Insecure RFCOMM Socket en Android?

El kit de herramientas de Amarino fue construido específicamente para facilitar la comunicación serial Bluetooth entre un dispositivo Android y un Arduino con Bluetooth.

  • ¿Es posible transferir archivos a través de OBEX entre dispositivos no emparejados?
  • BluetoothDevice.ConnectGatt () con el parámetro de transporte
  • Enviar y recibir datos a través de Bluetooth
  • Múltiples conexiones bluetooth
  • Android IRC Horas de oficina Pregunta Acerca de Android Bluetooth RSSI
  • Conexión insegura de Android al bluetooth
  • Conectar mediante programación a un auricular Bluetooth desde una aplicación de Android
  • Dynamic TextView en ActionBar
  • Comprueba si Bluetooth está habilitado mediante una aplicación de Android
  • ¿Cómo controlar las operaciones de bluetooth usando adb shell?
  • Detectar o la latencia aproximada de Bluetooth en Android (reproducción de audio)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.