java - programacion - La excepción de detección de servicio falló utilizando Bluetooth en Android
manual de programacion android pdf (5)
Esta fue una edición sugerida de un usuario anónimo que intentaba responder a la respuesta aceptada.
Una gran diferencia entre su código de antes y después es el UUID que está pasando. Encontré mi respuesta aquí: http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord(java.util.UUID)
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 de Android punto a punto. No tiene sentido utilizar el UUID de la aplicación cuando se conecta a un dispositivo Bluetooth de serie simple. Es por eso que el descubrimiento falla.
Actualmente estoy trabajando en una aplicación de Android que se conecta a un instrumento a través de Bluetooth y necesita escribir comandos de cadena y recibir respuestas de cadena. Actualmente tengo el trabajo de conexión / lectura / escritura para TCP / IP a través de Wi-Fi y ahora intento implementar Bluetooth. Pero estoy tropezando con algunos obstáculos. He estado buscando en la web tratando de encontrar ejemplos de algo similar y no he tenido suerte. He estado usando el ejemplo de recursos de desarrollador de Android: Bluetooth Chat como mi principal punto de referencia.
Parece que mi código actual funciona. Luego lanza una excepción de detección de servicio fallido en el punto de la conexión. Estoy usando la clase DeviceListActivity
para hacer el descubrimiento y la selección del dispositivo al que deseo conectarme. Devuelve anActivityResult y luego mi clase Bluetooth espera que lo maneje y luego se conecta. El código debajo es casi idéntico a la aplicación Bluetooth Chat.
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;
}
}
Afortunadamente, lo que sea que esté haciendo mal es simple, pero me temo que nunca es tan fácil. Esta es la primera vez que hago un desarrollo de Bluetooth, y tal vez estoy haciendo algo descaradamente mal ... Pero no estoy seguro de por qué recibo la excepción de descubrimiento de servicio fallido.
Puede emparejar / buscar el dispositivo en todo momento manualmente en el teléfono ... Requiere una contraseña, pero no creo que ese sea el problema que estoy teniendo.
A partir de la API 15, puede usar el siguiente método:
Intente reemplazar su UUID con el valor de retorno 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 porque diferentes dispositivos admiten diferentes UUID y al obtener los UUID del dispositivo que usan getUuids usted admite todas las características y dispositivos.
Otro nuevo método interesante (compatible desde API 14) es este: BluetoothHealth.getConnectionState . No lo he probado pero parece prometedor ...
Como se mencionó anteriormente, el punto es que necesita usar el UUID que el servidor está esperando.
Si se está conectando a un dispositivo bluetooth, como un auricular o un mouse, debe verificar qué UUID está escuchando el dispositivo. Puedes ver los UUID así.
UUID[] uuids = bluetoothDevice.getUuids();
Y si quiere saber qué significan estos UUID, vea this .
Después de tres días lo entendí gracias a algunas publicaciones 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!
Esta es una pregunta muy antigua, pero descubrí que el uso de createInsecureRfcommSocketToServiceRecord()
lugar de createRfcommSocketToServiceRecord()
junto con getUuids()
mencionado anteriormente me funciona
UUID uuid = bluetoothDevice.getUuids()[0].getUuid();
BluetoothSocket socket = bluetoothDevice.createInsecureRfcommSocketToServiceRecord(uuid);