Android bluetooth SDP no reconoce el servicio anunciado en JAVAME

Estoy desarrollando una aplicación bluetooth para mi MSc. Fin del proyecto. Incluye un servidor implementado en JAVA ME, y un cliente escrito en Android.

El problema es que Android SDP parece fallar al reconocer el ServiceRecord de mi servidor JAVA ME.

Si utilizo los métodos BluetoothDevice.getUuids() y BluetoothDevice.fetchUuidsWithSdp() en mi cliente, devuelven un conjunto de UUID, pero el UUID de mi servicio no está en ninguno de ellos, por lo que no puedo conectarme a él.

Este es el código para el ejemplo del servidor JAVAME:

 /*IMPORTS*/ public class StackOverFlowServer extends MIDlet { Display mDisplay; Form mForm; LocalDevice local; StreamConnectionNotifier server; ServiceRecord sr; String conURL; StreamConnection conn; public StackOverFlowServer() { mDisplay = Display.getDisplay(this); mDisplay.setCurrent(mForm); mForm = new Form(null); conURL = "btspp://localhost:68EE141812D211D78EED00B0D03D76EC;" + "authenticate=false;encrypt=false;name=MySampleApp"; } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { try { local = LocalDevice.getLocalDevice(); } catch (BluetoothStateException e) { // Error handling code here } /* * When creating a StreamConnectionNotifier a service record * will automatically be created for us, describing the new * service. The service will have the Serial Port (0x1101) * value in the ServiceClassIDList (id 0x0001) attribute. The * service record will also have both the L2CAP (0x0100) and * RFCOMM (0x0003) values in the ProtocolDescriptorList (id * 0x0004) attribute. Other mandatory attributes will be set * automatically by the JABWT implementation. The optional * ServiceName (id 0x100) attribute will be set to the name * parameter, "BTDemoApp" in this case. */ try { server = (StreamConnectionNotifier) Connector.open(conURL); } catch (IOException e1) { // Error handling code here } /* * The automatically created service record can be obtained * from the LocalDevice object, using the reference to the * StreamConnectionNotifier. */ try { sr = local.getRecord(server); } catch (IllegalArgumentException iae){ // Error handling code here } /* * We create a new DataElement and set its content correctly. */ DataElement elm = null; /* * Setting public browse root in the browsegrouplist * attribute. The BrowseGroupList (id 0x0005) attribute * contains a DataElement sequence, which in turn contains * DataElements with UUIDs. The DataElement sequence must be * created before we can add DataElements to it. */ elm = new DataElement(DataElement.DATSEQ); elm.addElement(new DataElement( DataElement.UUID,new UUID(0x1002))); /* * The DataElement is now prepared. It must be added to the * appropriate attribute ID, in this case the * BrowseGroupList. */ sr.setAttributeValue(0x0005,elm); /* * Finally, the service record must be updated in our * LocalDevice. */ try { local.updateRecord(sr); } catch (ServiceRegistrationException e3) { // Error handling code here } try { conn = server.acceptAndOpen(); } catch (ServiceRegistrationException sre){ // Error handling code here } catch (IOException e2) { // Error handling code here } /* * At this point a client is connected. input and output * streams can be obtained from the conn object, * communication can begin. */ } 

}

Y esto es parte del cliente de Android:

 package com.exampleproyect.stackoverflowclient; import java.lang.reflect.InvocationTargetException; import java.util.UUID; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.ParcelUuid; import android.os.Parcelable; public class StackOverFlowClientActivity extends Activity { BluetoothAdapter mBluetoothAdapter; BluetoothDevice C702; BroadcastReceiver mReceiver; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); C702 = mBluetoothAdapter.getRemoteDevice("00:23:F1:27:16:DA"); C702.fetchUuidsWithSdp(); mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_UUID.equals(action)){ Parcelable[] uuidExtra = intent.getParcelableArrayExtra("android.bluetooth.device.extra.UUID"); /*uuidExtra should contain my service's UUID among his files, but it doesn't!!*/ } } }; // Register the BroadcastReceiver IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_UUID); registerReceiver(mReceiver, filter1); // Don't forget to unregister during onDestroy } 

}

Lo que más me molesta, es que mi computadora puede ver mi servidor JAVAME correctamente anunciado: Introduzca aquí la descripción de la imagen

¿¿Qué estoy haciendo mal?? 🙁 ¿Por qué el bluetooth de mi PC puede ver mi servicio correctamente anunciado en JAVAME pero Android no puede? ¿Puede Android conectarse vía bluetooth a servidores JAVAME?

He leído toneladas de otras preguntas similares aquí en StackOverFlow, pero no he sido capaz de llegar a una solución de trabajo. 🙁

Estoy usando un Sony Ericsson C702 (Java Platform 8) como servidor de pruebas. Y un Samsung Galaxy S (ICS 4.0.3, Equipo ICSSGS RC4.2)


EDIT1

DE ACUERDO.

Sé cuál es el problema.

Quiero que el servidor JAVAME para anunciar mi servicio con UUID (por ejemplo): "68EE1418-12D2-11D7-8EED-00B0D03D76EC", pero parece que el código:

  conURL = "btspp://localhost:68EE141812D211D78EED00B0D03D76EC;" + "authenticate=false;encrypt=false;name=MySampleApp"; server = (StreamConnectionNotifier) Connector.open(conURL); 

Agrega el UUID de servicio de puerto serie predeterminado "00001101-0000-1000-8000-00805F9B34FB" como un atributo ServiceClassIDList:

Introduzca aquí la descripción de la imagen

Ahora, lo curioso es que el método Android BluetoothDevice.fetchUuidsWithSdp (); Parece buscar el valor predeterminado "00001101-0000-1000-8000-00805F9B34FB" UUID, en lugar de mi "68EE1418-12D2-11D7-8EED-00B0D03D76EC" UUID, superponiendo mi servicio con el servicio de puerto serie predeterminado del teléfono móvil.

Algo similar Medieval Bluetooth Network Scanner, reconoce mi servicio, pero se anuncia como "00001101-0000-1000-8000-00805F9B34FB":

Introduzca aquí la descripción de la imagen

¿Qué puedo hacer para eliminar ese UUID adicional que JAVAME agrega automáticamente a mi servicio?

Por favor ayuda, gracias!

EDIT2

Ok, el problema viene con los teléfonos Sony Ericcson. Al parecer, insertan UUID de puerto serie estándar {0x1101} delante de mi UUID personalizado, mientras que los teléfonos Samsung y Nokia, por ejemplo, insertan este UUID estándar detrás del mío en el registro de servicio. Android parece buscar sólo el primer valor del atributo 0x001 en el registro de servicio, por lo tanto, confunde mi servicio con el puerto serie predeterminado que viene con algunos dispositivos.

Así que la solución será:

¿Hay algún modo con la API de Android actual para obtener más atributos de servicerecord aparte de ServiceClassID (0x001)?

o

¿Hay alguna manera de actualizar el registro de servicio almacenado en la base de datos de descubrimiento de servicio (SDDB) después de que se haya llamado "acceptAndOpen" -JAVAME-? -He utilizado LocalDevice.updateRecord después de que el servicio se ha creado en el SDDB, funciona en el emulador, pero da una excepción y no hace nada en dispositivos reales-.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.