使用libusb库枚举mac设备下面的USB设备

    最近在做了一个小试验,就是如何使用libusb在mac下面获取usb设备的信息,比如手机插入mac的usb口,我们如何拿到设备的vid,pid等设备信息,PS 使用cocoa api也可以拿到,但是如果使用Qt开发就显得比较难堪,所以决心使用跨平台的libusb实现。

    首先稍微说下步骤:

     1.在libusb官网下载libusb source code,官网自己可以google

      2.解压源码

      3.编译源码  先configure 再make 后make install

      4.项目中使用libusb的库,关于动态库的加载 参考网上内容

      5.在项目中引用libusb.h文件即可

下面看下Qt下面的代码片段:

      

#include "getusbinfo.h"

GetUsbInfo::GetUsbInfo(QObject *parent) :
    QThread(parent),isStop(false)
{
}

GetUsbInfo::~GetUsbInfo()
{
    qDebug()<<"GetUsbInfo::~GetUsbInfo "<<endl;
}

int GetUsbInfo::initUsbDevices()
{
    libusb_device **devs;
    int r;
    ssize_t cnt;

    r = libusb_init(NULL);
    if (r < 0)
        return r;

    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0)
        return (int) cnt;

    getVidPid(devs);
    libusb_free_device_list(devs, 1);

    libusb_exit(NULL);
    return 0;
}

QString GetUsbInfo::getVidPid(libusb_device **devs)
{
    libusb_device *dev;
    int i = 0;
    QList<STUUSBDevices> lstUsb;
    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            qDebug()<<"failed to get device descriptor"<<stderr;
            return "";
        }
        printf("%04x:%04x (bus %d, device %d)\n",
            desc.idVendor, desc.idProduct,
            libusb_get_bus_number(dev), libusb_get_device_address(dev));
        //qDebug()<<"get device descriptor"<<desc.idVendor<<"\n"<<desc.idProduct<<"\n"<<libusb_get_bus_number(dev)<<"\n"<<libusb_get_device_address(dev);
        STUUSBDevices stu;
        stu.idProduct = QString::number(desc.idProduct);
        stu.idVendor = QString::number(desc.idVendor);
        stu.iManufacturer = QString::number(desc.iManufacturer);
        stu.iSerialNumber = QString::number(desc.iSerialNumber);
        lstUsb.append(stu);
    }
    showAllUsbDevices(lstUsb);
    return QString(lstUsb[0].idProduct);
}

void GetUsbInfo::showAllUsbDevices(QList<STUUSBDevices> lst)
{
    for(int i=0;i<lst.count();i++)
    {
        qDebug()<<"vid: "<<lst.at(i).idVendor<<"\n"
               <<"pid:"<<lst.at(i).idProduct<<"\n"
                <<"serNumber:"<<lst.at(i).iSerialNumber<<"\n"
                  <<"Manufacturer:"<<lst.at(i).iManufacturer<<"\n";
    }
}

void GetUsbInfo::setRunStatus()
{
    isStop = true;
}

void GetUsbInfo::run()
{
    qDebug()<<"GetUsbInfo::run() "<<endl;
    while (!isStop)
    {
       initUsbDevices();
       sleep(10);
    }
}
开启一个线程每10s钟轮询一次usb口

。h文件 你们可以自己匹配出来

你可能感兴趣的:(C++,mac,qt,libusb)