2010-06-18 31 views
6

Estoy desarrollando una aplicación que usa Bluetooth para conectarse a un dispositivo y enviar/recibir datos. Estoy haciendo todas mis pruebas con un teléfono Nexus One.Android Bluetooth - No se puede conectar

Nunca he podido establecer una conexión SPP (puerto serie) desde mi teléfono a ningún dispositivo. Sin embargo, I tengo conectado desde un dispositivo (mi computadora portátil) a mi teléfono usando un Mac equivalente a PuTTY (La única excepción a esto es la aplicación "Bluetooth File Transfer" del Marketplace parece funcionar, pero yo no No creo que use RFCOM/SPP ...).

sigo viendo este mensaje en los registros de mi LogCat:

ERROR/BluetoothService.cpp(78): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session) 

, así como los siguientes:

java.io.IOException: Operation Canceled 
java.io.IOException: Software caused connection abort 

He intentado usar el UUID de "00001101-0000-1000 -8000-00805F9B34FB "y también he intentado utilizar el:

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

método en lugar de device.createRfcommSocketToServiceRecord(UUID); también - sin suerte.

estoy usando el BluetoothChat example y variaciones de ese código para hacer todas mis pruebas ...

soluciones o sugerencias sería grande ... o incluso un mejor ejemplo/menos complejo de algún código de prueba que pueda ejecutar en el teléfono, o un script de python o algo que puedo ejecutar en mi computadora para ayudar a depurar?

Gracias! Espero que esto no sea un error con el sistema operativo Android, pero si es así, espero encontrar una solución.


EDITAR: También debo tener en cuenta que la mayoría de los dispositivos aparecen como "emparejados, pero no conectados" en la configuración de Bluetooth.


EDIT 2: La solución parece ser simplemente deshabilitar cualquier escucha Bluetooth. Ver mi mensaje de respuesta para más información.

+1

Otros temas destacables relacionados con este tema: 1) http://stackoverflow.com/questions/2268365/android-bluetooth-cross-platform-interoperability 2) http://stackoverflow.com/questions/ 2661932 3) http://groups.google.com/group/android-developers/browse_thread/thread/348c269f2ef88327/ 4) http://stackoverflow.com/questions/2660968/how-to-prevent-android -bluetooth-rfcomm-connection-from-dying-immediately-after 5) http://stackoverflow.com/questions/1953888/bluetooth-rfcomm-sdp-connection-to-a-rs232-adapter-in-android – idolize

+0

usaste la reflexión con intención o ¿por coincidencia? La razón por la que pregunto es, me pregunto si la usaste como una forma de evitar un error en particular en la implementación de Bluetooth. Por lo general, creo que uno podría haber usado 'BluetoothSocket bs = createRfCommSocket (...' ¡Gracias! –

+0

@Brad - Fue intencional, porque he visto a varias personas en línea tener problemas con createRfcommSocketToServiceRecord que solo se resolvieron mediante el uso de esta solución inusual Ver: http://stackoverflow.com/questions/2660968/how-to-prevent-android-bluetooth-rfcomm-connection-from-dying-immediately- after --and-- http://stackoverflow.com/questions/2661932/problem-with-bluetooth-on-android-2-1-samsung-spica-i5700-where-emparejamiento-works-b – idolize

Respuesta

7

La solución, como resultado, fue desactivar la funcionalidad del servidor del servicio Bluetooth. Utilizando solo createRfcommSocketToServiceRecord y nunca llamando al listenUsingRfcommWithServiceRecord (en el ejemplo de BluetoothChat esto significa que nunca se debe iniciar el "AcceptThread"), se solucionó el problema.

Aunque se supone que estas dos llamadas están totalmente separadas y no tienen efecto entre sí (de acuerdo con los documentos de Android), simplemente comentando listenUsingRfcommWithServiceRecord solucionó mi problema supuestamente no relacionado.

Puedo tomar el programa de Bluetooth Chat sin editar y no podrá establecer una conexión saliente con NINGÚN dispositivo bluetooth que haya probado (computadoras portátiles, computadoras de escritorio, auriculares, etc.), pero si elimino eso, funciona sin problemas como un cliente.

De todos modos, espero que esto ayude a alguien más si se encuentran con el mismo problema. Esto debe ser un error con el sistema operativo Android, o posiblemente el firmware en el Nexus One.

+0

Esto NO funcionó para mí. – daker

+0

Lo mismo aquí, no funcionó. Usar el mismo ejemplo y la pestaña Nexus S + Galaxy – Deko

+0

Desactivar la escucha de conexiones no hace que funcione para mí. ¿Cómo funcionaría eso? ... Aparece este problema de vez en cuando, pero hacer que no inicie el hilo de aceptación hace que no funcione. – RyanCheu

1

Ignoraría el error stopDiscovery - es bueno que canceles el descubrimiento antes de hacer la conexión. Por la documentación del SDK:

Debido descubrimiento es un peso pesado precedure para el adaptador de Bluetooth, este método debe siempre ser llamado antes de intentar conectarse a un dispositivo remoto con connect(). El descubrimiento no es administrado por el actividad, pero se ejecuta como un sistema servicio, por lo que una aplicación debe llamar siempre a cancelar descubrimiento incluso si no solicitó directamente un descubrimiento , sólo para estar seguro.

Entonces, dicho esto, ¿fue posible que el ejemplo de Bluetooth Chat funcione antes de realizar modificaciones al código?

El UUID que desea para SPP/RFCOMM es:

static UUID UUID_RFCOMM_GENERIC = new UUID(0x0000110100001000L,0x800000805F9B34FBL); 

o definido de otra manera (tanto lograr la misma cosa).

static final UUID UUID_RFCOMM_GENERIC = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
+0

Gracias, pero en realidad ya estoy usando el UUID que me proporcionó. Estaba capaz de hacer funcionar la aplicación Bluetooth Chat, pero solo si me conecto desde mi dispositivo (computadora) al teléfono, y no al revés. Si trato de conectarme desde el teléfono a la computadora (desde adentro el menú de la aplicación) lo intentará durante unos segundos, luego tostará un error como "Error de conexión" o algo así. – idolize

+0

¿Ha agregado explícitamente un servicio RFCOMM en su computadora? De lo contrario, la computadora no tiene ninguna razón para responder a las solicitudes de RFCOMM. Del mismo modo que su computadora no respondería a solicitudes de FTP a menos que haya instalado un servidor FTP y abierto el puerto 21. –

+0

Estoy confundido: ¿está tratando de hacer que el chat bluetooth funcione entre dos teléfonos o entre el teléfono y la PC? Creo que solo lo primero tiene sentido, pero puede que no entienda tu objetivo final. ¿Puedes aclarar? –

Cuestiones relacionadas