我想通过蓝牙发送击键从我的iPhone4从Ubuntu。 即开发一个非常原始的虚拟键盘。HID报告描述符(与iPhone)
问题有我的应用程序的谈话到iPhone(即使用报告协议,这是所有iPhone支持)。实际上,我的write(interruptChannelFD)
调用不会返回错误,但 iPhone侧不会显示任何文本。 l2cap通道已经使用blueZ库打开。
问题1:鉴于没有虚拟键盘存在,它有多难?
我在iPhone和我的Linux机器连接并保持连接的阶段,没问题。 此外,所有perror()
调用都告诉我,控制和中断通道套接字连接正常。 (我所做的是将我的加密狗连接到键盘设备类,并使用 Collin Mulliner的着名代码稍作修改 - 我必须输入密码一次,因为所有智能手机都需要)。
问题2:我应该可以只将write()
插入中断套接字而不用担心加密吧?我输入了密码,手机信任键盘。 (科林琢磨可能HID攻击,但我连诚实)
而且,我的理解是在HID设备,确切的报告 描述 在SPD specfied的引导协议是没有什么关系 - 报表格式无论如何都是固定的。所以...
问题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,顺便说一句,可以通过'org.bluez.Agent'' RequestPinCode'使用BlueZ输入一个PIN码(也就是说,您需要通过'org.bluez.Adapter'' RegisterAgent'注册为代理商。 )。如果您使用的是2.1蓝牙设备,则不必输入PIN码(因为那些设备允许安全简单配对) – Hasturkun