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.
- Proguard no puede encontrar la clase referenciada com.google.ads.internal.state.AdState
- El proveedor de red genera 2 copias de una ubicación
- Android Análisis de señal y algunos filtros
- ¿Qué versión de Apache HTTP Client está incluida en Android 1.6?
- ¿Qué es exactamente getGlobalVisibleRect ()?
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.
- ¿Cómo animar setVisibility para un imagebutton en Android?
- Mejor manera de manejar eventos en Android
- Cómo consultar el valor de la columna que se establece como puntero a otra tabla en Parse
- Necesito ayuda para seleccionar la versión correcta de jdk para mi 64bit Windows 7
- Prueba de objetos JSON nulos en Java / Android
- Reserva de almacenamiento interno del dispositivo Android para futuros registros críticos de aplicaciones
- Doble toque -> Zoom en Android MapView?
- Google App Engine Java HTTP Publicar imagen desde el método API a Servlet
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 .
- InflateException con FloatingActionButton de la biblioteca de diseño oficial
- Orden de envío de la cola de mensajes de Thread de interfaz de usuario de Android