diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java index 5f0cb71..87191e7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java @@ -10,20 +10,26 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author a203 */ @Slf4j +@Service public class BootNettyServer { + @Value("${casic.socket.port}") + private Integer port; + private final ISocketService socketService; public BootNettyServer(ISocketService socketService) { this.socketService = socketService; } - public void bind(int port) { + public void bind() { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @@ -60,7 +66,7 @@ pipeline.addLast(new ChannelHandlerAdapter(socketService)); } }); - log.info("端口已开启,占用" + port + "端口号...."); + log.info("Socket port has open, and Port:" + port + " has been occupied...."); /** * 绑定端口,同步等待成功 */ diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java index 5f0cb71..87191e7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java @@ -10,20 +10,26 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author a203 */ @Slf4j +@Service public class BootNettyServer { + @Value("${casic.socket.port}") + private Integer port; + private final ISocketService socketService; public BootNettyServer(ISocketService socketService) { this.socketService = socketService; } - public void bind(int port) { + public void bind() { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @@ -60,7 +66,7 @@ pipeline.addLast(new ChannelHandlerAdapter(socketService)); } }); - log.info("端口已开启,占用" + port + "端口号...."); + log.info("Socket port has open, and Port:" + port + " has been occupied...."); /** * 绑定端口,同步等待成功 */ diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java index 1d5e791..789ab42 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java @@ -14,6 +14,7 @@ import gnu.io.SerialPortEvent; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; @@ -37,6 +38,11 @@ private final ILogService logService; private final ISatelliteService satelliteService; + @Value("${casic.serialPort.name}") + private String serialPortName; + @Value("${casic.serialPort.isClient}") + private boolean isClient; + private NRSerialPort serialPort; private ChannelHandlerContext channelHandler; @@ -62,44 +68,33 @@ this.channelHandler = ctx; //初始化串口 Set allPorts = NRSerialPort.getAvailableSerialPorts(); + log.info("Available port as follows " + JSON.toJSONString(allPorts)); if (!allPorts.isEmpty()) { - boolean isClient; - if (allPorts.contains(Constant.USB_CLIENT_SERIAL)) { - isClient = true; - serialPort = new NRSerialPort(Constant.USB_CLIENT_SERIAL, Constant.BAUD_RATE); - } else if (allPorts.contains(Constant.USB_SERVER_SERIAL)) { - isClient = false; - serialPort = new NRSerialPort(Constant.USB_SERVER_SERIAL, Constant.BAUD_RATE); - } else { - isClient = false; - log.info("无可用串口"); + serialPort = new NRSerialPort(serialPortName, Constant.BAUD_RATE); + serialPort.connect(); + try { + serialPort.addEventListener(serialPortEvent -> { + // 解决数据断行 + try { + Thread.sleep(500); + } 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(); } - if (serialPort != null) { - serialPort.connect(); - try { - serialPort.addEventListener(serialPortEvent -> { - // 解决数据断行 - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - analyzeData(SerialPortManager.readFromPort(serialPort)); - } else { - log.info("串口状态异常"); - serialPort.removeEventListener(); - } - serialPort.notifyOnDataAvailable(true); - }); - } catch (TooManyListenersException e) { - e.printStackTrace(); - } - if (isClient) { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); - } else { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); - } + if (isClient) { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); + } else { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); } } } @@ -125,9 +120,8 @@ case 0x02: //数据接收 //1.先得到发送的DTU数据 - byte[] dtuData = new byte[data.length - 4]; - System.arraycopy(data, 4, dtuData, 0, data.length - 4); - sendToSocket(new String(dtuData)); + byte[] dtuData = new byte[data.length - 5]; + System.arraycopy(data, 4, dtuData, 0, dtuData.length); //2.DTU数据是加密过的,需要解密 String s = new String(TEA.decrypt(dtuData)); saveDataLog(2, "", s, "0"); @@ -136,7 +130,6 @@ case 0x03: //数据发送成功 saveDataLog(2, "", "SEND DATA SUCCESS!", "0"); - sendToSocket("SEND DATA SUCCESS!"); break; case 0x04: //数据发送失败 @@ -311,7 +304,11 @@ /** * 数据加密之后再与卫星通信 * */ - bytes = CommandManager.createMessageCmd(decodeSMS); + if (isClient) { + bytes = CommandManager.createClientMessageCmd(decodeSMS); + } else { + bytes = CommandManager.createServerMessageCmd(decodeSMS, "CC0Z06", "TT0Z07"); + } } if (serialPort != null && serialPort.isConnected()) { SerialPortManager.sendToPort(serialPort, bytes); @@ -415,6 +412,6 @@ dataLog.setDataContent(JSON.toJSONString(data)); } dataLog.setStatus(status); - logService.save(dataLog); +// logService.save(dataLog); } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java index 5f0cb71..87191e7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java @@ -10,20 +10,26 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author a203 */ @Slf4j +@Service public class BootNettyServer { + @Value("${casic.socket.port}") + private Integer port; + private final ISocketService socketService; public BootNettyServer(ISocketService socketService) { this.socketService = socketService; } - public void bind(int port) { + public void bind() { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @@ -60,7 +66,7 @@ pipeline.addLast(new ChannelHandlerAdapter(socketService)); } }); - log.info("端口已开启,占用" + port + "端口号...."); + log.info("Socket port has open, and Port:" + port + " has been occupied...."); /** * 绑定端口,同步等待成功 */ diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java index 1d5e791..789ab42 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java @@ -14,6 +14,7 @@ import gnu.io.SerialPortEvent; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; @@ -37,6 +38,11 @@ private final ILogService logService; private final ISatelliteService satelliteService; + @Value("${casic.serialPort.name}") + private String serialPortName; + @Value("${casic.serialPort.isClient}") + private boolean isClient; + private NRSerialPort serialPort; private ChannelHandlerContext channelHandler; @@ -62,44 +68,33 @@ this.channelHandler = ctx; //初始化串口 Set allPorts = NRSerialPort.getAvailableSerialPorts(); + log.info("Available port as follows " + JSON.toJSONString(allPorts)); if (!allPorts.isEmpty()) { - boolean isClient; - if (allPorts.contains(Constant.USB_CLIENT_SERIAL)) { - isClient = true; - serialPort = new NRSerialPort(Constant.USB_CLIENT_SERIAL, Constant.BAUD_RATE); - } else if (allPorts.contains(Constant.USB_SERVER_SERIAL)) { - isClient = false; - serialPort = new NRSerialPort(Constant.USB_SERVER_SERIAL, Constant.BAUD_RATE); - } else { - isClient = false; - log.info("无可用串口"); + serialPort = new NRSerialPort(serialPortName, Constant.BAUD_RATE); + serialPort.connect(); + try { + serialPort.addEventListener(serialPortEvent -> { + // 解决数据断行 + try { + Thread.sleep(500); + } 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(); } - if (serialPort != null) { - serialPort.connect(); - try { - serialPort.addEventListener(serialPortEvent -> { - // 解决数据断行 - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - analyzeData(SerialPortManager.readFromPort(serialPort)); - } else { - log.info("串口状态异常"); - serialPort.removeEventListener(); - } - serialPort.notifyOnDataAvailable(true); - }); - } catch (TooManyListenersException e) { - e.printStackTrace(); - } - if (isClient) { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); - } else { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); - } + if (isClient) { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); + } else { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); } } } @@ -125,9 +120,8 @@ case 0x02: //数据接收 //1.先得到发送的DTU数据 - byte[] dtuData = new byte[data.length - 4]; - System.arraycopy(data, 4, dtuData, 0, data.length - 4); - sendToSocket(new String(dtuData)); + byte[] dtuData = new byte[data.length - 5]; + System.arraycopy(data, 4, dtuData, 0, dtuData.length); //2.DTU数据是加密过的,需要解密 String s = new String(TEA.decrypt(dtuData)); saveDataLog(2, "", s, "0"); @@ -136,7 +130,6 @@ case 0x03: //数据发送成功 saveDataLog(2, "", "SEND DATA SUCCESS!", "0"); - sendToSocket("SEND DATA SUCCESS!"); break; case 0x04: //数据发送失败 @@ -311,7 +304,11 @@ /** * 数据加密之后再与卫星通信 * */ - bytes = CommandManager.createMessageCmd(decodeSMS); + if (isClient) { + bytes = CommandManager.createClientMessageCmd(decodeSMS); + } else { + bytes = CommandManager.createServerMessageCmd(decodeSMS, "CC0Z06", "TT0Z07"); + } } if (serialPort != null && serialPort.isConnected()) { SerialPortManager.sendToPort(serialPort, bytes); @@ -415,6 +412,6 @@ dataLog.setDataContent(JSON.toJSONString(data)); } dataLog.setStatus(status); - logService.save(dataLog); +// logService.save(dataLog); } } diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 6932811..dd26429 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,14 +1,11 @@ package com.casic.missiles; import com.casic.missiles.socket.BootNettyServer; -import com.casic.missiles.socket.service.ISocketService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -26,16 +23,12 @@ @EnableAsync @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) -@PropertySource("classpath:/config/socket.yml") @EnableScheduling @SpringBootApplication public class CasicApplication implements CommandLineRunner { - @Value("${port}") - private Integer port; - @Resource - private ISocketService socketService; + private BootNettyServer bootNettyServer; public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); @@ -48,6 +41,6 @@ /** * 使用异步注解方式启动netty服务端服务 */ - new BootNettyServer(socketService).bind(port); + bootNettyServer.bind(); } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java index 5f0cb71..87191e7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java @@ -10,20 +10,26 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author a203 */ @Slf4j +@Service public class BootNettyServer { + @Value("${casic.socket.port}") + private Integer port; + private final ISocketService socketService; public BootNettyServer(ISocketService socketService) { this.socketService = socketService; } - public void bind(int port) { + public void bind() { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @@ -60,7 +66,7 @@ pipeline.addLast(new ChannelHandlerAdapter(socketService)); } }); - log.info("端口已开启,占用" + port + "端口号...."); + log.info("Socket port has open, and Port:" + port + " has been occupied...."); /** * 绑定端口,同步等待成功 */ diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java index 1d5e791..789ab42 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java @@ -14,6 +14,7 @@ import gnu.io.SerialPortEvent; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; @@ -37,6 +38,11 @@ private final ILogService logService; private final ISatelliteService satelliteService; + @Value("${casic.serialPort.name}") + private String serialPortName; + @Value("${casic.serialPort.isClient}") + private boolean isClient; + private NRSerialPort serialPort; private ChannelHandlerContext channelHandler; @@ -62,44 +68,33 @@ this.channelHandler = ctx; //初始化串口 Set allPorts = NRSerialPort.getAvailableSerialPorts(); + log.info("Available port as follows " + JSON.toJSONString(allPorts)); if (!allPorts.isEmpty()) { - boolean isClient; - if (allPorts.contains(Constant.USB_CLIENT_SERIAL)) { - isClient = true; - serialPort = new NRSerialPort(Constant.USB_CLIENT_SERIAL, Constant.BAUD_RATE); - } else if (allPorts.contains(Constant.USB_SERVER_SERIAL)) { - isClient = false; - serialPort = new NRSerialPort(Constant.USB_SERVER_SERIAL, Constant.BAUD_RATE); - } else { - isClient = false; - log.info("无可用串口"); + serialPort = new NRSerialPort(serialPortName, Constant.BAUD_RATE); + serialPort.connect(); + try { + serialPort.addEventListener(serialPortEvent -> { + // 解决数据断行 + try { + Thread.sleep(500); + } 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(); } - if (serialPort != null) { - serialPort.connect(); - try { - serialPort.addEventListener(serialPortEvent -> { - // 解决数据断行 - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - analyzeData(SerialPortManager.readFromPort(serialPort)); - } else { - log.info("串口状态异常"); - serialPort.removeEventListener(); - } - serialPort.notifyOnDataAvailable(true); - }); - } catch (TooManyListenersException e) { - e.printStackTrace(); - } - if (isClient) { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); - } else { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); - } + if (isClient) { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); + } else { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); } } } @@ -125,9 +120,8 @@ case 0x02: //数据接收 //1.先得到发送的DTU数据 - byte[] dtuData = new byte[data.length - 4]; - System.arraycopy(data, 4, dtuData, 0, data.length - 4); - sendToSocket(new String(dtuData)); + byte[] dtuData = new byte[data.length - 5]; + System.arraycopy(data, 4, dtuData, 0, dtuData.length); //2.DTU数据是加密过的,需要解密 String s = new String(TEA.decrypt(dtuData)); saveDataLog(2, "", s, "0"); @@ -136,7 +130,6 @@ case 0x03: //数据发送成功 saveDataLog(2, "", "SEND DATA SUCCESS!", "0"); - sendToSocket("SEND DATA SUCCESS!"); break; case 0x04: //数据发送失败 @@ -311,7 +304,11 @@ /** * 数据加密之后再与卫星通信 * */ - bytes = CommandManager.createMessageCmd(decodeSMS); + if (isClient) { + bytes = CommandManager.createClientMessageCmd(decodeSMS); + } else { + bytes = CommandManager.createServerMessageCmd(decodeSMS, "CC0Z06", "TT0Z07"); + } } if (serialPort != null && serialPort.isConnected()) { SerialPortManager.sendToPort(serialPort, bytes); @@ -415,6 +412,6 @@ dataLog.setDataContent(JSON.toJSONString(data)); } dataLog.setStatus(status); - logService.save(dataLog); +// logService.save(dataLog); } } diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 6932811..dd26429 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,14 +1,11 @@ package com.casic.missiles; import com.casic.missiles.socket.BootNettyServer; -import com.casic.missiles.socket.service.ISocketService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -26,16 +23,12 @@ @EnableAsync @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) -@PropertySource("classpath:/config/socket.yml") @EnableScheduling @SpringBootApplication public class CasicApplication implements CommandLineRunner { - @Value("${port}") - private Integer port; - @Resource - private ISocketService socketService; + private BootNettyServer bootNettyServer; public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); @@ -48,6 +41,6 @@ /** * 使用异步注解方式启动netty服务端服务 */ - new BootNettyServer(socketService).bind(port); + bootNettyServer.bind(); } } diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 1c637ed..6f7a330 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -24,6 +24,13 @@ db: init: enable: false + + socket: + port: 12208 + + serialPort: + name: /dev/tty.usbserial-1130 + isClient: false logging: level.root: info level.com.casic: debug diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java index 9812134..1769a50 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/CommandManager.java @@ -16,11 +16,21 @@ public static final String CMD_WORK_MODE = "*W:DEV:S"; public static final String CMD_CENTER_NUMBER = "*W:SCA:8617400010200"; public static final String CMD_CLIENT_NUMBER = "*W:SN:TT0Z07"; - public static final String CMD_SERVER_NUMBER = "*W:SN:CC0Z06"; + public static final String CMD_SERVER_NUMBER = "*W:SN:C"; private static final String CMD_SIGNAL = "*XF,S5,#"; /** + * 指挥机登录指令 + * *AT^IOTDATA=24,"^$CC0Z06,11,LOGIN,d, D$^" + */ + public static byte[] createServerLoginCmd(String serverName) { + int dataLength = 2 + serverName.length() + 16; + String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + serverName + ",11,LOGIN,d, D$^\""; + return cmd.getBytes(StandardCharsets.UTF_8); + } + + /** * 设置短信发送目的地的号码数量 */ public static byte[] createTargetNumberCmd(String[] numbers) { @@ -44,10 +54,10 @@ } /** - * &M# 天通北斗终端将视M为数据内容,将数据内容通过SMS或DTU发送给远端 - * 发送成功通过串口返回SENDDATA,OK(帧格式) ,发送未成功返回SENDDATA,ERR(帧格式) + * 客户端发送指令 + * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ - public static byte[] createMessageCmd(String data) { + public static byte[] createClientMessageCmd(String data) { byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); byte[] encrypt = TEA.encrypt(smsBytes); StringBuilder builder = new StringBuilder(); @@ -58,4 +68,27 @@ log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); } + + /** + * 指挥机发送指令 + * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" + */ + public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] smsBytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(smsBytes); + StringBuilder builder = new StringBuilder(); + for (int b : ByteUtils.bytesToUnsigned(encrypt)) { + builder.append(Integer.toString(b, 16)); + } + int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; + String cmd = "*AT^IOTDATA=" + + dataLength + + ",\"^$^" + targetName + + ",11,SEND," + clientName + + ", " + + builder + + "$^\""; + log.info(cmd); + return cmd.getBytes(StandardCharsets.UTF_8); + } } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java index 84c3e72..5b3b353 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/Constant.java @@ -15,13 +15,4 @@ public static final int MAX_AGE = 240; public static final int MIN_AGE = 1; public static final int BAUD_RATE = 115200; - - /** - * 天通客户端串口名 - * */ - public static final String USB_CLIENT_SERIAL = "/dev/tty.usbserial-FTAQ6T45"; - /** - * 天通指挥机串口名 - * */ - public static final String USB_SERVER_SERIAL = "/dev/tty.usbserial-1120"; } diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java index a07e787..eb3a5b7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/SerialPortManager.java @@ -19,14 +19,14 @@ * 客户端参数设置指令 */ public static final List CLIENT_CMD = Arrays.asList( + /*设置天通终端天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通终端天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8617400542542"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置终端号码*/ @@ -37,18 +37,20 @@ * 指挥机参数设置指令 */ public static final List SERVER_CMD = Arrays.asList( + /*设置天通指挥机天线工作模式*/ + CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置天通关闭Debug模式*/ CommandManager.CMD_CLOSE_DEBUG.getBytes(StandardCharsets.UTF_8), /*设置天通连续快速传输模式*/ CommandManager.CMD_DTU_MODE.getBytes(StandardCharsets.UTF_8), - /*设置天通指挥机天线工作模式*/ - CommandManager.CMD_WORK_MODE.getBytes(StandardCharsets.UTF_8), /*设置短信发送目的地的号码数量*/ - CommandManager.createTargetNumberCmd(new String[]{"8617400542542", "8618765997865"}), + CommandManager.createTargetNumberCmd(new String[]{"8618765997865"}), /*设置短信中心号码SCA*/ CommandManager.CMD_CENTER_NUMBER.getBytes(StandardCharsets.UTF_8), /*设置指挥机号码*/ - CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8) + CommandManager.CMD_SERVER_NUMBER.getBytes(StandardCharsets.UTF_8), + /*登录*/ + CommandManager.createServerLoginCmd("CC0Z06") ); public static void setupSerialPortConfig(NRSerialPort serialPort, List cmd) { @@ -57,7 +59,7 @@ SerialPortManager.sendToPort(serialPort, cmd.get(index)); try { index++; - Thread.sleep(500); + Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java index 5f0cb71..87191e7 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/BootNettyServer.java @@ -10,20 +10,26 @@ import io.netty.handler.codec.string.StringEncoder; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; /** * @author a203 */ @Slf4j +@Service public class BootNettyServer { + @Value("${casic.socket.port}") + private Integer port; + private final ISocketService socketService; public BootNettyServer(ISocketService socketService) { this.socketService = socketService; } - public void bind(int port) { + public void bind() { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { @@ -60,7 +66,7 @@ pipeline.addLast(new ChannelHandlerAdapter(socketService)); } }); - log.info("端口已开启,占用" + port + "端口号...."); + log.info("Socket port has open, and Port:" + port + " has been occupied...."); /** * 绑定端口,同步等待成功 */ diff --git a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java index 1d5e791..789ab42 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java +++ b/casic-shelter/src/main/java/com/casic/missiles/socket/service/impl/SocketServiceImpl.java @@ -14,6 +14,7 @@ import gnu.io.SerialPortEvent; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; @@ -37,6 +38,11 @@ private final ILogService logService; private final ISatelliteService satelliteService; + @Value("${casic.serialPort.name}") + private String serialPortName; + @Value("${casic.serialPort.isClient}") + private boolean isClient; + private NRSerialPort serialPort; private ChannelHandlerContext channelHandler; @@ -62,44 +68,33 @@ this.channelHandler = ctx; //初始化串口 Set allPorts = NRSerialPort.getAvailableSerialPorts(); + log.info("Available port as follows " + JSON.toJSONString(allPorts)); if (!allPorts.isEmpty()) { - boolean isClient; - if (allPorts.contains(Constant.USB_CLIENT_SERIAL)) { - isClient = true; - serialPort = new NRSerialPort(Constant.USB_CLIENT_SERIAL, Constant.BAUD_RATE); - } else if (allPorts.contains(Constant.USB_SERVER_SERIAL)) { - isClient = false; - serialPort = new NRSerialPort(Constant.USB_SERVER_SERIAL, Constant.BAUD_RATE); - } else { - isClient = false; - log.info("无可用串口"); + serialPort = new NRSerialPort(serialPortName, Constant.BAUD_RATE); + serialPort.connect(); + try { + serialPort.addEventListener(serialPortEvent -> { + // 解决数据断行 + try { + Thread.sleep(500); + } 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(); } - if (serialPort != null) { - serialPort.connect(); - try { - serialPort.addEventListener(serialPortEvent -> { - // 解决数据断行 - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (serialPortEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - analyzeData(SerialPortManager.readFromPort(serialPort)); - } else { - log.info("串口状态异常"); - serialPort.removeEventListener(); - } - serialPort.notifyOnDataAvailable(true); - }); - } catch (TooManyListenersException e) { - e.printStackTrace(); - } - if (isClient) { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); - } else { - SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); - } + if (isClient) { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.CLIENT_CMD); + } else { + SerialPortManager.setupSerialPortConfig(serialPort, SerialPortManager.SERVER_CMD); } } } @@ -125,9 +120,8 @@ case 0x02: //数据接收 //1.先得到发送的DTU数据 - byte[] dtuData = new byte[data.length - 4]; - System.arraycopy(data, 4, dtuData, 0, data.length - 4); - sendToSocket(new String(dtuData)); + byte[] dtuData = new byte[data.length - 5]; + System.arraycopy(data, 4, dtuData, 0, dtuData.length); //2.DTU数据是加密过的,需要解密 String s = new String(TEA.decrypt(dtuData)); saveDataLog(2, "", s, "0"); @@ -136,7 +130,6 @@ case 0x03: //数据发送成功 saveDataLog(2, "", "SEND DATA SUCCESS!", "0"); - sendToSocket("SEND DATA SUCCESS!"); break; case 0x04: //数据发送失败 @@ -311,7 +304,11 @@ /** * 数据加密之后再与卫星通信 * */ - bytes = CommandManager.createMessageCmd(decodeSMS); + if (isClient) { + bytes = CommandManager.createClientMessageCmd(decodeSMS); + } else { + bytes = CommandManager.createServerMessageCmd(decodeSMS, "CC0Z06", "TT0Z07"); + } } if (serialPort != null && serialPort.isConnected()) { SerialPortManager.sendToPort(serialPort, bytes); @@ -415,6 +412,6 @@ dataLog.setDataContent(JSON.toJSONString(data)); } dataLog.setStatus(status); - logService.save(dataLog); +// logService.save(dataLog); } } diff --git a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java index 6932811..dd26429 100644 --- a/casic-web/src/main/java/com/casic/missiles/CasicApplication.java +++ b/casic-web/src/main/java/com/casic/missiles/CasicApplication.java @@ -1,14 +1,11 @@ package com.casic.missiles; import com.casic.missiles.socket.BootNettyServer; -import com.casic.missiles.socket.service.ISocketService; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; -import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; @@ -26,16 +23,12 @@ @EnableAsync @EnableCaching @EnableTransactionManagement(proxyTargetClass = true) -@PropertySource("classpath:/config/socket.yml") @EnableScheduling @SpringBootApplication public class CasicApplication implements CommandLineRunner { - @Value("${port}") - private Integer port; - @Resource - private ISocketService socketService; + private BootNettyServer bootNettyServer; public static void main(String[] args) { SpringApplication.run(CasicApplication.class, args); @@ -48,6 +41,6 @@ /** * 使用异步注解方式启动netty服务端服务 */ - new BootNettyServer(socketService).bind(port); + bootNettyServer.bind(); } } diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 1c637ed..6f7a330 100644 --- a/casic-web/src/main/resources/config/application-dev.yml +++ b/casic-web/src/main/resources/config/application-dev.yml @@ -24,6 +24,13 @@ db: init: enable: false + + socket: + port: 12208 + + serialPort: + name: /dev/tty.usbserial-1130 + isClient: false logging: level.root: info level.com.casic: debug diff --git a/casic-web/src/main/resources/config/socket.yml b/casic-web/src/main/resources/config/socket.yml deleted file mode 100644 index 7a9010d..0000000 --- a/casic-web/src/main/resources/config/socket.yml +++ /dev/null @@ -1,2 +0,0 @@ -socket: - port:12208 \ No newline at end of file