Conexión Bluetooth RFCOMM / SDP a un adaptador RS232 en android

Estoy tratando de usar la aplicación de API de muestra de chat de Bluetooth que google proporciona para conectarse a un adaptador RS232 bluetooth conectado a otro dispositivo. Aquí está la aplicación para referencia:

Http://developer.android.com/resources/samples/BluetoothChat/index.html

Y aquí está la hoja de especificaciones para el conector RS232 sólo para referencia:

Http://serialio.com/download/Docs/BlueSnap-guide-4.77_Commands.pdf

Bueno, el problema es que cuando voy a conectar al dispositivo con:

mmSocket.connect(); (BluetoothSocket::connect()) 

Siempre obtengo un error IOException lanzado por el método connect() . Cuando hago un toString en la excepción consigo "descubrimiento del servicio fallado". Mi pregunta es sobre todo cuáles son los casos que harían que una IOException se lanzó en el método de conexión? Sé que están en la fuente en algún lugar, pero no sé exactamente cómo la capa de java que escribir aplicaciones y la capa C / C ++ que contiene la interfaz de pilas real. Sé que utiliza la pila bluez bluetooth que está escrito en C / C + +, pero no estoy seguro de cómo los vínculos en la capa de java que es lo que yo creo que es lanzar la excepción. Cualquier ayuda en señalarme a donde puedo tratar de diseccionar este problema sería increíble.

También sólo para notar que soy capaz de emparejar con el adaptador RS232 muy bien, pero nunca soy capaz de conectar realmente. Aquí está la salida logcat para más referencia:

 I / ActivityManager (1018): Actividad mostrada com.example.android.BluetoothChat / .DeviceListActivity: 326 ms (total 326 ms)
 E / BluetoothService.cpp (1018): stopDiscoveryNative: error de D-Bus en StopDiscovery: org.bluez.Error.Failed (sesión de descubrimiento no válida)
 D / BluetoothChat (1729): onActivityResult -1
 D / BluetoothChatService (1729): conectarse a: 00: 06: 66: 03: 0C: 51
 D / BluetoothChatService (1729): setState () STATE_LISTEN -> STATE_CONNECTING
 E / BluetoothChat (1729): + EN RESUMEN +
 I / BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_CONNECTING
 I / BluetoothChatService (1729): COMIENZO mConnectThread
 E / BluetoothService.cpp (1018): stopDiscoveryNative: error de D-Bus en StopDiscovery: org.bluez.Error.Failed (sesión de descubrimiento no válida)
 E / BluetoothEventLoop.cpp (1018): event_filter: Recibido señal org.bluez.Device: PropertyChanged desde / org / bluez / 1498 / hci0 / dev_00_06_66_03_0C_51
 I / BluetoothChatService (1729): FALLA DE CONEXION TOSTRING: java.io.IOException: Error en la detección de servicio
 D / BluetoothChatService (1729): setState () STATE_CONNECTING -> STATE_LISTEN
 D / BluetoothChatService (1729): inicio
 D / BluetoothChatService (1729): setState () STATE_LISTEN -> STATE_LISTEN
 I / BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
 V / BluetoothEventRedirector (1080): Recibido android.bleutooth.device.actionIDID
 I / NotificationService (1018): enqueueToast pkg = com.example.android.BluetoothChat callback=android.app.ITransientNotification$Stub$Proxy@446327c8 duration = 0
 I / BluetoothChat (1729): MESSAGE_STATE_CHANGE: STATE_LISTEN
 E / BluetoothEventLoop.cpp (1018): event_filter: Recibido señal org.bluez.Device: PropertyChanged desde / org / bluez / 1498 / hci0 / dev_00_06_66_03_0C_51
 V / BluetoothEventRedirector (1080): Recibido android.bleutooth.device.actionIDID

El dispositivo con el que estoy intentando conectarse es el 00:06:66:03:0C:51 que puedo escanear y aparentemente se sincroniza con.


La siguiente se fusiona de una pregunta similar que fue resuelta con éxito por la respuesta seleccionada aquí:

¿Cómo se puede conectar un dispositivo rfcomm que no sea otro en Android?

La API de Android proporciona ejemplos de uso de listenUsingRfcommWithServiceRecord () para configurar un socket y createRfcommSocketToServiceRecord () para conectarse a ese socket.

Estoy tratando de conectarme a un dispositivo incrustado con un chip BlueSMiRF Gold . Mi código Python de trabajo (usando la librería PyBluez ), que me gustaría portar a Android, es el siguiente:

 sock = bluetooth.BluetoothSocket(proto=bluetooth.RFCOMM) sock.connect((device_addr, 1)) return sock.makefile() 

