дескриптор отчета HID (с iPhone)

Я пытаюсь отправлять нажатий клавиш через 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);
                    }

6
задан Alexis King 27 January 2015 в 19:05
поделиться