El descubrimiento de servicio falló la excepción utilizando Bluetooth en Android

Actualmente estoy trabajando en una aplicación de Android que se conecta a un instrumento a través de Bluetooth y necesito escribir comandos de cadena y recibir respuestas de cadena de nuevo. Actualmente tengo la conexión / lectura / escritura trabajando para TCP / IP a través de Wi-Fi y ahora tratando de implementar Bluetooth. Pero me encuentro con algunos obstáculos. He estado buscando en la web tratando de encontrar ejemplos de algo similar y no han tenido ninguna suerte. He estado usando el ejemplo de recurso de desarrollador de Android: Bluetooth Chat como mi principal punto de referencia.

Mi código actual parece funcionar .. A continuación, lanza una excepción Service Discovery Failed en el punto de la conexión. Estoy usando la clase DeviceListActivity para hacer el descubrimiento y la selección del dispositivo al que quiero conectarme. Devuelve unActivityResult y luego mi clase de Bluetooth espera que se encargue de eso y luego hace la conexión a él. El código de abajo es casi idéntico a la aplicación de chat Bluetooth.

 public void onActivityResult(int requestCode, int resultCode, Intent data) { if(!m_BluetoothAdapter.isEnabled()) { m_BluetoothAdapter.enable(); } switch (requestCode) { case REQUEST_CONNECT_DEVICE: // When DeviceListActivity returns with a device to connect if (resultCode == Activity.RESULT_OK) { // Get the device MAC address String address = data.getExtras() .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); // Get the BLuetoothDevice object BluetoothDevice device = m_BluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device connect(device); } break; case REQUEST_ENABLE_BT: // When the request to enable Bluetooth returns if (resultCode == Activity.RESULT_OK) { // Bluetooth is now enabled, so set up a chat session } else { // User did not enable Bluetooth or an error occured Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_SHORT).show(); finish(); } } } 

Esta es mi función de conexión:

 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); private void connect(BluetoothDevice device) { m_Device = device; BluetoothSocket tmp = null; // Get a BluetoothSocket for a connection with the // given BluetoothDevice try { tmp = device.createRfcommSocketToServiceRecord(MY_UUID); } catch (IOException e) { } m_Socket = tmp; m_BluetoothAdapter.cancelDiscovery(); try { // This is a blocking call and will only return on a // successful connection or an exception m_Socket.connect(); } catch (IOException e) { try { m_Socket.close(); } catch (IOException e2) { } return; } } 

Con suerte, lo que estoy haciendo mal es simple, pero me temo que nunca es tan fácil. Esta es la primera vez que hago cualquier desarrollo de Bluetooth, y tal vez estoy haciendo algo descaradamente equivocado … Pero no estoy seguro de por qué obtener el servicio de descubrimiento falló la excepción.

Puede emparejar / encontrar el dispositivo en todo momento manualmente en el teléfono … Requiere un código de acceso, pero no creo que sea el problema que estoy teniendo.

Después de tres días me dieron cuenta gracias a algunos puestos muy útiles.

Tuve que reemplazar:

 tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 

con:

 Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); tmp = (BluetoothSocket) m.invoke(device, 1); 

Y voilà funciona!

A partir de la API 15 puede utilizar el siguiente método:

Intenta reemplazar tu UUID con el valor devuelto del método getUuids () de BluetoothDevice clase BluetoothDevice . Lo que funcionó para mí fue algo como esto:

 UUID uuid = bluetoothDevice.getUuids()[0].getUuid(); BluetoothSocket socket = bluetoothDevice.createRfcommSocketToServiceRecord(uuid); 

La razón por la que esto funciona es que los diferentes dispositivos admiten diferentes UUIDs y al obtener los UUID del dispositivo usando getUuids , está soportando todas las características y dispositivos.

Otro método nuevo interesante (apoyado desde la API 14) es este: BluetoothHealth.getConnectionState . No lo he probado pero parece prometedor …

Se trataba de una edición sugerida de un usuario anónimo que intentaba responder a la respuesta aceptada.

Una gran diferencia entre su código anterior y posterior es el UUID que está pasando. He encontrado mi respuesta aquí: http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord(java.util DID)

Tuve que reemplazar:

 tmp = device.createRfcommSocketToServiceRecord(MY_UUID); 

con:

 private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); tmp = device.createRfcommSocketToServiceRecord(SPP_UUID); 

Y voila funciona! El código original es para una aplicación peer to peer android. No tiene sentido usar el UUID de la aplicación cuando se conecta a un dispositivo bluetooth serie simple. Es por eso que el descubrimiento fracasa.

Por lo que como se mencionó anteriormente, el punto es que usted necesita para utilizar el UUID que el servidor está esperando.

Si se está conectando a un dispositivo bluetooth, como un auricular o un ratón, debe comprobar qué UUIDs está escuchando el dispositivo. Puede ver los UUID como este.

 UUID[] uuids = bluetoothDevice.getUuids(); 

Y si quieres saber qué significan estos UUIDs, mira esto .

  • ¿Qué es Matrix.frustumM (mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7); en OpenGL ES 20?
  • !!! JUnit versión 3.8 o posterior esperado
  • La aplicación de Android se bloquea con NullPointerException en ChoreoGrapher
  • Android Java; ¿Cómo puedo analizar un archivo JSON local de carpeta de activos en un ListView
  • Ampliación de ArrayAdapter en android
  • Depurar el proyecto de la biblioteca de Android con el código fuente de java
  • Cómo crear un número variable de vistas de texto en android
  • JUnit - ComparisonFailure en la cadena formateada
  • Herramienta de análisis de código fuente estático de código abierto (orientada a la seguridad) para Java
  • Cómo ofuscar con ProGuard pero mantener los nombres legibles durante la prueba?
  • La mejor manera de implementar Client <-> Server <-> Arquitectura de bases de datos en una aplicación de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.