2011-08-02 8 views
9

He estado buscando en Internet y no he visto nada en el camino de cómo implementar exactamente el emparejamiento OOB. Esperaba que alguien aquí pudiera indicarme algún código de ejemplo para ayudarme. El ejemplo de chat en el sitio de desarrolladores de Android realmente no se zambulló en este tipo de paring.Emparejamiento Bluetooth "fuera de banda" (OOB) en Android?

Básicamente, tengo una tableta Android que quiero emparejar de forma segura con un dispositivo, escrito en C++, que no tiene un mecanismo de visualización/IO integrado. La tableta que se emparejará actuará como la interfaz GUI/IO y enviaré un mensaje de vuelta y un cuarto a través de Bluetooth. Por lo tanto, quiero vincular de forma segura la tableta con cada dispositivo a través del esquema de paridad OOB.

Entiendo el concepto de OOB, pero tengo dificultades para encontrar los métodos adecuados para llamar cuando busco en el sitio android.developers.com mi código de cliente de Android. También cuando miro las cosas bluez no puedo encontrar mucho para continuar para mi servidor escrito en C++.

El caso de uso básico es que el usuario conectará la tableta al dispositivo a través de una conexión USB. La conexión USB facilitará el paso de claves/direcciones MAC para cada dispositivo y luego usar ese par de información bluetooth entre sí.

Puedo averiguar la parte del USB pero una vez que tengo las claves y la información necesaria sobre el cliente y el servidor parece que no puedo rastrear los métodos correctos para llamar a ambos extremos para emparejar con seguridad y seguridad.

Ya tengo un cliente/servidor hablando a través de una conexión insegura, así que realmente la única parte con la que estoy teniendo problemas es el emparejamiento en ambos extremos. Como una vez que estoy emparejado, puedo usar un secureRFComm para hacer todos mis futuros mensajes.

¡Gracias a todos los que puedan ayudar!

Respuesta

2

Aún no hay API públicas en androind para permitir el emparejamiento OOB. Es posible si puede o está dispuesto a modificar la pila BlueZ subyacente para exponer los ganchos de parchado OOB a la aplicación. (Tarea no trivial)

¿Qué mecanismo OOB está pensando utilizar? NFC?

+0

Gracias por la respuesta Dennis. La forma en que imagino que se produce el apretón de manos es que el usuario conectará la tableta al dispositivo a través de una conexión USB. La conexión USB facilitará el paso de llaves/direcciones mac para cada dispositivo.Al tener la dirección MAC de cada dispositivo, debería poder vincular el bluetooth entre ellos pragmáticamente con las teclas correctas. Esto parece ser de lo que se trata el emparejamiento OOB. Este es un trabajo personalizado y no una aplicación planificada para el mercado de Android. Entonces, si esta no es la forma correcta de manejar este tipo de emparejamiento, entonces estoy abierto a sugerencias de diseño. – Brian

+0

Busco la documentación de Android un poco más y encuentro algunos métodos enumerados como @hide que parecen útiles. Uno de esos métodos es "createBondOutofBand". ¿Es esto algo que puedo llamar a través de la reflexión o hay cambios en la pila BlueZ necesarios? Además, todavía no estoy seguro de cómo manejar esto en el servidor que es el que no es de Android. Por manejo me refiero a los métodos que necesito llamar a BlueZ que permitan al servidor emparejar OOB. ¡Gracias por cualquier ayuda! – Brian

+0

