diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
new file mode 100644
index 0000000..9c152fa
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
@@ -0,0 +1,21 @@
+package com.casic.missiles.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.casic.missiles.modular.system.dao.WindMapper;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 台风数据信息 服务实现类
+ *
+ * @author a203
+ */
+
+@Service
+public class WindServiceImpl extends ServiceImpl implements IWindService {
+
+ public WindServiceImpl() {
+
+ }
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
new file mode 100644
index 0000000..9c152fa
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
@@ -0,0 +1,21 @@
+package com.casic.missiles.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.casic.missiles.modular.system.dao.WindMapper;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 台风数据信息 服务实现类
+ *
+ * @author a203
+ */
+
+@Service
+public class WindServiceImpl extends ServiceImpl implements IWindService {
+
+ public WindServiceImpl() {
+
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
new file mode 100644
index 0000000..6dbc91d
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
@@ -0,0 +1,106 @@
+package com.casic.missiles.serialport;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import com.casic.missiles.modular.system.utils.TimeUtil;
+import gnu.io.NRSerialPort;
+import gnu.io.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.Set;
+import java.util.TooManyListenersException;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Component
+public class SerialPortInit implements CommandLineRunner {
+
+ /**
+ * 硬件端口名
+ */
+ @Value("${casic.serialPort.meteorology.name}")
+ private String serialPortName;
+
+ private NRSerialPort serialPort;
+ private final IWindService windService;
+
+ public SerialPortInit(IWindService windService) {
+ this.windService = windService;
+ }
+
+ /**
+ * 异步初始化硬件串口
+ */
+ @Async
+ @Override
+ public void run(String... args) {
+ Set allPorts = NRSerialPort.getAvailableSerialPorts();
+ log.info("Available port as follows " + JSON.toJSONString(allPorts));
+ if (!allPorts.isEmpty()) {
+ serialPort = new NRSerialPort(serialPortName, 4800);
+ try {
+ if (serialPort.connect()) {
+ try {
+ serialPort.addEventListener(serialPortEvent -> {
+ // 解决数据断行
+ try {
+ Thread.sleep(150);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+ analyzeData(SerialPortManager.readFromPort(serialPort));
+ } else {
+ log.info("The serial port status is abnormal");
+ serialPort.removeEventListener();
+ }
+ serialPort.notifyOnDataAvailable(true);
+ });
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("Meteorology port is not connected");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void analyzeData(byte[] bytes) {
+ String data = asciiToString(bytes);
+ log.info("串口收到数据 <=== " + data);
+ if (data.startsWith("$WIMWV")) {
+ //风向和风速
+ String[] splitData = data.split(",");
+ Wind wind = new Wind();
+ wind.setDegree(splitData[1].isEmpty() ? 0 : Integer.parseInt(splitData[1]));
+ wind.setSpeed(splitData[3].isEmpty() ? 0 : Double.parseDouble(splitData[3]));
+ wind.setCreateTime(TimeUtil.getCurrentTime());
+
+ windService.save(wind);
+ } else if (data.startsWith("$WIXDR")) {
+
+
+ } else {
+ log.info("数据格式错误 ===> " + data);
+ }
+ }
+
+ public String asciiToString(byte[] bytes) {
+ StringBuilder builder = new StringBuilder();
+ for (byte aByte : bytes) {
+ String value = Character.toString((char) aByte);
+ builder.append(value);
+ }
+ return builder.toString();
+ }
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
new file mode 100644
index 0000000..9c152fa
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
@@ -0,0 +1,21 @@
+package com.casic.missiles.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.casic.missiles.modular.system.dao.WindMapper;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 台风数据信息 服务实现类
+ *
+ * @author a203
+ */
+
+@Service
+public class WindServiceImpl extends ServiceImpl implements IWindService {
+
+ public WindServiceImpl() {
+
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
new file mode 100644
index 0000000..6dbc91d
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
@@ -0,0 +1,106 @@
+package com.casic.missiles.serialport;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import com.casic.missiles.modular.system.utils.TimeUtil;
+import gnu.io.NRSerialPort;
+import gnu.io.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.Set;
+import java.util.TooManyListenersException;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Component
+public class SerialPortInit implements CommandLineRunner {
+
+ /**
+ * 硬件端口名
+ */
+ @Value("${casic.serialPort.meteorology.name}")
+ private String serialPortName;
+
+ private NRSerialPort serialPort;
+ private final IWindService windService;
+
+ public SerialPortInit(IWindService windService) {
+ this.windService = windService;
+ }
+
+ /**
+ * 异步初始化硬件串口
+ */
+ @Async
+ @Override
+ public void run(String... args) {
+ Set allPorts = NRSerialPort.getAvailableSerialPorts();
+ log.info("Available port as follows " + JSON.toJSONString(allPorts));
+ if (!allPorts.isEmpty()) {
+ serialPort = new NRSerialPort(serialPortName, 4800);
+ try {
+ if (serialPort.connect()) {
+ try {
+ serialPort.addEventListener(serialPortEvent -> {
+ // 解决数据断行
+ try {
+ Thread.sleep(150);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+ analyzeData(SerialPortManager.readFromPort(serialPort));
+ } else {
+ log.info("The serial port status is abnormal");
+ serialPort.removeEventListener();
+ }
+ serialPort.notifyOnDataAvailable(true);
+ });
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("Meteorology port is not connected");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void analyzeData(byte[] bytes) {
+ String data = asciiToString(bytes);
+ log.info("串口收到数据 <=== " + data);
+ if (data.startsWith("$WIMWV")) {
+ //风向和风速
+ String[] splitData = data.split(",");
+ Wind wind = new Wind();
+ wind.setDegree(splitData[1].isEmpty() ? 0 : Integer.parseInt(splitData[1]));
+ wind.setSpeed(splitData[3].isEmpty() ? 0 : Double.parseDouble(splitData[3]));
+ wind.setCreateTime(TimeUtil.getCurrentTime());
+
+ windService.save(wind);
+ } else if (data.startsWith("$WIXDR")) {
+
+
+ } else {
+ log.info("数据格式错误 ===> " + data);
+ }
+ }
+
+ public String asciiToString(byte[] bytes) {
+ StringBuilder builder = new StringBuilder();
+ for (byte aByte : bytes) {
+ String value = Character.toString((char) aByte);
+ builder.append(value);
+ }
+ return builder.toString();
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
new file mode 100644
index 0000000..c9d0126
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
@@ -0,0 +1,91 @@
+package com.casic.missiles.serialport;
+
+import gnu.io.NRSerialPort;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+/**
+ * @author a203
+ */
+@Slf4j
+public class SerialPortManager {
+ public static void setupSerialPortConfig(NRSerialPort serialPort) {
+ LinkedList cmd = new LinkedList<>();
+ //将参数配置发送给设备
+ int index = 0;
+ while (index < cmd.size()) {
+ sendToPort(serialPort, cmd.get(index));
+ try {
+ index++;
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 往串口发送数据
+ *
+ * @param serialPort 串口对象
+ * @param order 待发送数据
+ */
+ public static void sendToPort(NRSerialPort serialPort, byte[] order) {
+ log.info("串口发送数据 ===> " + Arrays.toString(order));
+ DataOutputStream outs = null;
+ try {
+ outs = new DataOutputStream(serialPort.getOutputStream());
+ outs.write(order);
+ outs.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (outs != null) {
+ outs.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 串口读取数据
+ *
+ * @param serialPort 串口对象
+ */
+ public static byte[] readFromPort(NRSerialPort serialPort) {
+ InputStream inputStream = null;
+ byte[] buffer = {};
+ try {
+ inputStream = serialPort.getInputStream();
+ //获得数据长度
+ int sum = inputStream.available();
+ while (sum != 0) {
+ if (inputStream.available() > 0) {
+ buffer = new byte[sum];
+ inputStream.read(buffer);
+ sum = inputStream.available();
+ }
+ }
+ return buffer;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer;
+ }
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
new file mode 100644
index 0000000..9c152fa
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
@@ -0,0 +1,21 @@
+package com.casic.missiles.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.casic.missiles.modular.system.dao.WindMapper;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 台风数据信息 服务实现类
+ *
+ * @author a203
+ */
+
+@Service
+public class WindServiceImpl extends ServiceImpl implements IWindService {
+
+ public WindServiceImpl() {
+
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
new file mode 100644
index 0000000..6dbc91d
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
@@ -0,0 +1,106 @@
+package com.casic.missiles.serialport;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import com.casic.missiles.modular.system.utils.TimeUtil;
+import gnu.io.NRSerialPort;
+import gnu.io.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.Set;
+import java.util.TooManyListenersException;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Component
+public class SerialPortInit implements CommandLineRunner {
+
+ /**
+ * 硬件端口名
+ */
+ @Value("${casic.serialPort.meteorology.name}")
+ private String serialPortName;
+
+ private NRSerialPort serialPort;
+ private final IWindService windService;
+
+ public SerialPortInit(IWindService windService) {
+ this.windService = windService;
+ }
+
+ /**
+ * 异步初始化硬件串口
+ */
+ @Async
+ @Override
+ public void run(String... args) {
+ Set allPorts = NRSerialPort.getAvailableSerialPorts();
+ log.info("Available port as follows " + JSON.toJSONString(allPorts));
+ if (!allPorts.isEmpty()) {
+ serialPort = new NRSerialPort(serialPortName, 4800);
+ try {
+ if (serialPort.connect()) {
+ try {
+ serialPort.addEventListener(serialPortEvent -> {
+ // 解决数据断行
+ try {
+ Thread.sleep(150);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+ analyzeData(SerialPortManager.readFromPort(serialPort));
+ } else {
+ log.info("The serial port status is abnormal");
+ serialPort.removeEventListener();
+ }
+ serialPort.notifyOnDataAvailable(true);
+ });
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("Meteorology port is not connected");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void analyzeData(byte[] bytes) {
+ String data = asciiToString(bytes);
+ log.info("串口收到数据 <=== " + data);
+ if (data.startsWith("$WIMWV")) {
+ //风向和风速
+ String[] splitData = data.split(",");
+ Wind wind = new Wind();
+ wind.setDegree(splitData[1].isEmpty() ? 0 : Integer.parseInt(splitData[1]));
+ wind.setSpeed(splitData[3].isEmpty() ? 0 : Double.parseDouble(splitData[3]));
+ wind.setCreateTime(TimeUtil.getCurrentTime());
+
+ windService.save(wind);
+ } else if (data.startsWith("$WIXDR")) {
+
+
+ } else {
+ log.info("数据格式错误 ===> " + data);
+ }
+ }
+
+ public String asciiToString(byte[] bytes) {
+ StringBuilder builder = new StringBuilder();
+ for (byte aByte : bytes) {
+ String value = Character.toString((char) aByte);
+ builder.append(value);
+ }
+ return builder.toString();
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
new file mode 100644
index 0000000..c9d0126
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
@@ -0,0 +1,91 @@
+package com.casic.missiles.serialport;
+
+import gnu.io.NRSerialPort;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+/**
+ * @author a203
+ */
+@Slf4j
+public class SerialPortManager {
+ public static void setupSerialPortConfig(NRSerialPort serialPort) {
+ LinkedList cmd = new LinkedList<>();
+ //将参数配置发送给设备
+ int index = 0;
+ while (index < cmd.size()) {
+ sendToPort(serialPort, cmd.get(index));
+ try {
+ index++;
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 往串口发送数据
+ *
+ * @param serialPort 串口对象
+ * @param order 待发送数据
+ */
+ public static void sendToPort(NRSerialPort serialPort, byte[] order) {
+ log.info("串口发送数据 ===> " + Arrays.toString(order));
+ DataOutputStream outs = null;
+ try {
+ outs = new DataOutputStream(serialPort.getOutputStream());
+ outs.write(order);
+ outs.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (outs != null) {
+ outs.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 串口读取数据
+ *
+ * @param serialPort 串口对象
+ */
+ public static byte[] readFromPort(NRSerialPort serialPort) {
+ InputStream inputStream = null;
+ byte[] buffer = {};
+ try {
+ inputStream = serialPort.getInputStream();
+ //获得数据长度
+ int sum = inputStream.available();
+ while (sum != 0) {
+ if (inputStream.available() > 0) {
+ buffer = new byte[sum];
+ inputStream.read(buffer);
+ sum = inputStream.available();
+ }
+ }
+ return buffer;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer;
+ }
+}
diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java
new file mode 100644
index 0000000..7d17a6d
--- /dev/null
+++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @author a203
+ */
+@Data
+@TableName("bus_env_wind")
+public class Wind extends Model {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "ID", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 风向,单位【度】
+ */
+ @TableField("DEGREE")
+ private Integer degree;
+
+ /**
+ * 风速,单位【米/每秒】
+ */
+ @TableField("SPEED")
+ private Double speed;
+
+ /**
+ * 收到数据的时间
+ */
+ @TableField("CREATE_TIME")
+ private String createTime;
+}
diff --git a/casic-environment/pom.xml b/casic-environment/pom.xml
index 2341650..d5805b1 100644
--- a/casic-environment/pom.xml
+++ b/casic-environment/pom.xml
@@ -51,6 +51,11 @@
okhttp
4.9.1
+
+ com.neuronrobotics
+ nrjavaserial
+ 5.1.1
+
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
new file mode 100644
index 0000000..e1be7ca
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/dao/WindMapper.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface WindMapper extends BaseMapper {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
new file mode 100644
index 0000000..d96f0cd
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/IWindService.java
@@ -0,0 +1,11 @@
+package com.casic.missiles.modular.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.casic.missiles.modular.system.model.Wind;
+
+/**
+ * @author a203
+ */
+public interface IWindService extends IService {
+
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
new file mode 100644
index 0000000..9c152fa
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/modular/system/service/impl/WindServiceImpl.java
@@ -0,0 +1,21 @@
+package com.casic.missiles.modular.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.casic.missiles.modular.system.dao.WindMapper;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 台风数据信息 服务实现类
+ *
+ * @author a203
+ */
+
+@Service
+public class WindServiceImpl extends ServiceImpl implements IWindService {
+
+ public WindServiceImpl() {
+
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
new file mode 100644
index 0000000..6dbc91d
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortInit.java
@@ -0,0 +1,106 @@
+package com.casic.missiles.serialport;
+
+import com.alibaba.fastjson.JSON;
+import com.casic.missiles.modular.system.model.Wind;
+import com.casic.missiles.modular.system.service.IWindService;
+import com.casic.missiles.modular.system.utils.TimeUtil;
+import gnu.io.NRSerialPort;
+import gnu.io.SerialPortEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.Set;
+import java.util.TooManyListenersException;
+
+/**
+ * @author a203
+ */
+@Slf4j
+@Component
+public class SerialPortInit implements CommandLineRunner {
+
+ /**
+ * 硬件端口名
+ */
+ @Value("${casic.serialPort.meteorology.name}")
+ private String serialPortName;
+
+ private NRSerialPort serialPort;
+ private final IWindService windService;
+
+ public SerialPortInit(IWindService windService) {
+ this.windService = windService;
+ }
+
+ /**
+ * 异步初始化硬件串口
+ */
+ @Async
+ @Override
+ public void run(String... args) {
+ Set allPorts = NRSerialPort.getAvailableSerialPorts();
+ log.info("Available port as follows " + JSON.toJSONString(allPorts));
+ if (!allPorts.isEmpty()) {
+ serialPort = new NRSerialPort(serialPortName, 4800);
+ try {
+ if (serialPort.connect()) {
+ try {
+ serialPort.addEventListener(serialPortEvent -> {
+ // 解决数据断行
+ try {
+ Thread.sleep(150);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
+ analyzeData(SerialPortManager.readFromPort(serialPort));
+ } else {
+ log.info("The serial port status is abnormal");
+ serialPort.removeEventListener();
+ }
+ serialPort.notifyOnDataAvailable(true);
+ });
+ } catch (TooManyListenersException e) {
+ e.printStackTrace();
+ }
+ } else {
+ log.info("Meteorology port is not connected");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void analyzeData(byte[] bytes) {
+ String data = asciiToString(bytes);
+ log.info("串口收到数据 <=== " + data);
+ if (data.startsWith("$WIMWV")) {
+ //风向和风速
+ String[] splitData = data.split(",");
+ Wind wind = new Wind();
+ wind.setDegree(splitData[1].isEmpty() ? 0 : Integer.parseInt(splitData[1]));
+ wind.setSpeed(splitData[3].isEmpty() ? 0 : Double.parseDouble(splitData[3]));
+ wind.setCreateTime(TimeUtil.getCurrentTime());
+
+ windService.save(wind);
+ } else if (data.startsWith("$WIXDR")) {
+
+
+ } else {
+ log.info("数据格式错误 ===> " + data);
+ }
+ }
+
+ public String asciiToString(byte[] bytes) {
+ StringBuilder builder = new StringBuilder();
+ for (byte aByte : bytes) {
+ String value = Character.toString((char) aByte);
+ builder.append(value);
+ }
+ return builder.toString();
+ }
+}
diff --git a/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
new file mode 100644
index 0000000..c9d0126
--- /dev/null
+++ b/casic-environment/src/main/java/com/casic/missiles/serialport/SerialPortManager.java
@@ -0,0 +1,91 @@
+package com.casic.missiles.serialport;
+
+import gnu.io.NRSerialPort;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+/**
+ * @author a203
+ */
+@Slf4j
+public class SerialPortManager {
+ public static void setupSerialPortConfig(NRSerialPort serialPort) {
+ LinkedList cmd = new LinkedList<>();
+ //将参数配置发送给设备
+ int index = 0;
+ while (index < cmd.size()) {
+ sendToPort(serialPort, cmd.get(index));
+ try {
+ index++;
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 往串口发送数据
+ *
+ * @param serialPort 串口对象
+ * @param order 待发送数据
+ */
+ public static void sendToPort(NRSerialPort serialPort, byte[] order) {
+ log.info("串口发送数据 ===> " + Arrays.toString(order));
+ DataOutputStream outs = null;
+ try {
+ outs = new DataOutputStream(serialPort.getOutputStream());
+ outs.write(order);
+ outs.flush();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (outs != null) {
+ outs.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 串口读取数据
+ *
+ * @param serialPort 串口对象
+ */
+ public static byte[] readFromPort(NRSerialPort serialPort) {
+ InputStream inputStream = null;
+ byte[] buffer = {};
+ try {
+ inputStream = serialPort.getInputStream();
+ //获得数据长度
+ int sum = inputStream.available();
+ while (sum != 0) {
+ if (inputStream.available() > 0) {
+ buffer = new byte[sum];
+ inputStream.read(buffer);
+ sum = inputStream.available();
+ }
+ }
+ return buffer;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return buffer;
+ }
+}
diff --git a/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java
new file mode 100644
index 0000000..7d17a6d
--- /dev/null
+++ b/casic-server-support/src/main/java/com/casic/missiles/modular/system/model/Wind.java
@@ -0,0 +1,38 @@
+package com.casic.missiles.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+
+/**
+ * @author a203
+ */
+@Data
+@TableName("bus_env_wind")
+public class Wind extends Model {
+ private static final long serialVersionUID = 1L;
+
+ @TableId(value = "ID", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 风向,单位【度】
+ */
+ @TableField("DEGREE")
+ private Integer degree;
+
+ /**
+ * 风速,单位【米/每秒】
+ */
+ @TableField("SPEED")
+ private Double speed;
+
+ /**
+ * 收到数据的时间
+ */
+ @TableField("CREATE_TIME")
+ private String createTime;
+}
diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml
index 172246e..597de2d 100644
--- a/casic-web/src/main/resources/config/application-dev.yml
+++ b/casic-web/src/main/resources/config/application-dev.yml
@@ -43,6 +43,11 @@
serverTarget: 8618765997865
#客户端目标号码,最多五个(不包括自己),多个号码用逗号隔开,通信方向:滑翔机------>指挥机
clientTarget: 8617400542542
+
+ #气象站串口
+ meteorology:
+ name: /dev/tty.usbserial-1120
+
logging:
level.root: info
level.com.casic: debug