Sto tentando di inviare sequenze di tasti tramite bluetooth sul mio iPhone4 da ubuntu. I.e., sviluppo di una tastiera virtuale molto primitiva.Descrittore report HID (con iPhone)
Problema Avere il mio discorso applicazione per iPhone (vale a dire utilizzando rapporto protocollo, questo è tutto iPhone supporta). Così com'è, le mie chiamate write(interruptChannelFD)
non restituiscono errori, ma non viene visualizzato alcun testo sul lato iPhone. I canali l2cap sono stati aperti usando la libreria blueZ.
Domanda 1: Dato che non esiste una tastiera virtuale che lo faccia, quanto è difficile?
Sono nella fase in cui iPhone e la mia casella linux si connettono e rimangono connessi, nessun problema. Inoltre, tutte le chiamate perror()
mi dicono che i socket del canale di controllo e di interrupt si connettono perfettamente. (Quello che faccio è hciconfig il mio dongle alla classe di dispositivo Keyboard e uso il codice noto da Collin Mulliner con una leggera modifica - Ho dovuto inserire un passcode una volta, come tutti gli smartphone richiedono).
Domanda 2: Dovrei riuscire a inserire write()
nella presa di interrupt senza preoccuparmi della crittografia, giusto? Ho inserito il codice di accesso e il telefono si fida della tastiera. (Collin stava meditando un possibile attacco HID, ma io collegare onestamente)
Inoltre, è la mia comprensione che nel protocollo di avvio di un dispositivo HID, il rapporto esatto descrittore specfied in SPD è difficilmente rilevante - formato rapporto è fisso comunque. Quindi ...
Domanda 3: mi manca qualcosa di importante sul protocollo rapporto. Quello che faccio è modificare il descrittore del report della tastiera Apple e scrivere nel socket (vedi sotto).
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
};
Dopo questo, scrivo i seguenti 10 byte nel canale di interrupt:
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, btw, è possibile immettere un PIN utilizzando BlueZ, tramite 'org.bluez.Agent'' RequestPinCode' (ad esempio, è necessario registrarsi come agente tramite 'org.bluez.Adapter'' RegisterAgent'). Inoltre, non è necessario inserire un PIN se si utilizza un dispositivo Bluetooth 2.1 (poiché consentono l'accoppiamento semplice sicuro) – Hasturkun