最近遇到一个需求,要求浏览器的内嵌keyboard与USB keyboard状态同步。
主要就是几个特殊的功能键,shift、alt、ctrl、caps、tab等等,借鉴了一个博客:http://www.voidcn.com/article/p-sjjkjzze-cy.html,其中提供了一段获取USB设备的代码,自己运行过后,有一定的帮助,具体的还需要深究。代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define UEVENT_BUFFER_SIZE 2048
static int init_hotplug_sock() {
const int buffersize = 1024;
int ret;
struct sockaddr_nl snl;
bzero(&snl, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
snl.nl_pid = getpid();
snl.nl_groups = 1;
int s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (s == -1) {
perror("socket");
return -1;
}
setsockopt(s, SOL_SOCKET, SO_RCVBUF, &buffersize, sizeof(buffersize));
ret = bind(s, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl));
if (ret < 0) {
perror("bind");
close(s);
return -1;
}
return s;
}
int main(int argc, char* argv[]) {
int hotplug_sock = init_hotplug_sock();
while(1) {
/* Netlink message buffer */
char buf[UEVENT_BUFFER_SIZE * 2] = {0};
recv(hotplug_sock, &buf, sizeof(buf), 0); printf("%s\n", buf);
/* USB 设备的插拔会出现字符信息,通过比较不同的信息确定特定设备的插拔,在这添加比较代码 */
}
return 0;
}
编译之后,运行的结果如下:
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:046D:C31C.0006
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input6
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input6/event1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:046D:C31C.0006/hidraw/hidraw0
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/0003:046D:C31C.0007
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/input/input7
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/input/input7/event2
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/0003:046D:C31C.0007/hidraw/hidraw1
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input6/event1
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input6
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:046D:C31C.0006/hidraw/hidraw0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:046D:C31C.0006
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/input/input7/event2
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/input/input7
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/0003:046D:C31C.0007/hidraw/hidraw1
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1/0003:046D:C31C.0007
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.1
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:03F0:1F4A.0008
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8/mouse0
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8/event1
add@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:03F0:1F4A.0008/hidraw/hidraw0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8/mouse0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8/event1
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/input/input8
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:03F0:1F4A.0008/hidraw/hidraw0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0/0003:03F0:1F4A.0008
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1/2-1:1.0
remove@/devices/platform/xxxxx-ehci-1.0/usb2/2-1
前面的add和remove是USB Keyboard的,后面是USB Mouse的,从中可以看到有Mouse的信息,其中xxxxx是平台相关定义的,打印出来,但是Keyboard插拔时,没有能够体现Keyboard的信息。
还需要继续深究,先做一个记录