Conexión automática a Dispositivos Bluetooth emparejados en Android

Quiero conectar mi teléfono Android (2.3.6 Samsung Nota) a un dispositivo Bluetooth incorporado (RN-42 BT UART módulo en Arduino). Comenzó con el ejemplo de BluetoothChat y tiene el dispositivo embebido emparejado con el teléfono. Hasta ahora todo parece funcionar bien, los dispositivos se conectan y los datos se pasan de Android a dispositivo integrado. Lo que todavía me falta es hacer que los dispositivos se conecten automáticamente una vez que los dos están en el rango.

Usando el depurador veo el dispositivo incrustado es "Host" o en su término "Slave" y el Android es un cliente, como el Android emiten una solicitud de conexión.

3 Solutions collect form web for “Conexión automática a Dispositivos Bluetooth emparejados en Android”

Tengo una configuración similar (Android Galaxy S3 teléfono 4.0 y RN-42 BT conectado a Arduino Uno) Puedo emparejar el Android y el bluetooth y conectar desde el Android a la RN-42 BT (Estoy usando la aplicación BlueTerm Para probar eso) Sin embargo, no puedo conectarme desde el RN-42 BT al teléfono Android. Seguí las innstructions y el ejemplo del código en: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

He programado el 42 BT para servir como un cliente y establecerlo en modo de conexión automática (SR, 3). En mi código de Android, el BluetoothSerialService (equivalente al código de ejemplo de PhoneInfoServer) está atascado en el AcceptThread en: socket = mmServerSocket.accept (); Estoy adjuntando los siguientes fragmentos de códigos que están relacionados con el problema de conexión:

  1. Arduino código que establece el modo de conexión a automático e inicia una conexión con el teléfono Android
  2. Android BluetoothSerialService AcceptThread código que escucha la conexión entrante
  3. Logcat mensajes que muestran que el código está atascado esperando la conexión entrante

En la aplicación de demostración de BluetoothChat de Google hay una opción para que el teléfono sea detectable para que otro teléfono pueda conectarse a él. Estoy buscando algo similar para la conexión en serie del bluetooth. Busqué una aplicación en Google Play que compruebe la escucha de una solicitud de conexión entrante desde un dispositivo serie bluetooth, pero no encontré dicha aplicación. ¿Alguien sabe de una aplicación de este tipo?

