From fc720c93896dc5eb86a494b1483634e2475f4b36 Mon Sep 17 00:00:00 2001 From: liuguijing <123456> Date: Tue, 10 Dec 2024 11:33:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E7=A1=AC=E6=8E=A5=E7=82=B9?= =?UTF-8?q?=E8=A3=85=E7=BD=AE=E5=A2=9E=E5=8A=A0=E5=81=9C=E9=A1=BF=E4=BA=94?= =?UTF-8?q?=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xydl/cac/model/StaticVariable.java | 2 +- .../xydl/cac/service/SerialPortService.java | 8 +- .../service/impl/SerialPortServiceImpl.java | 110 ++++++++++++------ src/main/resources/application-prod.yml | 2 + 4 files changed, 80 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/xydl/cac/model/StaticVariable.java b/src/main/java/com/xydl/cac/model/StaticVariable.java index 3306050..f54fcbb 100644 --- a/src/main/java/com/xydl/cac/model/StaticVariable.java +++ b/src/main/java/com/xydl/cac/model/StaticVariable.java @@ -33,7 +33,7 @@ public class StaticVariable { public static List zsb_Cache = null; public static ConcurrentHashMap rule_Cache = new ConcurrentHashMap<>(); - public static List serialPorts = new ArrayList<>(); + public static SerialPort currentPort; public static void wait(int seconds) throws InterruptedException { for (int i = 0; i < seconds; i++) { diff --git a/src/main/java/com/xydl/cac/service/SerialPortService.java b/src/main/java/com/xydl/cac/service/SerialPortService.java index eb6bfbb..45fe2d4 100644 --- a/src/main/java/com/xydl/cac/service/SerialPortService.java +++ b/src/main/java/com/xydl/cac/service/SerialPortService.java @@ -6,11 +6,11 @@ import java.io.IOException; import java.util.List; public interface SerialPortService { - List discoverSerialPort(); + Boolean discoverSerialPort(); - boolean closeSerialPort(SerialPort port, String portname); + void closeSerialPort(); - Boolean openSerialPort(SerialPort port); + Boolean openSerialPort(); - void sendData(SerialPort port, boolean data) throws IOException; + void sendData(boolean data) throws IOException; } diff --git a/src/main/java/com/xydl/cac/service/impl/SerialPortServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/SerialPortServiceImpl.java index ca60093..74aee93 100644 --- a/src/main/java/com/xydl/cac/service/impl/SerialPortServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/SerialPortServiceImpl.java @@ -1,67 +1,99 @@ package com.xydl.cac.service.impl; import com.fazecast.jSerialComm.SerialPort; +import com.xydl.cac.model.StaticVariable; import com.xydl.cac.service.SerialPortService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; -import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Service +@Slf4j public class SerialPortServiceImpl implements SerialPortService { @Value("${cac.warnport.name}") - public boolean warnportname; - - public List serialPortList; + public String warnportname; @Override - public List discoverSerialPort() { - serialPortList = Arrays.asList(SerialPort.getCommPorts()); - // 遍历串口列表并打印每个串口的名称 - for (SerialPort port : serialPortList) { - System.out.println("获取串口: " + port.getSystemPortName()); + public Boolean discoverSerialPort() { + List serialPortList = new ArrayList<>(); + SerialPort[] commPorts = SerialPort.getCommPorts(); + if (commPorts != null && commPorts.length > 0) { + serialPortList = Arrays.asList(commPorts); + for (SerialPort port : serialPortList) { + log.info("获取串口: " + port.getSystemPortName()); + if (port.getSystemPortName().equals(warnportname)) { + StaticVariable.currentPort = port; + log.info("获取到硬接点告警串口: " + port.getSystemPortName()); + return true; + } + } + return false; + } else { + log.error("未获取到硬接点告警串口!"); + return false; } - return serialPortList; } - //关闭串口 @Override - public boolean closeSerialPort(SerialPort port, String portname) { - for (SerialPort portItem : serialPortList) { - if (portItem.getSystemPortName().equals(portname)) { - if (portItem != null) { - System.out.println("断开端口" + portItem.getSystemPortName() + "连接"); - return portItem.closePort(); - } - } + public void closeSerialPort() { + if (StaticVariable.currentPort != null) { + SerialPort port = StaticVariable.currentPort; + port.closePort(); + } else { + log.error("断开串口失败,没有对应的硬接点告警串口!"); } - return false; } //发送数据到串口 @Override - public void sendData(SerialPort port, boolean data) throws IOException { - byte[] buffer2; - if (data) { - buffer2 = new byte[]{00, (byte) 0xf1, (byte) 0xff}; - } else { - buffer2 = new byte[]{00, (byte) 0x01, (byte) 0xff}; + @Async + public void sendData(boolean data) { + if (openSerialPort()) { + byte[] openbuffer = new byte[]{00, (byte) 0xf1, (byte) 0xff}; + byte[] stopbuffer = new byte[]{00, (byte) 0x01, (byte) 0xff}; + SerialPort port = StaticVariable.currentPort; + if (port != null) { + if (data) { + port.writeBytes(openbuffer, openbuffer.length); + } else { + port.writeBytes(stopbuffer, stopbuffer.length); + } + try { + Thread.sleep(5000); + port.writeBytes(stopbuffer, stopbuffer.length); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } } - port.writeBytes(buffer2, buffer2.length); } @Override - public Boolean openSerialPort(SerialPort port) { - if (port.getSystemPortName().equals(warnportname)) { - int baudRate = 9600; // 波特率 - int parity = SerialPort.EVEN_PARITY; // 校验位 - int dataBits = 8; // 数据位 - int stopBits = SerialPort.ONE_STOP_BIT; // 停止位 + public Boolean openSerialPort() { + Boolean discover = false; + if (StaticVariable.currentPort == null) { + discover = discoverSerialPort(); + } else { + discover = true; + } + if (discover) { + SerialPort port = StaticVariable.currentPort; + if (port.isOpen()) { + log.info("硬接点告警串口已经打开!"); + return true; + } else { + int baudRate = 9600; // 波特率 + int parity = SerialPort.EVEN_PARITY; // 校验位 + int dataBits = 8; // 数据位 + int stopBits = SerialPort.ONE_STOP_BIT; // 停止位 try { boolean setComResult = port.setComPortParameters(baudRate, dataBits, stopBits, parity); // 设置参数 boolean setComTimes = port.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 20000, 0); // 设置超时 @@ -70,18 +102,22 @@ public class SerialPortServiceImpl implements SerialPortService { } boolean b = port.openPort(); if (b) { + log.info("打开硬接点告警串口成功!"); return true; } else { + log.error("打开串口失败!"); return false; } } catch (Exception e) { e.printStackTrace(); -// return ResponseResult.getErrorResult("Failed to open port " + port.getSystemPortName() + e.getMessage().toString()); + log.error("打开串口失败" + e.getMessage()); return false; } -// return ResponseResult.getSuccessResult("COM10 Serial port open"); + } + } else { + log.error("打开串口失败,找不到硬接点串口!"); + return false; } -// return ResponseResult.getErrorResult("Failed to find port " + port.getSystemPortName()); - return false; } + } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 33cd6df..3adb91b 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -49,3 +49,5 @@ cac: token: e65e730cba22e320e16926fd4ff19ce787fa2162d065792bb6562c6d4a4cf328 secret: SEC72e5fb1b4ce7f9fed55386040d599035c50f8d2a181ad66bd1277549f0716124 rsakey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y= + warnport: + name: ttyCH341USB0 \ No newline at end of file