7

Tengo problemas para conectar dos dispositivos Android a través de Bluetooth, lo que ocurre solo cuando se han emparejado anteriormente. Estoy ejecutando uno como el servidor y el otro como el cliente.Android Bluetooth accept()/connect() con dispositivos ya emparejados

Aquí es la secuencia de las cosas en el lado del servidor:

  1. Comprobar diversos estados de Bluetooth (adaptador disponible, está habilitada, etc).
  2. llame a listenUsingRfcommWithServiceRecord() con un UUID predefinido que yo elija.
  3. solicitud para hacer el dispositivo detectable
  4. ya que ser detectable ocurre de forma asíncrona, llamo accept() y espero una conexión entrante.

En el lado del cliente:

  1. Verificar diversos estados de Bluetooth (adaptador disponible, está habilitado, etc).
  2. para cada dispositivo en getBondedDevices(), comparo getName() con el nombre del servidor. Si hay una coincidencia, salte al paso 6.
  3. Inicie el descubrimiento de BT
  4. Para cada dispositivo descubierto (tenga en cuenta que los dispositivos emparejados de 2a no aparecen aquí), compare el nombre del dispositivo con el nombre del servidor. Si hay una coincidencia, vaya al paso 6.
  5. Cancelar descubrimiento
  6. En el dispositivo que se encontró a partir del paso 2, llame createRfcommSocketToServiceRecord() con el mismo UUID predefinido que se utilizó en el lado servidor.
  7. Llamar connect() y esperar a que devuelva un socket conectado.

El proceso anterior funciona perfectamente bien para mí cuando el cliente y el servidor nunca se han emparejado antes. Sin embargo, después de que Android los haya registrado en la lista de dispositivos, inevitablemente agotarán el tiempo de espera en la etapa connect()/accept().

He estado buscando una solución para un par de días y he intentado unas cuantas cosas incluyendo éste: Connecting to a already paired Bluetooth device

método La reflexión no funciona para mí tampoco. Parece que connect() volvería de inmediato, pero cuando intenté getOutputStream() recibí una excepción. En el lado de aceptar(), ni siquiera registra que alguien intentó conectarse. Necesito ayuda o puntero para que los dispositivos establezcan una conexión una vez que se hayan emparejado.

Aquí hay alguna información acerca de los dispositivos:

  • estoy probando el servidor y el cliente en dos teléfonos LG G2X.
  • Ambos se ejecutan en Android 2.3.3, que corresponde al nivel de API 10.
  • Nuevamente, lo anterior funciona después de desvincular manualmente los dispositivos en la configuración.

Gracias de antemano. Tengo aproximadamente 2 semanas de edad en Android y Bluetooth, por lo que si ve algún paso o mejores prácticas que faltan, indíquelos también.

Respuesta

6

En el cliente cuando intento hacer una conexión a un dispositivo enlazado, simplemente lo llamé al dispositivo Bluetooth que encontré en BluetoothAdapter.getBondedDevices(). Esto no funciona.

Con el fin de establecer correctamente la conexión Bluetooth, que tenía que hacer algo similar al pseudocódigo a continuación:

BluetoothDevice bonded = a device from BluetoothAdapter.getBondedDevices(); 
BluetoothDevice actual = BluetoothAdapter.getRemoteDevice(bonded.getAddress()); 

BluetoothSocket socket = actual.createRfcommSocketToServiceRecord(SOME_UUID); 
socket.connect(); 

llegué esta respuesta siguiendo exactamente el Bluetooth de chat ejemplo: Bluetooth Chat Service. Por qué no funciona en el dispositivo desde getBondedDevices() me supera. Tal vez alguien con un conocimiento más íntimo de Android pueda responder eso.

+0

getRemoteDevice no es un método estático, la forma en la que está llamando que – raja

+1

Siempre (casi?) Que desee utilizar BluetoothAdapter.getDefaultAdapter() como su BluetoothAdapter. Lo anterior es solo un pseudocódigo, por lo que no puedes simplemente copiar y pegar. –

+0

Gran publicación, esto en realidad tiene sentido porque el dispositivo es una referencia y estará obsoleto. El adaptador siempre estará actualizado. – Cookster

0
private static BluetoothSocket mSocket; 
BluetoothDevice selectDevice = null; 

void connectDevice(){ 
    if(mSocket == null) { 
     //Log.d(TAG, "Socket is null"); 
     UUID SPP_UUID = UUID 
       .fromString("8ce255c0-200a-11e0-ac64-0800200c9a66"); 
     Set<BluetoothDevice> bondedDevices = BluetoothAdapter 
       .getDefaultAdapter().getBondedDevices(); 
     //Log.d(TAG, "Size: " + bondedDevices.size()); 
     /** 
     * Select your divice form paired devices 
     */ 
     for (BluetoothDevice bluetoothDevice : bondedDevices) { 
      selectDevice = bluetoothDevice; 
      //Log.d(TAG, bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()); 
     } 

     if(selectDevice.getBondState() == selectDevice.BOND_BONDED) { 
      //Log.d(TAG, selectDevice.getName()); 
      try { 
       mSocket = selectDevice.createInsecureRfcommSocketToServiceRecord(SPP_UUID); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       //Log.d(TAG, "socket not created"); 
       e1.printStackTrace(); 
      } 
      try { 
       mSocket.connect(); 
      } catch (IOException e) { 
       try { 
        mSocket.close(); 
        //Log.d(TAG, "Cannot connect"); 
       } catch (IOException e1) { 
        //Log.d(TAG, "Socket not closed"); 
        e1.printStackTrace(); 
       } 
      } 
    } 
Cuestiones relacionadas