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);
}
+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