2011-09-06 33 views
5

Estoy tratando de enviar pulsaciones de teclas a través de Bluetooth a mi iPhone4 desde ubuntu. Es decir, desarrollando un teclado virtual muy primitivo.Descriptor de informe HID (con iPhone)

Problema tener mi charla aplicación de iPhone (es decir, utilizando el protocolo informe, eso es todo compatible con iPhone). Como es, mis llamadas write(interruptChannelFD) no devuelven ningún error, pero no aparece texto en el lado del iPhone. Los canales l2cap se han abierto usando la biblioteca blueZ.

Pregunta 1: Dado que no existe un teclado virtual que lo haga, ¿qué tan difícil es?

Estoy en el escenario donde iPhone y mi linux box se conectan y permanecen conectados, no hay problema. Además, todas las llamadas a perror() me dicen que las tomas de control e interrupción de canales se conectan muy bien. (Lo que hago es hciconfig mi dongle a clase de dispositivo de teclado y uso el código conocido por Collin Mulliner con una ligera modificación - tuve que ingresar una contraseña una vez, como requieren todos los teléfonos inteligentes).

Pregunta 2: Debería ser capaz de simplemente write() en el socket de interrupción sin preocuparse por el cifrado, ¿verdad? Ingresé el código de acceso y el teléfono confía en el teclado. (Collin estaba considerando un posible ataque oculto, pero yo conectar con honestidad)

Además, es mi entendimiento de que en el protocolo de arranque de un dispositivo HID, el descriptor detalla specfied en SPD no es relevante - el formato de informe se arregla de todos modos. Entonces ...

Pregunta 3: ¿Echo de menos algo importante sobre el informe el protocolo. Lo que hago es modificar el descriptor de informe del teclado Apple y escribir en el zócalo (ver a continuación).

const uint8_t hid_spec[] = { 
    0x05, 0x01, // usage page 
    0x09, 0x06, // keyboard 
    0xa1, 0x01, // collection (Application) 
    0x85, 0x01, // report id (0x01) 
    0x05, 0x07, // usage page(keyboard) 
    0x19, 0xe0, // usage min 
    0x29, 0xe7, // usage max 
    0x15, 0x00, // logical min 
    0x25, 0x01, // logical max 
    0x75, 0x01, // report size 
    0x95, 0x08, // report count 
    0x81, 0x02, // input (dat var abs) 

    0x75, 0x08, // report size 
    0x95, 0x01, // report count 
    0x81, 0x01, // input (const) 

      // The following two outputs I don't seem to receive 
    0x75, 0x01, // report size 
    0x95, 0x05, // report count 
    0x05, 0x08, // usage page (LEDs) 
    0x19, 0x01, // usage min 
    0x29, 0x05, // usage max 
    0x91, 0x02, // OUTPUT1 (dat var abs) 

    0x75, 0x03, 
    0x95, 0x01, 
    0x91, 0x01, // OUTPUT2 (arr,const) 

    0x75, 0x08, // report size 
    0x95, 0x06, // report count 
    0x15, 0x00, // logical min 
    0x26, 0xff, 0x00 // logical max 

    0x05, 0x07 
    0x19, 0x00 
    0x2a, 0xff, 0x00, 
    0x81, 0x00, 

      // A total of 9 bits sent by now 
      // I tried remove the following fields 
      /********** BEGIN SNIP 
    0x75, 0x01, 
    0x95, 0x01, 
    0x15, 0x00, 
    0x25, 0x01, 

    0x05, 0x0c, 
    0x09, 0xb8, 
    0x81, 0x06, 


    0x09, 0xe2, 
    0x81, 0x06, 


    0x09, 0xe9, 
    0x81, 0x02, 
    0x09, 0xea, 
    0x81, 0x02, 
    0x75, 0x01, 
    0x95, 0x04, 
    0x81, 0x01, 
      **** END SNIP/ 

    0xc0   // end coll 

};

Después de esto, escribo los siguientes 10 bytes en el canal de interrupción:

    pkg[0] = 0xa1; // BT HDR (DATA) 
        pkg[1] = 0x01; // REPORT ID 0x1 == kbd 
        pkg[2] = modifiers; // Ctrl, Shift, etc 
        pkg[3] = 0x00; // constant 0 (see descr) 
        // pkg[4] = 0x00; // the key code - entered before this point, according to HID usage tables. 
        pkg[5] = 0x00; 
        pkg[6] = 0x00; 
        pkg[7] = 0x00; 
        pkg[8] = 0x00; 
        pkg[9] = 0x00; 

        if (write(is, pkg, 10) <= 0) { 
         perror("write"); 
         exit(-1); 
        } 

Respuesta

2

Buenos días, señor.

Déjeme amablemente señalar a usted a un timewaster vacaciones humilde mío que realmente es capaz de ser utilizado con un pedazo de basura llamado iPad, cuya pila de software deben ser razonables cerca del iPhone de los suyos: https://github.com/lkundrak/virtkbd

Aparte de la implementación real, intentaré responder a sus preguntas.

Pregunta 1:

Teniendo en cuenta la calidad y la duración de la especificación de perfil HID de Bluetooth, USB HID uno y los útiles específicos de dispositivos disponibles y reales, supongo ensayo y error le llevará más lejos. Tenga un teclado Bluetooth real y escriba un repetidor y volcador de protocolo simple para que pueda observar lo que hacen: consulte la documentación para descifrar lo que está sucediendo.

Pregunta 2:

derecho. Para mi iPad, primero necesito emparejar los dispositivos con mi computadora no como perteneciente a una clase de teclado (mi suposición es que el iPad, de lo contrario, intentará ingresar un PIN, lo que no se puede hacer con Bluez). Luego tengo que cambiar la clase a Teclado (ejecutando mi programa bithdd) y forzar iPad para volver a conectar, para que agarre el descriptor de protocolo de SDP e intente conectarse a los puertos L2CAP 17 y 19.

Pregunta 3:

Sí, es más o menos así, no creo que te pierdas nada importante.

¡Que tengas un buen día!

+1

+1, por cierto, es posible ingresar un PIN usando BlueZ, a través de 'org.bluez.Agent'' RequestPinCode' (es decir, debe registrarse como agente a través de 'org.bluez.Adapter'' RegisterAgent') Tampoco debería tener que ingresar un PIN si está usando un dispositivo Bluetooth 2.1 (ya que permite el emparejamiento seguro simple) – Hasturkun