Linux模拟输入设备
开启虚拟输入设备...
内核需要配置 Input support -> User level driver for input devices
/dev/uinput 是 Linux 内核中的一个设备驱动,它允许用户空间程序创建和操作虚拟输入设备。通过 /dev/uinput,可以模拟键盘、鼠标等输入设备的事件。这通常用于测试或自动化脚本,以模拟用户输入。
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <unistd.h>int main() {int fd;struct uinput_user_dev uidev;struct input_event ev;/* 打开 uinput 设备 */fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);if (fd < 0) {perror("Error opening /dev/uinput");return 1;}/* 配置虚拟设备 */memset(&uidev, 0, sizeof(uidev));strncpy(uidev.name, "Virtual Keyboard", UINPUT_MAX_NAME_SIZE);uidev.id.bustype = BUS_USB;uidev.id.vendor = 0x1234;uidev.id.product = 0x5678;uidev.id.version = 1;/* 写入设备配置 */write(fd, &uidev, sizeof(uidev));/* 启用 uinput 设备 */ioctl(fd, UI_DEV_CREATE);/* 发送按键事件 */ev.type = EV_KEY;ev.code = KEY_A; // 可以修改为需要模拟的按键ev.value = 1; // 按键按下write(fd, &ev, sizeof(ev));ev.type = EV_SYN;ev.code = SYN_REPORT;ev.value = 0;write(fd, &ev, sizeof(ev));ev.value = 0; // 按键释放write(fd, &ev, sizeof(ev));ev.type = EV_SYN;ev.code = SYN_REPORT;ev.value = 0;write(fd, &ev, sizeof(ev));/* 销毁设备 */ioctl(fd, UI_DEV_DESTROY);close(fd);return 0;
}
【知识扩展】
1.控制器(接键鼠)透传到采集器,采集器通过USB(OTG)模拟键鼠控制主机
hid协议实现,控制器hidapi接口(libusb-1.0.20和hidapi-libusb库)读hid数据通过网络传输给采集器,采集器通过hid gadget驱动(linux)或单片机实现
USB Gadget Support->HID function (NEW)
2.控制器(接键鼠或U盘)直接透传到主机
1)usbip驱动实现,相当于本地插入usb设备
2)如果只有键鼠,在主机端虚拟一个input设备(uinput驱动,通过/dev/uinput虚拟出/dev/input/eventx),从控制器读取event数据通过网络传输给主机并写入虚拟设备
3)模拟U盘(内存区域)通过USB给主机。usb gadget驱动(linux)