package com.disruptor.util;
import io.netty.channel.ChannelHandlerContext;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author bluekingzmm
* @desc
* @date 2022年06月20日
*/
public class ChannelhandlerUtils {
private static ConcurrentHashMap<String, ChannelHandlerContext> concurrentHashMap = new ConcurrentHashMap<>();
public static void set(String equipCode, ChannelHandlerContext channelHandlerContext) {
concurrentHashMap.put(equipCode, channelHandlerContext);
}
public static ChannelHandlerContext get(String equipCode) {
return concurrentHashMap.get(equipCode);
}
}
package com.disruptor.util;
import org.assertj.core.util.DateUtil;
import java.util.Arrays;
import java.util.List;
/**
* @desc
* @auth bluekingzmm
* @date 2021年07月25日
*/
public class NettyUtil {
/**
* 过滤替换netty
*
* @param code
* @return
*/
public static String filterNettyCode(String code) {
String newCode = code.replace(" ", "-");
if (code.equals(newCode)) {
//未知的空格,只能通过正则替换
newCode = newCode.replaceAll("\\u00A0+", "-");
}
// String newCode=convetCode(code);
List<String> strings = Arrays.asList(newCode.split("-"));
StringBuilder stringBuilder = new StringBuilder();
if (newCode.contains("-")) {
for (String string : strings) {
if ("0x7e".equals(string)) {
string = "0x7d0x02";
} else if ("0x7d".equals(string)) {
string = "0x7d0x01";
}
stringBuilder.append(string);
}
// newCode = "0x7e" + stringBuilder.toString() + "0x7e";
}
return stringBuilder.toString();
}
public static void main(String[] args) {
// System.out.println(filterNettyCode("0x300x7e0x080x7d0x55"));
// System.out.println(convetCode("0x300x7e0x080x7d0x55"));
// String s = "7e56fe012021070274617d0251bb0004001a0100000000000000000000000000617d024c8c617d024ca572a104c30e7e";
// System.out.println(s);
// byte[] b = HexString2Bytes(s);
// String bytes2HexString = Bytes2HexString(b);
// System.out.println(bytes2HexString);
// String nettyCode = filterNettyCode(bytes2HexString);
// System.out.println(nettyCode);
// String a = "56 01 01 20 21 07 02 74 61 7e 51 bb 00 04 00 00";
// System.out.println(getCheckXOR(a.replace(" ", "")));
// System.out.println(getBCC(a.replace(" ", "")));
// System.out.println(getCheckXOR("5001012021070417618939410026"));
// String code = "7e56fe012021070446618682b700e400 1a03 072c3f1e01e0f11d000000000061868199618681b592f7f8c2b67e";
// System.out.println(code);
// String aa = "7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e56fe01202107015261ce93dd0019001a03072c698801e0e449000000000061ce933661ce9371520802c3477e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93ea001a0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00000a0000a52061ce92a4000000d300000000000000940000000000000072000000000000003e2a7e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce93f7001b0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000dd000000000000009400000000000000720000000000000048447e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9403001c0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000e7000000000000009400000000000000720000000000000052907e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce9410001d0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000f100000000000000940000000000000072000000000000005c9a7e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce941d001e0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000000000a52061ce92a4000000fb000000000000009400000000000000720000000000000066a47e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce9429001f0046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc0000020000a52061ce92a4000001050000000000000094000000000000007200000000000000707a7e7e50fe01202107015261ce943500200046a10461ce92a4a20e03072c698801e0e4490000000000a304520802c3a406cc00001e0000a52061ce92a40000010f000000000000009e000000000000007900000000000000704e7e";
// System.out.println(aa);
// String aaa = "7e56fe012021070274617d0251bb0004001a0100000000000000000000000000617d024c8c617d024ca572a104c30e7e";
// String aaa="7e53fe01202107047061dd34de348d001e02c702c303072c4fe001e0c59500000000000c0081618df9a9618df9ae01e27e";
String aaa = "7eadfe0120210704626216EC811efa00280001000a0a0a0a0a0a0a0a0a0a0a0a0a0a0a000ae67e";
System.out.println("replyVerification:" + replyVerification(aaa));
// System.out.println(StringUtil.numToHex64(Long.parseLong("1641391078")));
String s1 = StringUtil.hexToTenStr("61e0efc0");
System.out.println("s1:" + s1);
System.out.println("oooo:" + replyVerification("7eadfe0120210704626216EC811efa00280001000a0a0a0a0a0a0a0a0a0a0a0a0a0a0a000ae67e"));
}
/**
* 异或校验 返回应答数据
*
* @param code
* @return
*/
public static String replyVerification(String code) {
//1.先将msg转成7d02-7e
code = StringUtil.forwardParseRule(code);
//2、取消息头数据
String replyMessage = code.substring(2, 18);
//3、判断应答表识是否是fe,如果是,需要做应答
String fe = replyMessage.substring(2, 4);
String timeStamp = timeStamp();
String time = StringUtil.numToHex64(Long.parseLong(timeStamp));
String bodyLength = code.substring(26, 30);
if ("fe".equals(fe)) {
//4、将应答表识别改成结果 01,为成功
replyMessage = replyMessage.replace("fe", "01");
//5、计算异或校验
String s = replyMessage + time + code.substring(26, 30).replace("fe", "01");
;
String checkXOR = getCheckXOR(s);
//6、重新转译
replyMessage = replyMessage + time + bodyLength + "0000" + checkXOR;
replyMessage = replyMessage.replace("7e", "7d02");
return "7e" + replyMessage + "7e";
}
return "";
}
public static String timeStamp() {
long time = System.currentTimeMillis();
String t = String.valueOf(time / 1000L);
return t;
}
/**
* 校验和 互相异或 计算
* 传字符串
* 例如:“AA55040002DA”
* 结果:23
*/
public static String getCheckXOR(String s) {
String regex = "(.{2})";
String replace = s.replaceAll(regex, "$1 ");
String[] st = replace.split(" ");
int[] c = new int[st.length + 1];
for (int i = 0; i < st.length; i++) {
int i1 = Integer.parseInt(st[i], 16);
c[i] = i1;
}
char x = 0;
for (int i = 0; i < c.length; i++)
x ^= c[i];
return String.format("%x", (int) x);
}
/**
* 16进制转x0
*
* @param code
* @return
*/
public static String hexStringCode(String code) {
byte[] b = HexString2Bytes(code);
String bytes2HexString = Bytes2HexString(b);
return bytes2HexString;
}
/**
* @param b byte[]
* @return String
*/
public static String Bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += " 0x" + hex.toUpperCase();
}
return ret;
}
/**
* 将两个ASCII字符合成一个字节; 如:"EF"–> 0xEF
*
* @param src0 byte
* @param src1 byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/**
* 将指定字符串src,以每两个字符分割转换为16进制形式 如:"2B44EFD9" –> byte[]{0x2B, 0×44, 0xEF,
* 0xD9}
*
* @param src String
* @return byte[]
*/
public static byte[] HexString2Bytes(String src) {
if (null == src || 0 == src.length()) {
return null;
}
byte[] ret = new byte[src.length() / 2];
byte[] tmp = src.getBytes();
for (int i = 0; i < (tmp.length / 2); i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
public static short charToHex(char x) { //将单个char转换为Hex
short result = 0;
switch (x) {
case 'a':
result = 10;
break;
case 'b':
result = 11;
break;
case 'c':
result = 12;
break;
case 'd':
result = 13;
break;
case 'e':
result = 14;
break;
case 'f':
result = 15;
break;
case 'A':
result = 10;
break;
case 'B':
result = 11;
break;
case 'C':
result = 12;
break;
case 'D':
result = 13;
break;
case 'E':
result = 14;
break;
case 'F':
result = 15;
break;
default:
result = (short) Character.getNumericValue(x);
break;
}
return result;
}
}
package com.disruptor.util;
import org.springframework.util.StringUtils;
import java.math.BigInteger;
public class StringUtil {
public static final String RULE_7D02 = "7d02";
public static final String RULE_7D01 = "7d01";
public static final String RULE_7E = "7e";
public static final String RULE_7d = "7d";
public static String forwardParseRule(String message) {
if (StringUtils.isEmpty(message)) {
return null;
}
// 反转的时候,需要去掉头标识位和尾标识位
message = message.substring(2,message.length() - 2);
if (message.contains(RULE_7D02)) {
message = message.replace(RULE_7D02, RULE_7E);
}
if (message.contains(RULE_7D01)) {
message = message.replace(RULE_7D01, RULE_7d);
}
message = RULE_7E + message + RULE_7E;
return message;
}
/**
* 消息内容转义
*
* @return
*/
public static String msgTransferMean(String message) {
if (StringUtils.isEmpty(message)) {
return null;
}
int totalLength = message.length();
// 去除起始标识符和结束标识符
String messageAfterRemoveStartAndEndTag = message.substring(2, totalLength - 2);
return messageAfterRemoveStartAndEndTag;
}
/**
* 字符串转换为16进制字符串
*
* @param s
* @return
*/
public static String stringToHexString(String s) {
String str = "";
for (int i = 0; i < s.length(); i++) {
int ch = (int) s.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
return str;
}
public static void main(String[] args) {
String msg="877e";
byte[] bytes = StringUtil.hexStringToBytes(msg);
String message = StringUtil.bytesToHexString(bytes);
System.out.println(message);
System.out.println(StringUtil.hexToTenStr(msg));
// System.out.println(getTurn("3"));
//
// System.out.println(codeTransform("1",2));
}
/**
* 16进制字符串转换为字符串
*
* @param s
* @return
*/
public static String hexStringToString(String s) {
if (s == null || s.equals("")) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(
s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "gbk");
new String();
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
}
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
public static String BytesHexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
// toUpperCase将字符串中的所有字符转换为大写
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
// toCharArray将此字符串转换为一个新的字符数组。
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
//charToByte返回在指定字符的第一个发生的字符串中的索引,即返回匹配字符
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
//设备code转化为16进制不满12位填充0
public static String codeTransform(String str,Integer count) {
Long l;
l = Long.valueOf(str);
String s = Long.toHexString(l);
int length = s.length();
if (length < count) {
for (int j = 0; j < count - length; j++) {
s = "0" + s;
}
}
return s;
}
public static String getDefinedLengthStr(String message, int length) {
int a = length - message.length();
StringBuilder stringBuilder = new StringBuilder(message);
for (int i = 0; i < a; i++) {
stringBuilder.append("0");
}
return stringBuilder.toString();
}
public static String hexToTenStr(String hexStr) {
BigInteger x = new BigInteger(hexStr, 16);
return x + "";
}
public static String hexTenToSixteenStr(String hexStr) {
String format = String.format("%08X", hexStr);
return format;
}
/**
* 使用8个字节表示
* @param b 10进制整型
* @return 16进制字符串
*/
public static String numToHex64(long b) {
return String.format("%08x", b);
}
//字符串转16进制不满足条件补足0
public static String getTurn(String s1) {
if (StringUtils.isEmpty(s1)) {
s1 = "0";
}
Integer i;
i = Integer.parseInt(s1);
String s2 = Integer.toHexString(i);
int l = s2.length();
if (l < 2) {
for (int j = 0; j < 2 - l; j++) {
s2 = "0" + s2;
}
}
return s2;
}
//随机生成n位16进制数
public static String randomlyGenerated(int n) {
String str = "";
for (int i = 0; i < n; i++) {
char temp = 0;
int key = (int) (Math.random() * 2);
switch (key) {
case 0:
temp = (char) (Math.random() * 10 + 48);//产生随机数字
break;
case 1:
temp = (char) (Math.random() * 6 + 'a');//产生a-f
break;
default:
break;
}
str = str + temp;
}
return str;
}
}