java如何读取usb数据
读取USB数据的方法
在Java中读取USB设备数据通常需要通过底层系统接口或第三方库实现,因为标准Java API不直接支持USB通信。以下是几种常用方法:
使用javax.usb库(适用于Linux/Windows)
javax.usb是Java的USB通信扩展库,需配合本地库使用:
-
添加Maven依赖:
<dependency> <groupId>org.usb4java</groupId> <artifactId>usb4java</artifactId> <version>1.3.0</version> </dependency> -
枚举USB设备示例代码:
import org.usb4java.*; public class USBScanner { public static void main(String[] args) { Context context = new Context(); LibUsb.init(context); DeviceList list = new DeviceList(); LibUsb.getDeviceList(context, list); for (Device device : list) { DeviceDescriptor desc = new DeviceDescriptor(); LibUsb.getDeviceDescriptor(device, desc); System.out.printf("Vendor: %04X, Product: %04X%n", desc.idVendor(), desc.idProduct()); } LibUsb.freeDeviceList(list, true); LibUsb.exit(context); } }
使用RXTX库(串口转USB)
对于通过虚拟串口连接的USB设备:
-
添加RXTX依赖:
<dependency> <groupId>org.rxtx</groupId> <artifactId>rxtx</artifactId> <version>2.1.7</version> </dependency> -
串口通信示例:
import gnu.io.*; public class SerialReader { public static void main(String[] args) throws Exception { CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("/dev/ttyUSB0"); SerialPort port = (SerialPort) portId.open("Reader", 2000); port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); InputStream in = port.getInputStream(); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); port.close(); } }
使用JNA调用本地API(高级)
通过Java Native Access直接调用系统USB API:
import com.sun.jna.*;
import com.sun.jna.ptr.*;
public class WinUSBReader {
public interface Kernel32 extends Library {
Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class);
int CreateFile(String lpFileName, int dwDesiredAccess,
int dwShareMode, Pointer lpSecurityAttributes,
int dwCreationDisposition, int dwFlagsAndAttributes,
Pointer hTemplateFile);
}
public static void main(String[] args) {
String devicePath = "\\\\?\\usb#vid_1234&pid_5678";
int handle = Kernel32.INSTANCE.CreateFile(devicePath,
0xC0000000, 0, null, 3, 0, null);
// 后续使用ReadFile等API读取数据
}
}
注意事项
- 需要为不同操作系统准备对应的本地库(.dll/.so)
- USB设备可能需要特定驱动程序
- 在Linux系统可能需要root权限访问设备
- 建议先使用工具如lsusb(Linux)或USBView(Windows)确认设备信息
对于特定USB设备(如HID),可以考虑专用库如hid4java:
<dependency>
<groupId>org.hid4java</groupId>
<artifactId>hid4java</artifactId>
<version>0.7.0</version>
</dependency>






