2012-05-24 17 views
5

Quiero conectar mi teléfono Android (2.3.6 Samsung Note) a un dispositivo Bluetooth incrustado (módulo RN-42 BT UART en Arduino). Comencé con el ejemplo de BluetoothChat y conecté el dispositivo incrustado con el teléfono. Hasta ahora, todo parece funcionar bien, los dispositivos se conectan y los datos pasan de Android a dispositivos integrados. Lo que todavía me falta es hacer que los dispositivos se conecten automáticamente una vez que los dos estén dentro del alcance.Conexión automática a dispositivos Bluetooth emparejados en Android

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

Respuesta

0

Así que descubrí el "truco". Primero, el teléfono móvil está configurado para Aceptar conexiones y el dispositivo integrado que tiene alimentación de línea para conectarse automáticamente. El cambio fue configurar el dispositivo integrado desde el modo "Host" al modo "Cliente" con conexión automática.

El siguiente obstáculo fue que Android tenía que tener el código de aceptación en un servicio, de lo contrario, la conexión solo funcionaría si la aplicación se activaba. Al poner la pieza de código Aceptar en un servicio, la aplicación puede ser no activa y el accesorio integrado se conectará automáticamente. Código será compartida en Instructable: enter link description here

+0

No olvide que puede aceptar su propia respuesta. –

+0

Entonces, por ejemplo, ¿sabe cómo puedo hacer para conectarme a mi dispositivo Bluetooth más cercano con solo activar Bluetooth manualmente? –

3

I tienen una configuración similar (Android Galaxy S3 teléfono 4,0 y RN-42 BT conectado con Arduino Uno) soy capaz de emparejar el Android y el bluetooth y para 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. que siguieron a los innstructions y el ejemplo de código: http://www.instructables.com/id/Missed-calls-and-SMS-Notifier-Accessory/

programé el 42 BT para servir como un cliente y selecciona Auto modo de conexión (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 trozos de códigos que están relacionadas con el problema de conexión:

  1. código de Arduino que establece el modo de conexión al automóvil e inicia una conexión con el teléfono Android
  2. código
  3. Android BluetoothSerialService AcceptThread que escucha entrante conexión
  4. mensajes logCat que muestran que el código se ha quedado atascado en espera de conexión entrante

En la aplicación de demostración BluetoothChat de Google hay una opción para hacer que el teléfono sea visible para que otro teléfono se pueda conectar a él. Estoy buscando algo similar para la conexión en serie bluetooth. Busqué una aplicación en Google Play que probará escuchar una solicitud de conexión entrante desde un dispositivo serie bluetooth, pero no encontré esa aplicación. ¿Alguien sabe de una aplicación como esta?

Saludos, Avner

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

    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 que escucha conexiones entrantes

    // ... 
        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. mensajes LogCat que muestran que el código se ha quedado atascado en espera de 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: [email protected] 
    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: [email protected] 
    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... ! 
    // ... 
    

he descubierto además que la RN-42 BT es entrar en el modo de conexión automática sino que trata de conectarse a otro LG no androide teléfono en la casa.

Descubrí esto restableciendo el RN-42 BT a los valores predeterminados de fábrica. Al utilizar la aplicación BlueTerm, me conecto con éxito desde el teléfono Android al RN-42 BT. Cuando realizo un análisis de consulta ($$$ I \ r) obtengo la dirección MAC y el nombre del teléfono LG. Este teléfono tiene un bluetooth con una dirección MAC diferente (0026e25d8a91) - No sé qué causa que el RN-42 BT intente conectarse con este dispositivo.

Esto significa que el modo de autoconexión funciona, pero la conexión se dirige al teléfono incorrecto. estoy Pazzled porque estoy especificando la dirección MAC del teléfono Android usando 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 conexión de la RN-42 BT es Ok pero que el BluetoothServerSocket en el código de Android no está configurado correctamente.
He intentado configurar el BluetoothServerSocket para escuchar utilizando listenUsingInsecureRfcommWithServiceRecord y listenUsingRfcommWithServiceRecord. Noté que hay un comando createInsecureRfcommSocketToServiceRecord. ¿Debería usarlo en su lugar?

Cualquier consejo sería muy apreciado.

Gracias, Avner

+0

Esta es información útil, pero no parece ser una respuesta – KarlM

+0

La aplicación PhoneInfo en Android tiene la opción de mostrar la dirección MAC de BT. Solo para estar seguro, compruébalo. Además, noté que NO hiciste el comando C en la terminal con el módulo BT. Por favor, inténtalo. Por lo que recuerdo, el código funciona en comunicación no segura de todos modos (en el lado de Android) – zmashiah

+0

Encontré una solución para el problema del teléfono Android (Galaxy S3 4.0.3) que no puede actuar como un servidor para la conexión automática . Agregué una opción para que el teléfono Android actúe como cliente e inicie RfcommSocket inseguro en el RN-42 BT. Reemplazando createRfcommSocketToServiceRecord con createInsecureRfcommSocketToServiceRecord resulta en una conexión exitosa. La luz RN-42 BT se ilumina en verde y el dispositivo se comunica, sin tener que ingresar la contraseña (1234). – Avi

Cuestiones relacionadas