¿Cómo crear un socket RFCOMM de Android sin ninguna entrada del usuario?
bluetooth jni (2)
La API de Android Bluetooth no está finalizada, y cambiará. Úselo bajo su propio riesgo. Esta clase implementa una API para la capa Bluetooth RFCOMM. Un socket RFCOMM es similar a un socket normal en que toma una dirección y un número de puerto. La diferencia es, por supuesto, que la dirección es una dirección de dispositivo Bluetooth, y el número de puerto es un canal RFCOMM. La API permite el establecimiento de sockets de escucha a través de métodos de enlace, escucha y aceptación, así como para la realización de conexiones salientes con connect, connectAsync y waitForAsyncConnect. Después de construir un socket, necesita crearlo y luego destruirlo cuando haya terminado de usarlo. Ambos crean y aceptan devolver un FileDescriptor para los datos reales. Alternativamente, puede llamar a getInputStream y getOutputStream para recuperar las respectivas transmisiones sin pasar por FileDescriptor.
Aquí está el escenario:
Necesito escribir una aplicación para Android para crear un socket RFCOMM en una PC con un dongle Bluetooth (también escribiré el servidor).
Mi requisito es que el usuario no tenga que vincular el dispositivo manualmente.
En realidad, con un gran truco, estoy usando createInsecureRfcommSocket .
Un pequeño escenario : tengo una aplicación de Android que intercambia información con una caja de Linux con un socket RFCOMM abierto. Puedo establecer manualmente el PIN en los dispositivos (la codificación dura ES una opción)
Estoy buscando diferentes caminos:
Escribir un contenedor JNI
Como ha hecho Max Kellermann aquí , puedo escribir una capa JNI para hacer toda la fase de emparejamiento. Esta debería ser una buena opción, pero hay un problema:
El NDK 4b no proporciona bibliotecas libbluetooth, por lo que -lbluetooth falla, así como el NDK v.3.
Opciones:
- Encuentra el NDK 1.5 (que incluye lib bluetooth). Después de días de búsqueda en la web no he podido averiguarlo. ¿Alguien tiene o sabe dónde puedo encontrarlo?
- Compila libbluetooth para Android solo y utilízalos para -lbluetooth. No hay suerte allí, no soy capaz de construirlos. ¿Alguna pista?
Usa algo expuesto por las API
¿ Alguien sabe cómo puedo usar createRfcommSocketToServiceRecord y hacer que el usuario no empareje el dispositivo manualmente? ¿Es posible? ¿Cómo debo escribir el servidor?
Algo que no sé
Tal vez (¡seguro!) Hay algo que no sé. Tal vez puedo usar algo más? ¿No es RFCOMM? ¿PARTIDO SOCIALDEMÓCRATA?
Tal vez puedo emparejar manualmente con la API de Android?
Espero haber sido lo suficientemente claro, si no solo pregunto. Y de nuevo, como no es la primera vez, estoy en tus manos :)
¡Gracias por todo el apoyo chicos!
Al final, puedo decir que no puedes .
Incluso si encuentra una forma, usando wrappers, escribiendo módulos C, etc., la evolución de Android probablemente cambie la cosa que está usando.
Y entonces, no hay opción. Tristemente.
Veamos cómo cambiará la API de Android Bluetooth en el futuro.