Я пытаюсь отправлять нажатий клавиш через Bluetooth на мой iPhone4 из Ubuntu. I.e., Развивая очень примитивную виртуальную клавиатуру.
Проблема У моего приложения разговаривают с iPhone (то есть с использованием протокола отчета , это все поддерживает iPhone). Как оно, мой пишет (прерывает знания)
вызовы возвращают ошибки, но
На стороне iPhone нет текста. Каналы L2CAP были открыты с использованием библиотеки Bluez.
Вопрос 1: Учитывая, что никакая виртуальная клавиатура не существует, что это делает, только то, насколько усердно это?
Я на сцене, где iPhone и My Linux Connect Connect и остаются на связи, без проблем.
Кроме того, все Perroor ()
вызовы говорят мне, что сокеты канала управления и прерывания подключаются только хорошо. (Что я делаю, это HCiconfig Мой ключ к классному классу клавиатуры и использовать
Хорошо известный код Collin Mulliner с небольшим модификацией - мне пришлось вводить пароль один раз, поскольку все смартфоны требуют).
Вопрос 2: Я должен уметь просто Написать ()
в сокет прерывания, не беспокоясь о шифровании, верно? Я вошел в PassCode, и телефон доверяет клавиатуре. (Коллин размышлял о возможной скрытной атаке, но я связываю честно)
Кроме того, мое понимание того, что в загрузочном протоколе 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);
}