监听已占用串口的通信数据
监听已占用串口的通信数据,传统的 RXTX 或 jSerialComm 等 Java 串口库无法直接实现。这是因为这些库需要独占串口权限,而操作系统只允许一个程序占用串口。
但是,有以下两种解决思路可以实现:
方法 1:使用串口数据捕获工具(推荐)
可以使用专用的串口监控工具,它可以捕获串口之间的数据流,而无需干预现有的程序通信。
推荐工具
Free Serial Port Monitor(Windows)
Advanced Serial Port Monitor使用步骤
下载并安装串口监控工具。
配置监控工具,使其监听指定的串口(如 COM3 或 COM4)。
在监控界面中查看实时数据。
这种方式适合于调试或测试环境,不需要修改现有程序。
方法 2:使用虚拟串口中间件
通过创建虚拟串口对,实现数据中继,从而监听通信。
创建虚拟串口对
使用 com0com 或类似工具创建一对虚拟串口,如 COM5 和 COM6。
配置虚拟串口,使 COM3 和 COM5 镜像通信。中继数据到虚拟串口
运行一个程序,将 COM3 和 COM5 的数据中继,类似于代理。
示例代码
import gnu.io.*;
import java.io.*;
public class SerialPortSniffer {
public static void main(String[] args) {
// 创建线程监听 COM3 和 COM5
new Thread(() -> sniff("COM3", "COM5")).start();
new Thread(() -> sniff("COM5", "COM3")).start();
}
public static void sniff(String sourcePort, String targetPort) {
try {
CommPortIdentifier sourceIdentifier = CommPortIdentifier.getPortIdentifier(sourcePort);
CommPortIdentifier targetIdentifier = CommPortIdentifier.getPortIdentifier(targetPort);
// 打开源串口
CommPort sourceCommPort = sourceIdentifier.open("SnifferSource", 2000);
SerialPort sourceSerialPort = (SerialPort) sourceCommPort;
sourceSerialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// 打开目标串口
CommPort targetCommPort = targetIdentifier.open("SnifferTarget", 2000);
SerialPort targetSerialPort = (SerialPort) targetCommPort;
targetSerialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// 转发数据
InputStream sourceInputStream = sourceSerialPort.getInputStream();
OutputStream targetOutputStream = targetSerialPort.getOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = sourceInputStream.read(buffer)) > 0) {
targetOutputStream.write(buffer, 0, length);
targetOutputStream.flush();
System.out.println("Sniffed data: " + new String(buffer, 0, length));
}
} catch (Exception e) {
System.err.println("Error in sniffing: " + e.getMessage());
}
}
}
步骤
1、配置中继程序:
数据从 COM3 转发到 COM5。
数据从 COM5 转发到 COM3。
2、监听程序:
配置监听工具监听 COM5。
方法 3:操作系统级别的网络抓包
通过操作系统的串口驱动,拦截串口通信。
Windows
使用工具如 PortMon 或其他串口监控驱动,可以拦截任意程序的串口通信。
注意事项
1、非侵入式监控:
如果原程序不能被中断,推荐使用工具(方法 1)。
2、性能问题:
使用中继程序(方法 2)可能引入延迟,需谨慎。
3、权限:
确保使用串口监控工具时,具有足够的系统权限。