1. libusb是云电脑常用的重定向库
libusb是一个开源的C库,提供对USB设备的用户空间访问。它使得开发者可以在没有内核模块的情况下,通过用户空间程序与USB设备通信。libusb被广泛应用于各种场景,包括云电脑的USB设备重定向。云电脑环境下,用户通常需要访问本地的USB设备(如U盘、打印机、ukey等),libusb通过其强大的设备重定向功能,实现了这种需求。
2. libusb的整体框架
libusb的架构相对简单,主要由以下几个组件构成:
- 上下文(Context) :libusb通过上下文来管理和追踪库的状态信息。每个上下文代表一个独立的libusb会话。
- 设备和设备句柄(Device and Device Handle):设备是libusb与物理USB设备的抽象表示,而设备句柄则是操作设备的句柄,用于执行具体的I/O操作。
- 传输(Transfer) :libusb支持同步和异步传输,通过传输机制与设备进行数据交换。
- 热插拔事件(Hotplug Events) :libusb提供热插拔检测机制,允许应用程序在设备插入或移除时收到通知。
这些组件协同工作,为用户提供了一个高效、灵活的USB设备访问框架。
3. libusb常用API
libusb提供了丰富的API,以满足不同场景的需求。以下是一些常用的API:
- 初始化和关闭
libusb_init(libusb_context **ctx)
: 初始化libusb库。libusb_exit(libusb_context *ctx)
: 关闭libusb库,释放资源。
- 设备发现和操作
libusb_get_device_list(libusb_context *ctx, libusb_device ***list)
: 获取连接到系统的USB设备列表。libusb_open(libusb_device *dev, libusb_device_handle **handle)
: 打开指定的USB设备。libusb_close(libusb_device_handle *handle)
: 关闭USB设备句柄。
- 数据传输
libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout)
: 执行批量传输。libusb_control_transfer(libusb_device_handle *dev_handle, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, unsigned char *data, uint16_t wLength, unsigned int timeout)
: 执行控制传输。
- 热插拔
libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *callback_handle)
: 注册热插拔回调函数。
4. libusb使用示例
下面是一个简单的libusb使用示例,展示如何枚举USB设备并打印其设备描述符:
#include <libusb-1.0/libusb.h>
#include <stdio.h>
void print_device_descriptor(libusb_device *device) {
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(device, &desc);
if (r < 0) {
fprintf(stderr, "Failed to get device descriptor\n");
return;
}
printf("Number of possible configurations: %d\n", desc.bNumConfigurations);
printf("Device Class: %d\n", desc.bDeviceClass);
printf("VendorID: %04x\n", desc.idVendor);
printf("ProductID: %04x\n", desc.idProduct);
}
int main() {
libusb_context *ctx = NULL;
libusb_device **devs;
ssize_t cnt;
int r;
r = libusb_init(&ctx);
if (r < 0) {
fprintf(stderr, "Failed to initialize libusb\n");
return 1;
}
cnt = libusb_get_device_list(ctx, &devs);
if (cnt < 0) {
fprintf(stderr, "Failed to get device list\n");
libusb_exit(ctx);
return 1;
}
for (ssize_t i = 0; i < cnt; i++) {
print_device_descriptor(devs[i]);
}
libusb_free_device_list(devs, 1);
libusb_exit(ctx);
return 0;
}
该示例程序首先初始化libusb库,然后获取当前连接到系统的USB设备列表,并遍历每个设备,打印其设备描述符中的信息。最后,释放设备列表并关闭libusb库。通过这个简单的示例,可以看到libusb的API使用相对直接,且功能强大。
libusb为开发者提供了灵活且高效的方式来访问和操作USB设备,无论是在嵌入式系统、桌面应用,还是云电脑环境中,都能很好地满足各种需求。