服务器测评网
我们一直在努力

Java如何读取USB设备数据?详细步骤与代码示例

Java读取USB设备的基本原理

在Java中读取USB设备并非直接操作硬件,而是依赖于操作系统提供的底层接口或第三方库,由于Java本身不提供原生USB通信API,开发者通常通过以下几种方式实现:调用本地库(如JNI)、使用跨平台Java库(如jSSC、JavaFX的USB支持),或结合系统命令,本文将重点介绍两种主流方法:基于jSSC(Java Simple Serial Connector)的串口通信和基于LibUsb-java的USB设备操作。

Java如何读取USB设备数据?详细步骤与代码示例

使用jSSC库(适用于串口设备)

jSSC是一个轻量级的Java库,主要用于串口通信,但部分USB设备在操作系统中被映射为虚拟串口时,也可通过jSSC读取数据,以下是具体步骤:

  1. 添加依赖:在Maven项目中引入jSSC库:

    <dependency>  
        <groupId>org.scream3r</groupId>  
        <artifactId>jssc</artifactId>  
        <version>2.9.4</version>  
    </dependency>  
  2. 列出可用串口:通过SerialPortList.getPortNames()获取所有可用串口名称(包括USB转串口设备)。

  3. 打开串口并配置参数

    Java如何读取USB设备数据?详细步骤与代码示例

    import jssc.SerialPort;  
    import jssc.SerialPortException;  
    public class UsbReader {  
        public static void main(String[] args) {  
            String portName = "COM3"; // 根据实际设备修改  
            SerialPort serialPort = new SerialPort(portName);  
            try {  
                serialPort.openPort(); // 打开串口  
                serialPort.setParams(SerialPort.BAUDRATE_9600, // 波特率  
                                    SerialPort.DATABITS_8,       // 数据位  
                                    SerialPort.STOPBITS_1,       // 停止位  
                                    SerialPort.PARITY_NONE);    // 校验位  
                // 读取数据  
                byte[] buffer = serialPort.readBytes(100); // 读取100字节  
                System.out.println("Received: " + new String(buffer));  
            } catch (SerialPortException e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    serialPort.closePort(); // 关闭串口  
                } catch (SerialPortException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  

注意:jSSC仅适用于串口映射的USB设备,对于普通USB设备(如U盘、 HID设备)支持有限。

使用LibUsb-java(适用于通用USB设备)

LibUsb-java是LibUsb的Java封装,支持直接与USB设备通信,适用于更复杂的USB设备(如自定义硬件、HID设备等),操作步骤如下:

  1. 添加依赖

    <dependency>  
        <groupId>com.github.xabgesagtx</groupId>  
        <artifactId>libusb-java</artifactId>  
        <version>1.2.2</version>  
    </dependency>  
  2. 初始化LibUsb并设备枚举

    Java如何读取USB设备数据?详细步骤与代码示例

    import usb.core.*;  
    public class UsbDeviceReader {  
        public static void main(String[] args) {  
            // 初始化LibUsb  
            Bus bus = Bus.getInstance();  
            Device[] devices = bus.getDevices();  
            for (Device device : devices) {  
                // 检查设备是否符合需求(如Vendor ID和Product ID)  
                if (device.idVendor() == 0x1234 && device.idProduct() == 0x5678) {  
                    try {  
                        DeviceHandle handle = device.open();  
                        // 配置设备接口  
                        handle.claimInterface(0);  
                        // 读取数据(假设端点地址为0x81)  
                        byte[] buffer = new byte[64];  
                        int transferred = handle.interruptRead(0x81, buffer, 5000); // 超时5秒  
                        if (transferred > 0) {  
                            System.out.println("Data: " + new String(buffer, 0, transferred));  
                        }  
                        handle.releaseInterface();  
                        handle.close();  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  

关键点:需提前通过lsusb(Linux)或设备管理器(Windows)获取设备的Vendor ID和Product ID,并了解设备的端点地址和传输类型(控制/中断/批量)。

注意事项

  1. 权限问题:Linux/macOS下可能需要root权限或配置udev规则;Windows需确保驱动正确安装。
  2. 跨平台兼容性:不同操作系统的设备路径和驱动支持可能不同,需进行适配。
  3. 异常处理:USB通信易受设备插拔影响,需合理处理DeviceDisconnectedException等异常。

通过上述方法,Java开发者可实现USB设备的数据读取,具体选择需根据设备类型和项目需求决定。

赞(0)
未经允许不得转载:好主机测评网 » Java如何读取USB设备数据?详细步骤与代码示例