libusb学习-1-热插拔监听

libusb学习-1-热插拔监听

#include "stdlib.h"
#include 
#include "iostream"
#include 
using namespace std;

//热插拔的回调监听函数
//不要在回调函数中调用可能阻塞的操作,否则可能造成libusb的其他函数执行失败
static int hotplug_callback(
    struct libusb_context *ctx,
    struct libusb_device *device,
    libusb_hotplug_event event,
    void *user_data) {
    //通过设备获取设备地址
    uint8_t deviceAddress = libusb_get_device_address(device);
    //enum libusb_hotplug_event {
    //     LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01,
    //     LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 0x02 }
    if(event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
        printf("设备连接 \n");
    } else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
        printf("设备断开 \n");
    }
    return 0;
}

int main () {
  printf("testUSB\n");
  //libusb的上下文对象,初始化的时候需要使用
  libusb_context *context;
  //初始化libusb,要最先调用
  int ret = libusb_init(&context);
  if (ret != LIBUSB_SUCCESS) {
      printf("initialize libusb failed");
      return -1;
  }
  //判断当前的的库,是否支持热插拔
  if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) {
      printf("this version's libusb doesn't support hotplug");
      return -1;
  }
  //注册hotplug
  //需要监控的VID,设置为LIBUSB_HOTPLUG_MATCH_ANY,则不判断VID
  int vendor_id = LIBUSB_HOTPLUG_MATCH_ANY;
  //需要监控的PID 设置为LIBUSB_HOTPLUG_MATCH_ANY,则不判断PID
  int product_id = LIBUSB_HOTPLUG_MATCH_ANY;
  //需要监控的设备的class,设置为LIBUSB_HOTPLUG_MATCH_ANY,则不判断,与libusb_device_descriptor的class匹配
  //这个参数不是很懂
  int device_class = LIBUSB_HOTPLUG_MATCH_ANY;
  //设备需要监听的事件,插入和拔出
  libusb_hotplug_event event = static_cast (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT);

  //typedef enum {
  //    LIBUSB_HOTPLUG_NO_FLAGS = 0,//只有在发生拔插的时候才会调用注册的回调函数
  //    LIBUSB_HOTPLUG_ENUMERATE = 1<<0,//在初始化前设备已经插入,也会调用注册的回调函数
  //} libusb_hotplug_flag;
  libusb_hotplug_flag flag = static_cast(1);

  //句柄,具体啥作用目前未知
  libusb_hotplug_callback_handle handle;

  //设备回调过来的数据
  void *user_data;

  // int LIBUSB_CALL 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);
  printf("libusb_hotplug_register_callback\n");
  int result_Register = libusb_hotplug_register_callback(context, event, flag, vendor_id, product_id, device_class, hotplug_callback, &user_data, &handle);
  if (result_Register != LIBUSB_SUCCESS) {
      printf("resigter hotplug_callback failed");
      return -1;
  } else {
      printf("resigter hotplug_callback successfully");
  }

  //注册了热插拔事件,必须要在循环中调用libusb_handle_events
  //在阻塞模式中处理任何挂起的事件。
  while(1) {
        //设置允许处理事件的超时时间
        printf("libusb_handle_events\n");
        libusb_handle_events(context);
  }

  //注销回调事件
  libusb_hotplug_deregister_callback(context, handle);
  libusb_exit(context);
  return 0;
}

注意点

  • 在使用g++编译的时候,可能会报如下的错误:
/tmp/ccjLtFxj.o: In function `hotplug_callback(libusb_context*, libusb_device*, libusb_hotplug_event, void*)':
TestUsb.cpp:(.text+0x1f): undefined reference to `libusb_get_device_address'
/tmp/ccjLtFxj.o: In function `main':
TestUsb.cpp:(.text+0x78): undefined reference to `libusb_init'
TestUsb.cpp:(.text+0xa4): undefined reference to `libusb_has_capability'
TestUsb.cpp:(.text+0x123): undefined reference to `libusb_hotplug_register_callback'
TestUsb.cpp:(.text+0x17b): undefined reference to `libusb_handle_events'
collect2: error: ld returned 1 exit status
  • 需要先做一些设置:
pkg-config --list-all
//具体库的名字,可以在/usr/local/lib/下看一下,我的是libusb-1.0

pkg-config --libs libusb库的名字
//会有输出
-L/usr/local/lib -lusb-1.0
//编译测试代码
g++ TestUsb.cpp -lusb-1.0
  • 库安装可以参考我之前总结的文章
    libusb库安装(ubuntu)

  • 参考链接
    libusb-undefined-reference-to
    libusb函数说明

你可能感兴趣的:(libusb学习-1-热插拔监听)