Saludos, Avner

  1. Arduino código que establece el modo de conexión a automático e inicia una conexión con el teléfono Android

    void setup() { Serial.begin(115200); Serial.println("BEG setup"); static const char *initString0 = "$$$SR,04FE3144A0A4\r"; // R,1 Forces a complete reboot of the device (similar to a power cycle). static const char initString1a[] = "$$$"; static const char initString1b[] = "R,1\r"; // auto static const char initString2a[] = "$$$"; static const char initString2b[] = "SM,3\rSO,Z\r---\r"; static const char *initVector[] = { initString0, initString1a, initString1b, initString2a, initString2b, NULL }; int i; for (i=0; initVector[i] != NULL; i++) { Serial.print(initVector[i]); delay(500); } Serial.println("Setup completed"); } 
  2. Android BluetoothSerialService AcceptThread código que escucha la conexión entrante

     // ... private class AcceptThread extends Thread { // The local server socket static private final String TAG = "BluetoothSerialServiceAcceptThread"; private final BluetoothServerSocket mmServerSocket; private String mSocketType; /** Creates an thread for accepting incoming Bluetooth connections * @param secure Currently ignored, but suppose to represent the mode of socket. * All communication is currently done over insecure socket */ public AcceptThread(boolean secure) { Log.i(TAG, "BEG AcceptThread::AcceptThread"); BluetoothServerSocket tmp = null; mSocketType = secure ? "Secure":"Insecure"; // Create a new listening server socket try { Log.i(TAG, "AcceptThread constructor trying to create listening socket"); if (!secure) { // This is for Android 2.2 // tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID); // This is for Android 2.3 but testing the above on 2.3 device showed it to be working. tmp = mAdapter.listenUsingInsecureRfcommWithServiceRecord(NAME_INSECURE, BT_SPP_UUID); } Log.d(TAG, "AcceptThread: Listening BT Socket " + mSocketType + " created"); } catch (IOException e) { Log.e(TAG, "AcceptThread: Listening BT Socket Type: " + mSocketType + " listen() failed " + e.getMessage()); acceptProblem(); } mmServerSocket = tmp; Log.d(TAG, "mmServerSocket: " + mmServerSocket); } // public AcceptThread public void run() { Log.i(TAG, "BEG BluetoothSerialService::run"); if (mmServerSocket == null) { Log.e(TAG, "AcceptThread.run: No server socket"); return; } Log.d(TAG, "AcceptThread.run: socket type:" + mSocketType); setName("AcceptThread" + mSocketType); BluetoothSocket socket = null; Log.i(TAG, "mState: " + mState); // Listen to the server socket if we're not connected while (mState != STATE_CONNECTED) { Log.i(TAG, "socket before mmServerSocket.accept(): " + socket); try { // This is a blocking call and will only return on a // successful connection or an exception socket = mmServerSocket.accept(); Log.d(TAG, "AcceptThread.run: returned from accept"); } catch (IOException e) { Log.e(TAG, "AcceptThread.run: Socket Type: " + mSocketType + "accept() failed " + e.getMessage()); break; } Log.i(TAG, "socket after mmServerSocket.accept(): " + socket); //... 
  3. Logcat mensajes que muestran que el código está atascado esperando la conexión entrante

      // ... 12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): BEG AcceptThread::AcceptThread 12-09 01:04:38.765: I/BluetoothSerialServiceAcceptThread(16175): AcceptThread constructor trying to create listening socket 12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketNative 12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): ...fd 49 created (RFCOMM, lm = 0) 12-09 01:04:38.765: V/BluetoothSocket.cpp(16175): initSocketFromFdNative 12-09 01:04:38.775: D/BluetoothUtils(16175): isSocketAllowedBySecurityPolicy start : device null 12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): bindListenNative 12-09 01:04:38.775: V/BluetoothSocket.cpp(16175): ...bindListenNative(49) success 12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread: Listening BT Socket Insecure created 12-09 01:04:38.785: D/BluetoothSerialServiceAcceptThread(16175): mmServerSocket: android.bluetooth.BluetoothServerSocket@41af72c8 12-09 01:04:38.785: D/BluetoothReadService(16175): END start 12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): BEG BluetoothSerialService::run 12-09 01:04:38.795: D/BluetoothSerialServiceAcceptThread(16175): AcceptThread.run: socket type:Insecure 12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): mState: 1 12-09 01:04:38.795: I/BluetoothSerialServiceAcceptThread(16175): socket before mmServerSocket.accept(): null 12-09 01:04:38.795: V/BluetoothSocket.cpp(16175): acceptNative 12-09 01:04:38.855: I/MainActivity(16175): mBtStatus: android.widget.ImageView@41adc698 12-09 01:04:38.855: I/MainActivity(16175): In case: BluetoothSerialService.STATE_LISTEN 12-09 01:04:38.855: D/MainActivity(16175): Beg onCreateOptionsMenu 12-09 01:04:38.885: D/memalloc(16175): ion: Mapped buffer base:0x5d760000 size:3768320 offset:0 fd:57 12-09 01:04:38.925: D/CLIPBOARD(16175): Hide Clipboard dialog at Starting input: finished by someone else... ! // ... 

Además descubrí que el RN-42 BT está entrando en el modo de auto-conexión, pero trata de conectarse a otro teléfono no-Android de LG en la casa.

He descubierto esto restableciendo el RN-42 BT a los valores predeterminados de fábrica. Con la aplicación BlueTerm me conecto correctamente desde el teléfono Android al RN-42 BT. Cuando realizo una exploración de la pregunta ($$$ I \ r) consigo la dirección del mac y el nombre del teléfono de LG. Este teléfono tiene un bluetooth con una dirección MAC diferente (0026e25d8a91) – No sé qué hace que el RN-42 BT intente conectar con este dispositivo.

Esto significa que el modo de conexión automática funciona pero la conexión se dirige al teléfono incorrecto. Estoy deslumbrada porque estoy especificando la dirección MAC del teléfono Android con los siguientes comandos (con retrasos entre ellos)

 // The mac address of the android phone $$$SR,04FE3144A0A4\r // Force a complete reboot of the device (similar to a power cycle). $$$R,1\r // SM,3 - mode=auto // SO,Z - Extended Status String, Setting this string enables status messages to be sent to the local serial port. // --- - exit command mode (three minus signs). $$$SM,3\rSO,Z\r---\r 

Ahora estoy pensando que la iniciación de la conexión del RN-42 BT es aceptable pero que el BluetoothServerSocket en el código del androide no se fija correctamente.
He intentado fijar el BluetoothServerSocket para escuchar usando listenUsingInsecureRfcommWithServiceRecord y listenUsingRfcommWithServiceRecord. Observo que hay un comando createInsecureRfcommSocketToServiceRecord. ¿Debería usarlo en su lugar?

Cualquier consejo sería muy apreciado.

Gracias, Avner

Código completo e instrucciones en: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

Incluye no sólo el código, sino también la explicación de cómo funciona y la descripción de la asamblea.

Así que me di cuenta del "truco". En primer lugar, el teléfono móvil está configurado para aceptar sólo conexiones y el dispositivo incrustado que tiene alimentación de línea para conectarse automáticamente. El cambio consistía en configurar el dispositivo embebido del modo "Host" al modo "Client" con conexión automática.

El siguiente obstáculo era que el Android tuviera que tener el código Accept en un servicio de otra manera que la conexión funcionaría solamente si la aplicación fue hecha activa. Al poner la pieza de código Aceptar en un servicio, la aplicación puede ser no activa y el accesorio incrustado se conectaría automáticamente. El código será compartido en Instructable: introduzca la descripción del enlace aquí

  • Android 2.1 Detectar audio Bluetooth conectar / desconectar
  • Cómo asociar un dispositivo Bluetooth mediante programación a Android
  • Activar el perfil manos libres Bluetooth Bluetooth
  • Cómo leer datos desde el escáner de código de barras Bluetooth Symbol CS3070 to Android Device
  • Principios básicos de la implementación del bluetooth android
  • Transferencia de grandes cantidades de datos a través de bluetooth en Android Gingerbread
  • ¿Cómo obtener RSSI sin conexión al dispositivo BLE?
  • Arduino Mega recibe los datos correctos a través de la Serie 0 pero no la Serie 1-3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.