Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 检索Mac OS X上USB设备的序列号时出现问题_Macos_Qt_Osx Yosemite_Libusb_Darwin - Fatal编程技术网

Macos 检索Mac OS X上USB设备的序列号时出现问题

Macos 检索Mac OS X上USB设备的序列号时出现问题,macos,qt,osx-yosemite,libusb,darwin,Macos,Qt,Osx Yosemite,Libusb,Darwin,我正在(约塞米蒂)环境中使用libusb0.1。我的目标是获取所有连接的USB密钥的序列号(usbclass=8) 通常第一次读数正确,我无法理解为什么,但有时从后续读数中,设备不再被检测到。有时我会在usb\u get\u string\u simple(句柄、设备->描述符.iSerialNumber)函数中得到-60个错误代码。我如何解决这个问题 我尝试过使用FAT、FAT32和NTFS文件系统的USB密钥,但它们都有相同的问题 在同一个项目中,我使用libusb与连接到Mac的打印机设备

我正在(约塞米蒂)环境中使用libusb0.1。我的目标是获取所有连接的USB密钥的序列号(usbclass=8)

通常第一次读数正确,我无法理解为什么,但有时从后续读数中,设备不再被检测到。有时我会在
usb\u get\u string\u simple(句柄、设备->描述符.iSerialNumber)
函数中得到-60个错误代码。我如何解决这个问题

我尝试过使用FAT、FAT32和NTFS文件系统的USB密钥,但它们都有相同的问题


在同一个项目中,我使用libusb与连接到Mac的打印机设备进行读/写,并读取序列号。这种类型的设备没有问题。真奇怪

在.pro文件中:

INCLUDEPATH +=   /Users/sborfedor/Desktop/root/current/includes
DEPENDPATH  +=   /Users/sborfedor/Desktop/root/current/includes
LIBS        += -L/Users/sborfedor/Desktop/root/current/bin_osx/libs/ -lusb-legacy
DESTDIR     =    /Users/sborfedor/Desktop/root/current/bin_osx
这是我的代码:

void MainWindow::run() {
    struct usb_bus* bus = NULL;
    struct usb_device* device = NULL;
    const int MASSSTORAGE_CLASS = 8;
    usb_init();
    usb_set_debug(3);
    usb_find_busses();
    usb_find_devices();
    int ret;
    for ( bus = usb_get_busses(); bus; bus = bus->next ) {
        for ( device = bus->devices; device; device = device->next )  {
            if (device->descriptor.bDeviceClass != MASSSTORAGE_CLASS && device->descriptor.bDeviceClass != 0) {
                continue;
            }
            for ( int cid = 0; cid < device->descriptor.bNumConfigurations; ++cid ) {
                struct usb_config_descriptor* config = &( device->config[cid] );
                if (config == NULL)
                    continue;
                for ( int iid = 0; iid < config->bNumInterfaces; ++iid ) {
                    struct usb_interface* interface = &( config->interface[iid] );
                    if (interface == NULL)
                        continue;
                    usb_dev_handle* handle = usb_open( device );
                    if (handle == NULL)
                        continue;
                    for ( int sid = 0; sid < interface->num_altsetting; sid++ ) {
                        struct usb_interface_descriptor* settings = &( interface->altsetting[sid] );
                        if (settings == NULL)
                            continue;
                        int usbClass = device->descriptor.bDeviceClass;
                        if (usbClass == 0) {
                            usbClass = settings->bInterfaceClass;
                        }
                        if (usbClass != MASSSTORAGE_CLASS)
                            continue;
                        char device_serial_number[255];
                        ret = usb_get_string_simple( handle, device->descriptor.iSerialNumber, device_serial_number, sizeof(device_serial_number) );
                        if (ret > 0 ) {
                            qDebug() << "SERIAL_NUMBER="<<QString(device_serial_number);
                        } else {
                            qDebug() << "*** usb_get_string_simple( handle, device->descriptor.iSerialNumber, device_serial_number, USBX_DEVICE_SERIAL_NUMBER_MAX_SIZE ) RET="<<ret;
                        }
                    }
                    usb_close( handle );
                }
            }
        }
    }
}
void主窗口::运行(){
结构usb_总线*总线=NULL;
结构usb_设备*设备=空;
常量int MASSSTORAGE_CLASS=8;
usb_init();
usb设置调试(3);
usb_查找_总线();
usb_查找_设备();
int ret;
用于(总线=usb_获取总线();总线;总线=总线->下一步){
用于(设备=总线->设备;设备;设备=设备->下一步){
如果(设备->描述符.bDeviceClass!=MASSSTORAGE_类和设备->描述符.bDeviceClass!=0){
继续;
}
对于(int-cid=0;ciddescriptor.bNumConfigurations;++cid){
结构usb配置描述符*config=&(设备->配置[cid]);
if(config==NULL)
继续;
对于(int iid=0;iidbNuminInterfaces;++iid){
结构usb_接口*接口=&(配置->接口[iid]);
if(接口==NULL)
继续;
usb_dev_handle*handle=usb_open(设备);
if(handle==NULL)
继续;
对于(int sid=0;sidnum\altsetting;sid++){
结构usb_接口_描述符*设置=&(接口->altsetting[sid]);
如果(设置==NULL)
继续;
int usbClass=device->descriptor.bDeviceClass;
如果(usbClass==0){
usbClass=settings->bInterfaceClass;
}
if(usbClass!=MASSSTORAGE_类)
继续;
字符设备序列号[255];
ret=usb_get_string_simple(句柄,设备->descriptor.iSerialNumber,设备_serial_number,sizeof(设备_serial_number));
如果(ret>0){

qDebug()我对libusb不是特别熟悉,但OSX已经读取序列号并将其存储在IOKit设备NUB的相关属性中。因此不需要向硬件发送请求,这可能会混淆活动驱动程序?(libusb可能会在设备上创建一个用户客户端驱动程序实例)


磁盘仲裁框架是枚举系统中的磁盘并查询其属性的一种很好的方法-这比直接使用IOKit要容易一些。

您是如何安装
libusb
?在同一个项目中,我使用libusb读取/写入连接到Mac的打印机设备,并读取序列号。这种类型没有问题太奇怪了。我认为libusb安装正确。但是你是怎么安装的?我已经更新了我的问题