Я пытаюсь отправить нажатия клавиш через Bluetooth на мой iPhone4 из Ubuntu.Т.е. разработка очень примитивной виртуальной клавиатуры.
Проблема Попросите мое приложение общаться с iPhone (т. Е. Используя протокол отчетов , это все, что поддерживает iPhone).На самом деле, мои write(interruptChannelFD)
звонки не возвращают никаких ошибок, но на стороне iPhone нет текста.Каналы l2cap были открыты с использованием библиотеки blueZ.
Вопрос 1: Учитывая, что не существует виртуальной клавиатуры, которая делает это, насколько она сложна?
Я вэтап, на котором iPhone и мой linux box соединяются и остаются на связи, нет проблем.Кроме того, все вызовы perror()
говорят мне, что сокеты канала управления и прерывания подключаются очень хорошо.(Что я делаю, так это hciconfig мой ключ к классу устройств Keyboard и использую известный код Collin Mulliner с небольшими изменениями - мне пришлось ввести пароль один раз, как того требуют все смартфоны).
Вопрос 2: Я должен быть в состоянии просто write()
в сокет прерывания, не беспокоясь о шифровании, верно?Я ввел код доступа, и телефон доверяет клавиатуре.(Коллин размышлял о возможной скрытой атаке, но я честно подключаюсь)
Кроме того, я понимаю, что в протоколе загрузки устройства HID точный дескриптор отчета, указанный в SPD, вряд ли уместен - формат отчетаисправлено в любом случае.Итак ...
Вопрос 3: Я пропускаю что-то важное в протоколе отчета .Я изменяю дескриптор отчета клавиатуры Apple и записываю его в сокет (см. Ниже).
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
};
После этого я записываю следующие 10 байтов в канал прерывания.:
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);
}