@Brian: el emparejamiento OOB requiere un valor Hash y Aleatorizador de cada uno de los HCI Bluetooth (también puede realizar autenticación unidireccional si solo un lado puede enviar datos, pero este no es el caso aquí). Supongo que obtendrá sus valores del lado de Android utilizando ['readOutOfBandData'] (http://www.androidjavadoc.com/2.3/android/bluetooth/BluetoothAdapter.html#readOutOfBandData%28%29), pero no lo hago. Desarrollar para Android, por lo que no puede verificar nada. – Hasturkun

10

Tengo mi problema 95% resuelto pero he golpeado un pequeño bloque de carreteras. Primero actualizaré esta publicación con una respuesta más concreta a la pregunta original y publicaré mi pregunta al final.

Para recapitular, mi tarea es usar el emparejamiento fuera de banda (oob) para vincular de forma segura una tableta Android con Honeycomb 3.2 a una placa beagle a través de USB. No puedo publicar un código específico, pero le daré todos los pasos necesarios para hacerlo.

En el tablero beagle, tengo la pila bluez 4.96 instalada con el plugin dbusoob instalado. Para confirmar que está configurado correctamente, instale 2 dongles Bluetooth en la placa beagle y ejecute el código de prueba OOB que se encuentra en el archivo bluez en la carpeta de prueba. Esta es una secuencia de comandos python. La secuencia de comandos debe emparejar con éxito los 2 dongles Bluetooth, si no, probablemente bluez no esté configurado correctamente.

Para obtener comunicaciones USB con una tableta funcionando, debe instalar mtpfs y mtp-tools. Estos se usan para montar tu tableta. La manera en que resolví obtener información OOB entre los 2 dispositivos fue para montar la tableta en el tablero de beagle. Una vez montada, la tableta y el tablero de beagle pueden escribir un archivo con la información necesaria.

En el lado de Android, OOB no es compatible con la API pública, por lo que las cosas se ponen difíciles. Creo que esto se debe a que Honeycomb 3.2 no tiene una pila de bluez que oficialmente admite la vinculación OOB, pero Google tiene algún tipo de implementación codificada.Creo que esto porque si miras el código fuente de Gingerbread para las clases de Adaptador Bluetooth y Dispositivo Bluetooth puedes ver los métodos OOB disponibles pero no expuestos a través de la API documentada.

Estos métodos siguen siendo públicos, por lo que puede llamarlos a través de la reflexión. Usando la reflexión también puede obtener todas las firmas de métodos en una clase. Así es como descubrí los métodos que tenía disponibles para mí.

Tenga en cuenta que muchos no están documentados y no es obvio lo que algunos hacen. Los más importantes a tener en cuenta son el readOutOfBandData() en la clase de adaptador y setDeviceOutOfandData() en la clase de dispositivo.

Otro problema con el que te puedes topar es cuando escribes tus datos oob en un archivo en la tableta para ser leído por el tablero beagle. Dado que android utiliza mtp, debe indexar su archivo una vez que se haya escrito en el almacenamiento interno de la tarjeta sd. Para resolver esto, necesita hacer uso de la clase MediaScannerConnection y el método scanFile().

Esperemos que lo anterior ayude a cualquier otra persona con este mismo problema.

Ahora a mi pregunta. Tengo mi aplicación de Android funcionando muy bien y mi código de placa de beagle es el ejemplo de testOOB actualizado para que un extremo lea información de OOB de un archivo. Ahora el problema que veo es que cuando se ejecutan todos se ven bien, pero en la tableta aún recibo un mensaje preguntándome si quiero sincronizarme con el dispositivo xyz. No hay llaves o números. Solo pregunta "Pair with Device XYZ" o algo así.

Si presiono "par", todo está emparejado desde el punto de vista de las tabletas, PERO la secuencia de comandos de python devuelve que la parición falló. La secuencia de comandos de python en el tablero beagle está llamando al método real para realizar la vinculación entre los dispositivos. Incluso cuando tengo el Android iniciar la llamada createBond, veo el mismo resultado. Puedo garantizar que he establecido los datos OOB necesarios en ambos extremos antes de intentar emparejar en ambos casos para que no parezca ser así.

Así que mis problemas que estoy esperando que alguien me puede ayudar con son:

1) ¿Por qué me aparece un mensaje en el androide si los datos fuera de banda se intercambia correctamente? ¿Hay otra llamada que me falta y en qué final?

2) ¿Por qué el parche de retorno de la secuencia de comandos de python de la placa beagle falló incluso cuando presioné la ventana emergente de "par" que se muestra en la tableta. El monitor de tableta y blues muestra los dispositivos como emparejados. De nuevo, algunos me inclino a la idea de que me falta algo.

Gracias a las personas que puedan ayudar :)

EDIT:

Para añadir más información aquí está la salida Logcat:

D/UIBluetooth(4363): !!!!!! Start Bond !!!!!! 
D/BluetoothService(1703): Setting out of band data for: 00:02:76:24:C2:8F:[-37, -1, 65, -42, -121, -75, -60, -4, -47, -86, -88, 14, 64, 83, 16, 96]:[-112, 34, 121, -97, 15, -54, -83, - 
93, 104, -83, -124, -25, 89, 114, 66, 62] 
D/BluetoothBondState(1703): 00:02:76:24:C2:8F bond state 10 -> 11 (0) 
D/UIBluetooth(4363): createOobBond Successful 
V/BluetoothEventManager(2174): Received android.bluetooth.device.action.BOND_STATE_CHANGED 
D/BluetoothEventLoop(1703): Property Changed: Devices : 1 
D/BluetoothEventLoop(1703): Device property changed: 00:02:76:24:C2:8F property: Connected value: true 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 
I/BluetoothEventLoop.cpp(1703): agent_event_filter: Received method org.bluez.Agent:RequestOobData 

Los dos última línea parece estar desencadenando la ventana emergente en Android para emparejar/cancelar con el dispositivo en caso de preguntas. Me gustaría que Android supiera solo enlaces automáticos y ni siquiera preguntar. Podría estar perdiendo una llamada o haciendo algo fuera de servicio por lo que sé. Lo último que hago en mi código es crear el vínculo que parece ser el lugar obvio para hacerlo ...

¡Gracias por cualquier sugerencia!

+2

¿Serías capaz de publicar tu fuente en alguna parte? He estado trabajando en algo muy similar a esto, pero no he llegado muy lejos. –

+0

sí, puede publicar su fuente – shreyashirday

+0

Hola, ¿se le ocurrió una solución a este problema? Creo que muchas personas están luchando con esto. – ymerdrengene

Cuestiones relacionadas