2010-11-24 17 views
6

He escrito una aplicación de Android que se conecta a un teclado Bluetooth. Se conecta a través de un zócalo BT al teclado y adquiere el flujo de entrada del zócalo.¿Cómo hablar con un teclado Bluetooth?

InputStream inStrm = socket.getInputStream(); 

Siguiente Intenté leer el flujo de entrada, pero dice que no hay bytes disponibles.

int nBytesAvail = inStrm.available(); // always gives me 0 

O

int dataByte = inStrm.read(); // always generates IOException 

La excepción dice: Software causó conexión para abortar

Si trato de escribir en la secuencia, me sale otra excepción: punto final de Transporte no está conectado.

Una de estas dos cosas puede estar sucediendo.

  1. Mi primer temor es que no es el protocolo HID para ser hablado con el teclado, y no va a divulgar sus secretos hasta que pronunciar el encantamiento adecuado. ¿Es eso correcto? ¿O debería ser resuelto por la pila del zócalo BT automáticamente? El flujo de socket parece ser un flujo de serie estándar, y no estoy seguro de que sea correcto.

  2. Mi segundo temor es que, dado que se trata de una Galaxy Tab, mi problema podría ser que esa parte del sistema operativo ha sido eliminada por Samsung (¿pero recibiría un flujo de entrada válido desde la conexión de socket?) . Se informa ampliamente que las versiones de EE. UU. De la pestaña simplemente no se conectan a ningún BT HID con las utilidades estándar de Android BT, aunque las transferencias de archivos BT funcionan bien.

Supongo que una tercera posibilidad es que simplemente me faltan las teclas cuando suceden. No sé cuánto buffering Java hace de los datos de BT provenientes de un HID, pero si se establece la conexión de socket, los datos deberían aparecer en la secuencia de entrada, ¿no?

Soy reacio a dedicarle mucho más tiempo a esto en caso de que vaya por el camino completamente equivocado (vea el n. ° 1), o está condenado al fracaso (vea n. ° 2).

Respuesta

4

Todos los teclados Bluetooth normales implementan el perfil HID, que requiere una conexión L2CAP. Android hasta ahora solo proporciona la capacidad de usar conexiones RFCOMM. Debería usar el Kit de desarrollo nativo y escribir su código de teclado en C para usar bluez para lograr su objetivo. Echa un vistazo a las aplicaciones que usan Nintendo WiiMote. WiiMote también implementa el perfil HID.

+0

también puede usar el código de reflejo y java, como en el ejemplo que publiqué anteriormente. – radhoo

1

Algunas tabletas Galaxy admiten el protocolo HID, otras no. Depende del operador, no de Samsung. Mi Verizon Galaxy Tab vino sin soporte HID aunque los T-Mobile lo tenían. Pero en abril de este año, Verizon (no Samsung) lanzó una actualización de firmware que incluía compatibilidad HID para que mi mouse BT teclado & comenzara a funcionar. Estoy ejecutando Android 2.2, y mi número de compilación de firmware es SCH-I800.EC02.

Creo que estás intentando hacer esto porque tu pestaña no se conecta al teclado BT en absoluto. Esto es exactamente lo que estaba tratando de hacer antes de abril. Por lo que recuerdo haber leído, se supone que la parte de conjuro mágico será manejada por Android automáticamente: cuando haces la conexión HID, Android abre una ventana de mensaje para ingresar un código en el teclado, luego la conexión de socket se devuelve a tu programa (O algo por el estilo).

Así que si no puede conseguir que la pestaña se conecte normalmente al teclado, entonces su perfil HID ha sido desactivado y (afaik) ninguna cantidad de programación lo hará funcionar, excepto tal vez una reescritura del perfil HID en Java .

Estoy seguro de que ya lo intentó, pero para probarlo vaya a Configuración> Conexiones inalámbricas y Redes> Configuración de Blutetooth, debería ver el teclado en la lista si tiene o no soporte HID. Toque la entrada del teclado, debe conectarse de inmediato. Si solo se retrasa indefinidamente o si recibe un mensaje de error, entonces no tiene soporte HID. respuesta

2

de mringwal es correcta, además del enfoque NDK, es posible utilizar la reflexión en algunos dispositivos, para lograr la conectividad L2CAP:

public static BluetoothSocket createL2CAPBluetoothSocket(String address, int psm){ 
     return createBluetoothSocket(TYPE_L2CAP, -1, false,false, address, psm); 
    } 
    // method for creating a bluetooth client socket 
    private static BluetoothSocket createBluetoothSocket(
      int type, int fd, boolean auth, boolean encrypt, String address, int port){ 
     try { 
      Constructor<BluetoothSocket> constructor = BluetoothSocket.class.getDeclaredConstructor(
        int.class, int.class,boolean.class,boolean.class,String.class, int.class); 
      constructor.setAccessible(true); 
      BluetoothSocket clientSocket = (BluetoothSocket) 
       constructor.newInstance(type,fd,auth,encrypt,address,port); 
      return clientSocket; 
     }catch (Exception e) { return null; } 
    } 

donde TYPE_L2CAP es un número entero que tiene el valor constante 3.

Tenga en cuenta que este enfoque solo funcionará en ALGUNOS dispositivos Android.

Escribir una aplicación HID no es una tarea sencilla. Debe implementar un analizador de descriptores de informes, un componente utilizado para "descubrir" las capacidades (teclas especiales, funciones) de un dispositivo HID remoto. También tendrá que aprender el flujo de protocolo HID y trabajo, una copia está disponible aquí: http://www.dawidurbanski.pl/public/download/projekty/bluepad/HID_SPEC_V10.pdf

Ya hay programas profesionales que hacen exactamente eso, HID apoyo en Android, véase, por ejemplo, este software: http://teksoftco.com/index.php?section=product&pid=24

Debido a las limitaciones de Stack, el protocolo L2CAP no está disponible en todos los dispositivos, por lo que una solución que funcione en TODOS los dispositivos es actualmente imposible.

Cuestiones relacionadas