2012-09-18 28 views
7

Bien aquí está el trato. Tengo dos teléfonos Galaxy Nexus con Bluetooth habilitado.Android Bluetooth IOException: conexión rechazada

He escrito una aplicación de administración de conexión bluetooth que uso para descubrimiento de dispositivos y conectividad. También emite todos los UUID disponibles que los dispositivos pueden admitir.

Buscando desde http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm los siguientes UUID estándar están expuestos desde dispositivos Galaxy Nexus.

  • 0x1116 - NAP
  • 0x112f - PBAP (acceso al directorio telefónico Perfil)
  • 0x111f - HFP (manos libres)
  • 0x1105 - OPP (Object Push Profile)
  • 0x1112 - HSP (Headset Profile)
  • 0x110c - AVRCP
  • 0x110a - A2DP

Estoy intentando conectarme a través del perfil OPP (UUID 00001105-0000-1000-8000-00805F9B34FB) y empujar objetos (archivos) entre los dispositivos. He recorrido toda la Android API documentation sobre cómo descubrir, vincular/vincular (enhebrar etc.) y administrar todas las conexiones bluetooth. Logré conectarme exitosamente y hablar con un dispositivo de placa heredado a través del perfil SPP (0x1101).

Sin embargo, cuando trato de usar socket.connect() entre los dos teléfonos galaxy nexus, aparece el cuadro de diálogo de emparejamiento y hago clic en el botón Pair en ambos dispositivos. Después de eso, inmediatamente obtengo un Connection Refused IOException. Tenga en cuenta que, una vez que se ha producido el emparejamiento, nunca se me vuelve a preguntar cuál tiene sentido, ya que el enlace seguro está en la memoria caché.

Si no puedo conectarme a estos perfiles estándar utilizando estos UUID estándar ¿por qué están expuestos? ¿Cómo puedo conectarme desde mi aplicación a cualquiera de estos perfiles e interactuar con ellos? ¿Es porque mi aplicación no es de alguna manera confiable? Lo que es extraño es que incluso la funcionalidad Share en Android tampoco funciona. ¿Esto está completamente roto en Android?

Por favor, evite darme pistas para usar el "UUID SPP conocido 0x1101" como dicen los documentos. Esto no es lo que quiero. Tengo una comprensión bastante buena de cómo funciona esto y estoy buscando una solución real o una explicación del problema.

He visto la típica solución de "reflexión" pero no entiendo por qué sigue siendo un problema en Android? ¿Por qué la gente usa la reflexión para hacer que esto funcione? ¿Podemos presentar un error en Android para arreglar esto?

Si esos UUID son estándar, cualquier aplicación debería ser capaz de conectarse e interactuar con ellos. ¿Por qué es esto un problema y por qué recibo esta excepción?

Gracias de antemano.

ACTUALIZACIÓN

Así que por alguna razón la carga de objetos en el sistema Android comenzó a trabajar. De hecho, intenté conectarme a través de mi aplicación y no funcionaba. Luego, fui a la aplicación Contactos e intenté compartir un contacto que funcionó mágicamente. Luego, volví a mi aplicación y ahora funciona ... wow. Eso es muy extraño y debe haber una explicación para esto.

+0

¿configura los permisos correctos? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@Lars Por supuesto que sí. dnkoutso: ¿Cómo estás abriendo exactamente el zócalo? ¿Podría intentar volver a emparejar, es decir, desvincular y volver a vincular? Por cierto, ¿es de 2 niveles? – nullpotent

+0

@icethedral, ¿qué quieres decir con 2 niveles? A menudo voy a la aplicación de configuración real en ambos dispositivos y elimino el emparejamiento. Una vez que llamo a 'socket.connect()' otra vez, me aparece el cuadro de diálogo de emparejamiento y el número de clave de paso ingresado. Desafortunadamente, justo después de obtener la IOException "Conexión rechazada". – dnkoutso

