• linux挂载MTP


    要进一步区分MTP设备和U盘设备,你可以在设备插拔时,使用系统调用获取设备的详细属性信息,从而进行进一步判断。

    Linux系统中,你可以使用 libmtp 库来操作MTP设备。当MTP设备插入时,你可以使用 libmtp 库中的相关函数来检查该设备是否为MTP设备。你可以根据函数的返回值来判断设备类型。

    下面是一个使用 libmtp 库来判断MTP设备的示例代码:

    #include 
    #include 
    
    int main() 
    {
        LIBMTP_raw_device_t *raw_devices = NULL;
        int num_devices = 0;
        int i;
    
        num_devices = LIBMTP_Get_Raw_Device_List(&raw_devices);
        if (num_devices <= 0) 
        {
            printf("No MTP devices found\n");
            return 0;
        }
    
        for (i = 0; i < num_devices; i++) 
        {
            LIBMTP_raw_device_t device = raw_devices[i];
            MtpDeviceID device_id = device.device_entry.vendor_id;
            MtpDeviceID vendor_id = device.device_entry.product_id;
            
            // Check if the device is an MTP device
            int is_mtp = LIBMTP_Is_Raw_Device_Supported(device);
            
            if (is_mtp) 
            {
                printf("MTP device found: vendor_id=0x%04x, product_id=0x%04x\n", 
                       vendor_id, device_id);
                // add more logic for handling MTP devices here
            } 
            else 
            {
                printf("Non-MTP device found: vendor_id=0x%04x, product_id=0x%04x\n", 
                       vendor_id, device_id);
                // add more logic for handling non-MTP devices here
            }
        }
    
        LIBMTP_Release_Raw_Device_List(raw_devices);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    该代码会使用 LIBMTP_Get_Raw_Device_List 函数获取系统中所有MTP设备的详细信息,并遍历每个设备。然后,使用 LIBMTP_Is_Raw_Device_Supported 函数以确定该设备是否为MTP设备。如果是,就可以执行一些针对MTP设备的操作,或者在输出中标识设备类型。如果不是,可以执行针对其他设备类型的操作。

    在Windows系统中,你需要调用Windows API来检测设备类型。可以使用 SetupAPI 函数来查询USB设备的信息,并通过返回的设备信息判断设备类型。这个过程可能略有不同,具体的实现方式将取决于你使用的编程语言和开发平台。

    要分辨插入的USB设备是否是MTP设备,可以使用libmtp库提供的功能来枚举已连接的MTP设备和其他类型的USB存储设备。

    以下是一个简单的示例程序,演示了如何使用libmtp库来检测已连接的MTP设备:

    #include 
    #include 
    #include 
    
    int main()
    {
        LIBMTP_raw_device_t *devlist;
        LIBMTP_error_number_t err;
        int numdevices, i;
    
        // 初始化libmtp库
        err = LIBMTP_Init();
        if (err != LIBMTP_ERROR_NONE) {
            fprintf(stderr, "Failed to initialize libmtp: %s\n", LIBMTP_strerror(err));
            return 1;
        }
    
        // 枚举已连接的设备
        numdevices = LIBMTP_Get_Num_Raw_Devices();
        if (numdevices <= 0) {
            fprintf(stderr, "No MTP devices found.\n");
            LIBMTP_Release();
            return 1;
        }
    
        // 检查每一个已连接设备的MTP类型
        devlist = LIBMTP_Detect_Raw_Devices(&numdevices);
        for (i = 0; i < numdevices; i++) {
            LIBMTP_raw_device_t *dev = &devlist[i];
    
            printf("Device %d: %s (ID %04x:%04x)\n", i+1, dev->device_entry.vendor, 
                   dev->device_entry.vendor_id, dev->device_entry.product_id);
    
            // 判断设备是否是MTP设备
            if (dev->device_entry.device_flags & LIBMTP_DEVICE_FLAG_MTP_DEVICE) {
                printf("This device is an MTP device.\n");
            } else {
                printf("This device is NOT an MTP device.\n");
            }
        }
    
        // 释放资源并退出
        LIBMTP_Release_Device_List(devlist);
        LIBMTP_Release();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    该程序首先使用LIBMTP_Init()函数初始化libmtp库,并使用LIBMTP_Get_Num_Raw_Devices()函数枚举已连接的USB存储设备和MTP设备。接下来,它通过调用LIBMTP_Detect_Raw_Devices()函数,对每一个已连接的设备进行检测,检查设备是否是MTP设备。如果是MTP设备,则输出相应的消息。

    请注意,该示例程序仅演示了如何使用libmtp库检测MTP设备,但并不包括如何检测其他类型的USB存储设备的方法。如果您还需要检测其他类型的USB设备,请查看有关Linux USB驱动的其他文档和示例代码。

    要在Linux上使用C语言挂载MTP设备,你可以使用libmtp库提供的函数来实现。下面是一个简单的示例代码,演示如何使用libmtp库挂载MTP设备:

    #include 
    #include 
    #include 
    
    int main() {
        LIBMTP_device_t *device;
        LIBMTP_error_number_t error;
    
        // 初始化libmtp库
        LIBMTP_Init();
    
        // 打开第一个可用的MTP设备
        device = LIBMTP_Get_First_Device();
        if (device == NULL) {
            fprintf(stderr, "No MTP devices found\n");
            return 1;
        }
    
        // 挂载MTP设备
        error = LIBMTP_Open_Raw_Device(device);
        if (error != LIBMTP_ERROR_NONE) {
            fprintf(stderr, "Failed to open MTP device: %s\n", LIBMTP_strerror(error));
            LIBMTP_Release_Device(device);
            return 1;
        }
    
        // MTP设备已挂载,可以进行文件操作等其他操作
    
        // 卸载MTP设备
        error = LIBMTP_Close_Raw_Device(device);
        if (error != LIBMTP_ERROR_NONE) {
            fprintf(stderr, "Failed to close MTP device: %s\n", LIBMTP_strerror(error));
        }
    
        // 释放设备资源
        LIBMTP_Release_Device(device);
    
        // 清理libmtp库
        LIBMTP_Exit();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    这个示例代码定义了一个名为deviceLIBMTP_device_t结构体指针,然后通过调用LIBMTP_Get_First_Device函数获取第一个可用的MTP设备。接下来,使用LIBMTP_Open_Raw_Device函数挂载MTP设备。

    随后,你可以在相关代码段中使用其他libmtp库函数来操作MTP设备的文件和目录,例如上传、下载文件等。

    最后,通过调用LIBMTP_Close_Raw_Device函数来卸载MTP设备并释放设备资源。并且在程序结束前调用LIBMTP_Exit函数清理libmtp库。

    需要注意的是,为了成功编译上述代码,你需要安装libmtp库和相关的开发包。可以使用以下命令安装它们(以Ubuntu为例):

    sudo apt-get install libmtp-dev
    
    • 1

    在 Linux 系统中,可以使用 libmtp 库来读取 MTP 设备中的文件。这个库通过 USB 连接访问 MTP 设备,然后可以使用类似于文件系统的 API 来读取、写入和删除文件。

    以下是一个示例程序,展示了如何使用 libmtp 库在 Linux 中读取 MTP 设备的文件:

    #include 
    #include 
    
    int main() {
        // 初始化 libmtp 库
        LIBMTP_Init();
    
        // 打开第一个 MTP 设备
        LIBMTP_mtpdevice_t *device = LIBMTP_Get_First_Device();
        if (device == NULL) {
            printf("No MTP devices found.\n");
            return 1;
        }
    
        // 连接到设备
        int result = LIBMTP_Open(device);
        if (result != 0) {
            printf("Unable to open device.\n");
            return 1;
        }
    
        // 获取文件列表
        LIBMTP_file_t *files;
        uint32_t num_files;
        result = LIBMTP_Get_Filelisting_With_Callback(device, "/", &files, &num_files, NULL);
        if (result != 0) {
            printf("Unable to get file list.\n");
            return 1;
        }
    
        // 遍历文件列表,打印文件名
        for (int i = 0; i < num_files; i++) {
            printf("%s\n", files[i].filename);
        }
    
        // 释放文件列表内存
        LIBMTP_destroy_file_t(files);
    
        // 断开连接
        result = LIBMTP_Close(device);
        if (result != 0) {
            printf("Unable to close device.\n");
            return 1;
        }
    
        // 释放设备内存
        LIBMTP_Release_Device(device);
    
        // 结束 libmtp 库
        LIBMTP_Dump_Errorstack(NULL, LOGLEVEL_DEBUG);
        LIBMTP_Clear_Errorstack();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    这个示例程序打印了 MTP 设备根目录下的文件列表,你可以根据需要修改代码从而实现其他操作。注意,这个程序需要以 root 用户身份运行。
    如果你想在OpenLinux上查看是否支持libmtp库,可以按照以下步骤进行检查:

    1. 打开终端,并运行以下命令来检查系统中是否已安装libmtp库:

      rpm -qa | grep libmtp
      
      • 1

      如果你看到输出中包含类似于 libmtp- 的信息,表示系统已经安装了libmtp库。

    2. 如果系统未安装libmtp库,则可以尝试使用包管理器(例如zypper)来安装库:

      sudo zypper install libmtp-devel
      
      • 1

      这将安装libmtp库及其相关的开发文件,以便你可以在OpenLinux上使用它进行开发或编译连接应用程序。

    3. 安装完成后,你可以编写一个简单的程序来测试libmtp库是否可用,例如:

      #include 
      #include 
      
      int main() {
          LIBMTP_mtpdevice_t *device;
          LIBMTP_Init();
          device = LIBMTP_Get_First_Device();
          if (device == NULL) {
              printf("No MTP devices found.\n");
          } else {
              printf("Found MTP device with device ID %d.\n", device->device_entry->device_id);
              LIBMTP_Release_Device(device);
          }
          LIBMTP_Dump_Device_List();
          LIBMTP_Release();
      
          return 0;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      将以上代码保存为test.c,并使用以下命令进行编译:

      gcc -o test test.c -lmtp
      
      • 1

      如果编译成功且没有报错,则表示系统已成功支持libmtp库。

    通过以上步骤,你可以检查OpenLinux系统中是否支持libmtp库,并确认库是否已正确安装和配置。

  • 相关阅读:
    Air Quality Index,简称AQI
    计算机网络4小时速成:网络安全,被动攻击,主动攻击,对称加密,公钥秘钥,数字签名,鉴别,网络层安全协议IPsec,传输层安全协议SSL,防火墙,入侵检测系统
    「实用场景教程」如何用日程控件DHTMLX Scheduler制作酒店预订日历?(二)
    C++入门(一)
    基于Java+SpringBoot+Vue+uniapp微信小程序实现仓储管理系统
    技术分享|优炫数据库基于WAL日志备份及恢复
    c++ 二分查找
    开发板上网详细教程
    OpenMP task construct 实现原理以及源码分析
    关于MyBatisPlus框架下出现xml里面定义的方法无法被正确识别以及提示调用mysql存储过程时参数无效的问题
  • 原文地址:https://blog.csdn.net/weixin_38849487/article/details/134270836