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!
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
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
@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