… por lo que el servicio de conexión a se define simplemente como el canal 1, sin ninguna búsqueda SDP.

Como el único mecanismo documentado que veo en la API de Android SDP de búsqueda de un UUID, estoy un poco en una pérdida. El uso de "sdptool browse" de mi host Linux aparece vacío, por lo que supongo que el chip en cuestión simplemente carece de soporte SDP.

5 Solutions collect form web for “Conexión Bluetooth RFCOMM / SDP a un adaptador RS232 en android”

Ok la respuesta corta es que tuve que usar este UUID para conectarme a mi dispositivo SPP:

 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 

Traté de cambiarlo ya que pensé que sólo la parte "1101" era importante ya que veo que se mencionó con SPP cosas por todo el lugar en el intertubes pero que lo hizo no conectar de nuevo. Al parecer, ese UUID específico es lo que se supone que se utiliza para conectarse a dispositivos genéricos SPP. De todos modos solo pensé que lo publicaría aquí para que alguien que este tipo de problema tiene una respuesta. Me llevó unos 3 días para encontrarlo LOL!

Supongo que está relacionado con un error de teléfonos sony-ericsson ( ver aquí ).

Pude conectar de / a un dispositivo androide 2.0 y mi mac que usa bluetooth y un UUID totalmente hecho-para arriba. Tratando de hacer lo mismo con un dispositivo j2me (un sony ericsson w910i) estaba funcionando sólo si el androide era el servidor, de lo contrario recibo la misma excepción que usted.

El UUID que está utilizando, hasta donde yo sé, es una "dirección base" para el perfil spp, y en el campo ServiceClassIDList del ServiceRecord devuelto por el dispositivo servidor al emitir un descubrimiento de servicio, debe estar listado DESPUÉS del UUID que usted Decidido utilizar .. aparentemente esto no es el caso en algunas situaciones (eg mi teléfono primero enumeró el UUID genérico y entonces mi UUID de encargo).

Parece que es la misma situación aquí. Puede intentar cambiar manualmente el ServiceRecord y devolver el ServiceClassIDList adecuado. Tal vez va a trabajar para usted .. desafortunadamente, mi estúpido teléfono celular se niegan a cambiarlo 🙁

PD. Una cosa extraña es que mi mac es realmente capaz de ver el servicio, incluso si el ServiceRecord está "roto", supongo que android sólo se molestan en ver el primer UUID en el ServiceClassIDList, mientras que mi pc ir a través de la lista de búsqueda de todos los elementos. Pero esto es sólo mi suposición 🙂

La velocidad en baudios que establezca debe coincidir con el dispositivo al que está conectado. Tienen el valor predeterminado 115200 o cambian a 9600 pero si necesitas otro (1200 en mi caso para un instrumento de encuesta) debes configurarlo mediante hyperterminal * y un cable de módem nulo.

* Aunque los documentos para el dispositivo bluesnap sugieren usar hyperterminal hay problemas con él. Después de algunas llamadas a bluesnap, sugirieron:

Primero, cuando conecte el dispositivo a un PC, intente volver a poner los ajustes de los puentes en sus posiciones originales usando 115200 8, N, 1 y X apagados. Cuando DTE habilitado, no se puede establecer una conexión de terminal sin el uso de software especial diseñado específicamente para conexiones DTR / DTE.

En segundo lugar, HyperTerminal ha conocido problemas con BlueSnap. Yo recomendaría intentar TeraTerm o PuTTY.

Me llevó 4 días para encontrar esto!

¿Qué velocidad de transmisión tiene su dispositivo bluetooth puesto en? Estoy conectado, pero mis datos están apareciendo como el típico garbling mush que obtiene con velocidades de transmisión mixtas. Tengo el mío fijado a 57600, esto es lo que he visto que la gente utiliza. Oh, gracias por publicar sus resultados el UUID me hizo trabajar durante unos días también.

Si 'sdptool browse' no informa sobre el dispositivo intenta 'sdptool records [device-mac-here]'

  • Android detectar Bluetooth desconectar inmediatamente Máximo 2 segundos
  • Aplicación de congelación de socket Android Bluetooth
  • Recibir audio vía Bluetooth en Android
  • IOS a Android Bluetooth RFCOMM
  • Error de transmisión de datos mediante SPP sobre Bluetooth en Android
  • Android: conexión a varios dispositivos bluetooth sin emparejamiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.