用Java获取USB设备信息

1. 前言

USB(Universal Serial Bus,通用串行总线)是一种常见的用于连接计算机与外部设备的接口标准。在开发过程中,我们可能需要获取USB设备的信息,比如设备的厂商ID、产品ID、设备名称等。本文将介绍如何使用Java获取USB设备的信息,并提供相应的代码示例。

2. USB设备信息获取流程

要获取USB设备的信息,我们需要进行以下步骤:

  1. 导入相关的Java库
  2. 使用JNA(Java Native Access)库调用系统的USB接口
  3. 遍历USB设备列表,获取设备的信息

下面将详细介绍每一步的实现方法。

3. 导入相关的Java库

要使用JNA库调用系统的USB接口,我们需要在Java项目中导入JNA库的相关依赖。

<!-- pom.xml -->
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>5.9.0</version>
</dependency>

4. 使用JNA库调用系统的USB接口

JNA库提供了与系统原生库交互的功能,我们可以使用它调用底层的USB接口。下面是一个示例代码,展示了如何使用JNA库获取USB设备信息:

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;

public class USBDeviceInfo {

    public interface SetupApi extends StdCallLibrary {
        SetupApi INSTANCE = (SetupApi) Native.loadLibrary("setupapi", SetupApi.class);

        boolean SetupDiEnumDeviceInfo(Pointer DeviceInfoSet, int MemberIndex, SP_DEVINFO_DATA DeviceInfoData);
        boolean SetupDiDestroyDeviceInfoList(Pointer DeviceInfoSet);
    }

    public static class SP_DEVINFO_DATA extends Structure {
        public int cbSize;
        public Guid.GUID ClassGuid;
        public int DevInst;
        public Pointer Reserved;

        public SP_DEVINFO_DATA() {
            cbSize = size();
        }
    }

    public static void main(String[] args) {
        Pointer hDevInfo = SetupApi.INSTANCE.SetupDiGetClassDevs(null, null, null, SetupApi.DIGCF_PRESENT | SetupApi.DIGCF_ALLCLASSES);
        SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA();
        devInfoData.cbSize = devInfoData.size();

        int i = 0;
        while (SetupApi.INSTANCE.SetupDiEnumDeviceInfo(hDevInfo, i, devInfoData)) {
            // 获取设备信息
            // ...
            i++;
        }

        SetupApi.INSTANCE.SetupDiDestroyDeviceInfoList(hDevInfo);
    }
}

在上面的代码中,我们首先定义了一个SetupApi接口,该接口使用JNA库加载系统的setupapi库。然后,我们定义了一个SP_DEVINFO_DATA结构体,用于存储USB设备的信息。接下来,我们在main方法中通过调用SetupApi接口的方法,获取USB设备的信息。

5. 遍历USB设备列表,获取设备的信息

在上一步中,我们通过调用SetupApi.INSTANCE.SetupDiEnumDeviceInfo方法遍历USB设备列表,并获取每个设备的信息。在实际开发中,我们可以根据实际需求获取设备的厂商ID、产品ID、设备名称等信息。

下面是一个示例代码,展示了如何获取设备的厂商ID、产品ID、设备名称:

import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.SetupApi;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;

public class USBDeviceInfo {

    public static void main(String[] args) {
        Pointer hDevInfo = SetupApi.INSTANCE.SetupDiGetClassDevs(null, null, null, SetupApi.DIGCF_PRESENT | SetupApi.DIGCF_ALLCLASSES);
        SetupApi.SP_DEVINFO_DATA devInfoData = new SetupApi.SP_DEVINFO_DATA();
        devInfoData.cbSize = devInfoData.size();

        int i = 0;
        while (SetupApi.INSTANCE.SetupDiEnumDeviceInfo(hDevInfo, i, devInfoData)) {
            IntByReference requiredSize = new IntByReference();
            SetupApi.INSTANCE.SetupDiGetDeviceInstanceId(hDevInfo, devInfoData, null, 0, requiredSize);
            Memory instanceIdMemory = new Memory(requiredSize.getValue());
            SetupApi.INSTANCE.SetupDiGetDevice