1.下载libusb和hidapi库
libusb库是操作usb设备的库,而hidapi它依赖libusb, 并且专门针对人类输入设备,如鼠标、键盘、触摸屏等设备。
2.编译
./bootstrap
./configure
make
sudo make install
注意:两个库编译方法一样,但是要先编译libusb
3.更新系统动态库
sudo ldconfig
4.编写测试程序
hidtest.c:
#include <unistd.h>
#include <stdio.h>
#include <libusb-1.0/libusb.h>
#include <hidapi/hidapi.h>
static void print_devs(libusb_device **devs)
{
libusb_device *dev;
int i = 0;
while ((dev = devs[i++]) != NULL) {
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0) {
fprintf(stderr, "failed to get device descriptor");
return;
}
printf("%04x:%04x (bus %d, device %d)\n",
desc.idVendor, desc.idProduct,
libusb_get_bus_number(dev), libusb_get_device_address(dev));
}
}
static int test_hidapi(int vid,int pid){
printf("vid:%04X,pid:%04X\n",vid,pid);
int res;
unsigned char buf[65];
hid_device *handle;
int i;
// Initialize the hidapi library
res = hid_init();
// Open the device using the VID, PID,
// and optionally the Serial number.
// 1a86:7523
handle = hid_open(vid,pid,NULL);
if (!handle) {
printf("Unable to open device\n");
hid_exit();
return 1;
}
printf("----------------请移动鼠标-------------------\n");
// 读取鼠标数据
while (1) {
unsigned char data[64];
int res = hid_read(handle, data, sizeof(data));
if (res < 0) {
printf("读取鼠标数据失败\n");
break;
}
// 打印鼠标数据
printf("鼠标数据: ");
for (int i = 0; i < res; i++) {
printf("%02X ", data[i]);
printf("\n----------------hidapi测试成功-------------------\n");
exit(0);
}
printf("\n");
}
// 关闭设备
hid_close(handle);
// 清理hidapi
hid_exit();
}
int main(){
int r;
ssize_t cnt;
libusb_device **devs; //devices
libusb_context *ctx = NULL;
struct libusb_device_descriptor desc;
r=libusb_init(ctx); //init 初始化libusb
int vid,pid;
if(r<0) {
printf("failed to init libusb\n");
return 1;
}
cnt = libusb_get_device_list(NULL,&devs); //获取设备列表
if (cnt < 0) {
printf("failed to get device list\n");
return 1;
}
print_devs(devs);
printf("----------------------libusb测试成功--------------------------------\n");
for (ssize_t i = 0; i < cnt; i++) {
r = libusb_get_device_descriptor(devs[i], &desc);
if (r < 0) {
fprintf(stderr, "无法获取设备描述符: %s\n", libusb_error_name(r));
continue;
}
// 检查是否为鼠标设备
printf("设备 VID: 0x%04X, PID: 0x%04X,CLASS:%d\n", desc.idVendor, desc.idProduct,desc.bDeviceClass);
if (desc.bDeviceClass == 0) {
printf("---->设备 VID: 0x%04X, PID: 0x%04X\n", desc.idVendor, desc.idProduct);
vid = desc.idVendor;
pid = desc.idProduct;
}
}
// 释放设备列表
libusb_free_device_list(devs, 1);
// 关闭 libusb
libusb_exit(ctx);
test_hidapi(vid,pid);
return 0;
}
5.编译测试程序
gcc hidtest.c -o test -lusb-1.0 -lhidapi-libusb
6.运行效果
sudo ./test
参考资料: