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