diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java index 1acdc66..e7c6da0 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java @@ -7,9 +7,8 @@ */ public class ByteUtils { public static String bytesToHexString(byte[] data) { - int[] unsignedBytes = bytesToUnsigned(data); StringBuilder builder = new StringBuilder(); - for (int datum : unsignedBytes) { + for (int datum : data) { String hex = Integer.toHexString(datum); if (hex.length() < 2) { builder.append(0); diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java index 1acdc66..e7c6da0 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java @@ -7,9 +7,8 @@ */ public class ByteUtils { public static String bytesToHexString(byte[] data) { - int[] unsignedBytes = bytesToUnsigned(data); StringBuilder builder = new StringBuilder(); - for (int datum : unsignedBytes) { + for (int datum : data) { String hex = Integer.toHexString(datum); if (hex.length() < 2) { builder.append(0); 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 4d0e8cc..a4ec0c0 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 @@ -58,8 +58,14 @@ * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ public static byte[] createClientMessageCmd(String data) { - String cmd = "&" + data + "#"; - log.info(cmd); + //数据转byte数组 + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + //将源数据加密 + byte[] encrypt = TEA.encrypt(bytes); + //加密之后的数据转16进制 + String dataHex = ByteUtils.bytesToHexString(encrypt); + //将16进制密文和串口协议拼接然后再转byte数组发送出去 + String cmd = "&" + dataHex + "#"; return cmd.getBytes(StandardCharsets.UTF_8); } @@ -68,13 +74,16 @@ * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" */ public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(bytes); + String dataHex = ByteUtils.bytesToHexString(encrypt); int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + targetName + ",11,SEND," + clientName + ", " - + data + + dataHex + "$^\""; log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java index 1acdc66..e7c6da0 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java @@ -7,9 +7,8 @@ */ public class ByteUtils { public static String bytesToHexString(byte[] data) { - int[] unsignedBytes = bytesToUnsigned(data); StringBuilder builder = new StringBuilder(); - for (int datum : unsignedBytes) { + for (int datum : data) { String hex = Integer.toHexString(datum); if (hex.length() < 2) { builder.append(0); 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 4d0e8cc..a4ec0c0 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 @@ -58,8 +58,14 @@ * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ public static byte[] createClientMessageCmd(String data) { - String cmd = "&" + data + "#"; - log.info(cmd); + //数据转byte数组 + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + //将源数据加密 + byte[] encrypt = TEA.encrypt(bytes); + //加密之后的数据转16进制 + String dataHex = ByteUtils.bytesToHexString(encrypt); + //将16进制密文和串口协议拼接然后再转byte数组发送出去 + String cmd = "&" + dataHex + "#"; return cmd.getBytes(StandardCharsets.UTF_8); } @@ -68,13 +74,16 @@ * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" */ public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(bytes); + String dataHex = ByteUtils.bytesToHexString(encrypt); int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + targetName + ",11,SEND," + clientName + ", " - + data + + dataHex + "$^\""; log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java index ce24e40..6c3e5a6 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java @@ -15,6 +15,9 @@ }; public static byte[] encrypt(byte[] contentBytes) { + if (contentBytes.length < 2) { + return contentBytes; + } long k0 = KEY[0], k1 = KEY[1], k2 = KEY[2], k3 = KEY[3]; byte left = contentBytes[0], right = contentBytes[1]; //加密次数 @@ -31,6 +34,9 @@ } public static byte[] decrypt(byte[] encryptBytes) { + if (encryptBytes.length < 2) { + return encryptBytes; + } byte y = encryptBytes[0], z = encryptBytes[1]; int sum = 0xC6EF3720, i; long k0 = KEY[0], k1 = KEY[1], k2 = KEY[2], k3 = KEY[3]; diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java index 1acdc66..e7c6da0 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/ByteUtils.java @@ -7,9 +7,8 @@ */ public class ByteUtils { public static String bytesToHexString(byte[] data) { - int[] unsignedBytes = bytesToUnsigned(data); StringBuilder builder = new StringBuilder(); - for (int datum : unsignedBytes) { + for (int datum : data) { String hex = Integer.toHexString(datum); if (hex.length() < 2) { builder.append(0); 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 4d0e8cc..a4ec0c0 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 @@ -58,8 +58,14 @@ * &M# 天通北斗终端将视M为数据内容,将数据内容通过DTU发送给远端 */ public static byte[] createClientMessageCmd(String data) { - String cmd = "&" + data + "#"; - log.info(cmd); + //数据转byte数组 + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + //将源数据加密 + byte[] encrypt = TEA.encrypt(bytes); + //加密之后的数据转16进制 + String dataHex = ByteUtils.bytesToHexString(encrypt); + //将16进制密文和串口协议拼接然后再转byte数组发送出去 + String cmd = "&" + dataHex + "#"; return cmd.getBytes(StandardCharsets.UTF_8); } @@ -68,13 +74,16 @@ * *AT^IOTDATA=31,"^$CC0Z06,11,SEND,TT0Z07, 1234$^" */ public static byte[] createServerMessageCmd(String data, String targetName, String clientName) { + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + byte[] encrypt = TEA.encrypt(bytes); + String dataHex = ByteUtils.bytesToHexString(encrypt); int dataLength = 2 + targetName.length() + 9 + clientName.length() + 2 + data.length() + 2; String cmd = "*AT^IOTDATA=" + dataLength + ",\"^$" + targetName + ",11,SEND," + clientName + ", " - + data + + dataHex + "$^\""; log.info(cmd); return cmd.getBytes(StandardCharsets.UTF_8); diff --git a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java index ce24e40..6c3e5a6 100644 --- a/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java +++ b/casic-shelter/src/main/java/com/casic/missiles/modular/system/utils/TEA.java @@ -15,6 +15,9 @@ }; public static byte[] encrypt(byte[] contentBytes) { + if (contentBytes.length < 2) { + return contentBytes; + } long k0 = KEY[0], k1 = KEY[1], k2 = KEY[2], k3 = KEY[3]; byte left = contentBytes[0], right = contentBytes[1]; //加密次数 @@ -31,6 +34,9 @@ } public static byte[] decrypt(byte[] encryptBytes) { + if (encryptBytes.length < 2) { + return encryptBytes; + } byte y = encryptBytes[0], z = encryptBytes[1]; int sum = 0xC6EF3720, i; long k0 = KEY[0], k1 = KEY[1], k2 = KEY[2], k3 = KEY[3]; 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 c6782b9..e0bf4b3 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 @@ -122,11 +122,37 @@ //1.先得到发送的DTU数据 byte[] dtuData = new byte[data.length - 5]; System.arraycopy(data, 4, dtuData, 0, dtuData.length); - //2.DTU数据是加密过的,需要解密 -// String s = new String(TEA.decrypt(dtuData)); - String s = new String(dtuData); - saveDataLog(2, "", s, "0"); - sendToSocket(s); + log.info("dtuData ===> " + Arrays.toString(dtuData)); + //2.转16进制 + StringBuilder hexBuilder = new StringBuilder(); + for (byte dtuDatum : dtuData) { + hexBuilder.append((char) dtuDatum); + } + String s = hexBuilder.toString(); + log.info("s ===> " + s); + //3.去掉符号 + if (s.contains("FFFFFF")) { + s = s.replace("FFFFFF", ""); + } + log.info("s ===> " + s); + //4.DTU数据是加密过的,需要解密 + List ints = new ArrayList<>(); + for (int i = 0; i < s.length(); i += 2) { + String hex = s.substring(i, i + 2); + ints.add(Integer.parseInt(hex, 16)); + } + log.info("ints ===> " + ints); + byte[] bytes = new byte[ints.size()]; + for (int i = 0; i < ints.size(); i++) { + Integer integer = ints.get(i); + bytes[i] = integer.byteValue(); + } + log.info("bytes ===> " + Arrays.toString(bytes)); + byte[] decrypt = TEA.decrypt(bytes); + String message = new String(decrypt); + log.info("message ===> " + message); + saveDataLog(2, "", message, "0"); + sendToSocket(message); break; case 0x03: //数据发送成功