HID报告描述符(带iPhone)

时间:2011-09-06 02:44:57

标签: iphone bluetooth usb hid usb-descriptor

我正试图通过蓝牙将键盘从ubuntu发送到我的iPhone4。 即,开发一个非常原始的虚拟键盘。

问题让我的应用与iPhone通话(即使用报告协议,这是所有iPhone支持的)。实际上,我的write(interruptChannelFD)调用没有返回错误,但是 iPhone端没有文字出现。 l2cap通道已使用blueZ库打开。

问题1:鉴于没有虚拟键盘可以做到这一点,它有多难?

我正处于iPhone和我的linux盒连接并保持连接的阶段,没问题。 此外,所有perror()调用都告诉我控制和中断通道套接字连接正常。 (我所做的是hciconfig我的加密狗到键盘设备类,并使用 Collin Mulliner的着名代码略有修改 - 我必须输入一次密码,因为所有智能手机都需要。)

问题2:我应该能够write()进入中断套接字而不必担心加密,对吧?我输入了密码,手机信任键盘。 (Collin正在考虑可能的隐藏攻击,但我诚实地联系)

另外,据我所知,在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);
                    }

1 个答案:

答案 0 :(得分:3)

美好的一天,先生。

让我友好地指出,我的一个谦虚的假期时间,实际上可以与一块名为iPad的垃圾一起使用,其软件堆栈应该合理贴近您的iPhone:https://github.com/lkundrak/virtkbd

除了实际的实施,我会尝试回答你的问题。

问题1:

鉴于蓝牙HID配置文件规格的质量和长度,USB HID和可用的工具以及实际的设备细节,我想试验和错误将带您进一步。有一个真正的蓝牙键盘,并编写一个简单的协议转发器和转储器,让你观察他们做了什么 - 参考文档来解密正在发生的事情。

问题2:

右。对于我的iPad,我首先需要将设备与我的计算机配对而不是属于键盘类(我的猜测是iPad否则会尝试让我输入PIN,这是Bluez无法完成的) 。然后我需要将类更改为键盘(通过运行我的bithdd程序)并强制iPad重新连接,以便它从SDP获取协议描述符并尝试连接到L2CAP端口17和19.

问题3:

是的,它几乎就是这样 - 我认为你不会错过任何重要的事情。

度过美好的一天!