Respuesta

2

¿Ha intentado utilizar un perfil no estándar? es decir, un UUID personalizado solo para su aplicación. Esto también lo ayudará a saber que su (probablemente) solo se está conectando a su propia aplicación en lugar de a otra aplicación registrada con el mismo perfil.

Desde mi experiencia, el emparejamiento de Bluetooth es muy defectuoso para el primer intento de par. Sin embargo, usar un UUID personalizado ayuda de alguna manera.

El método de reflexión (creo) fue originalmente un intento de corregir un error con un dispositivo específico, sin embargo, creo que algunas personas encontraron el éxito en su uso en otros lugares también. El dispositivo se llamaba Spica o algo similar.

Como también se publicó uno de los comentarios, también intenté conectarme nuevamente después de fallar.

Básicamente escriba el código que planea fallar el primer intento, pero luego el código intenta conectarse de nuevo en 5 segundos si hubo una falla.

Estas son soluciones imperfectas, pero la implementación de Bluetooth en Android también es imperfecta (en mi humilde opinión). Esperamos que ayuda

EDITAR

Sobre la base de la actualización de preguntas y comentarios:

estoy de acuerdo es definitivamente algo con errores. Parte del problema, creo, es que los controladores de BT varían y cada uno tiene una pila de BT diferente con diferentes peculiaridades. También encontré una pregunta que utiliza tanto el método de reflexión Y personalizado UUID, Y otros métodos estándar. Esto me parece extremo, pero cubre la mayor parte del terreno. Desafortunadamente, como desarrolladores de aplicaciones no tenemos control sobre la pila/código/controladores de bajo nivel.

He encontrado con mis dos aplicaciones de uso compartido de Bluetooth que el primer emparejamiento siempre es engañoso.

Me alegra saber que no soy solo yo.

+1

He logrado establecer una conexión con mi propio UUID personalizado. Simplemente no entiendo cómo estos UUID STANDARD de Bluetooth públicamente no funcionan. Tampoco están trabajando en el sistema normal de "Compartir" en Android, que también es una pista de que hay algo defectuoso en el código de Android. – dnkoutso

+0

Estoy de acuerdo en que algo definitivamente tiene errores. Parte del problema, creo, es que los controladores de BT varían y cada uno tiene una pila de BT diferente con diferentes peculiaridades. También encontré una pregunta que utiliza tanto el método de reflexión Y personalizado, como otros métodos estándar. Esto me parece extremo, pero cubre la mayor parte del terreno. Desafortunadamente, como desarrolladores de aplicaciones no tenemos control sobre la pila/código/controladores de bajo nivel. – pjco

4

Me encontré con este mismo problema y logré encontrar una solución que funcionó para mí.

En mi caso, utilizo tres dispositivos de prueba diferentes (Nexus 5, Galaxy S4, Note 2) y por alguna razón, la Nota 2 no se conectaría a mi módulo Bluetooth pero los otros dos sí lo harían.

El razonamiento que he encontrado es que los controladores de Bluetooth varían, y se necesitan métodos de conexión ligeramente diferentes para crear una conexión entre diferentes dispositivos.

Los tres métodos que uso se llaman 'Seguro', 'Inseguro' y 'Método de reflexión'/'hax'.

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

En mi caso, el Modo seguro trabajaron tanto para el Nexus 5 y Galaxy S4 sin embargo, no funcionó de la Nota 2.

Después de algunas pruebas descubrí la Nota 2 sólo funciona usando ' Modo inseguro, así que para atender esto, básicamente intento una conexión y paso por los diferentes modos si es necesario. Cuando intento un modo de conexión diferente, simplemente solicito 'reintentar la conexión'. Entonces, si la conexión falla usando secure, entonces intentaré usar Insecure y luego usaré el método de reflexión.

No me he encontrado con el caso donde uno de estos tres métodos no funcionó.

Cuestiones relacionadas