|
|
@@ -39,7 +39,10 @@ public class MonitorDatasynch {
|
|
|
try {
|
|
|
if (dataBuf.isReadable()) {
|
|
|
// 读取并转换 ByteBuf 中的数据为16进制字符串
|
|
|
- String oldDataStr = StringUtil.toHexString(dataBuf.array(), dataBuf.readerIndex(), dataBuf.readableBytes());
|
|
|
+ byte[] dataByte = new byte[dataBuf.readableBytes()];
|
|
|
+ dataBuf.readBytes(dataByte);
|
|
|
+ // 读取并转换 ByteBuf 中的数据为16进制字符串
|
|
|
+ String oldDataStr = HexToImageConverter.bytesToHex(dataByte);
|
|
|
|
|
|
log.info("==========接收到数据:" + oldDataStr + "==========");
|
|
|
|
|
|
@@ -54,13 +57,13 @@ public class MonitorDatasynch {
|
|
|
nowCode = DataCheckUtil.getCRC16Result(codeStr);
|
|
|
|
|
|
//先将两个字符串转换为相同的大小写形式(默认是小写)
|
|
|
- if (code.equalsIgnoreCase(nowCode)) {
|
|
|
+ if (code.equals(nowCode)) {
|
|
|
boolean flag = false;
|
|
|
// dataType == "32" 遥测站定时报,"33" 遥测站加时报,"34" 遥测站小时报,"36" 查询/报送 JPG 图片信息
|
|
|
// 获取报文特征
|
|
|
String dataType = oldDataStr.substring(20, 22);
|
|
|
|
|
|
- if (!"2F".equalsIgnoreCase(dataType)) {
|
|
|
+ if (!"2F".equals(dataType)) {
|
|
|
if ("36".equals(dataType)) {
|
|
|
// 获取数据正文
|
|
|
String dataStr = oldDataStr.substring(26, oldDataStr.length() - 6);
|
|
|
@@ -83,78 +86,14 @@ public class MonitorDatasynch {
|
|
|
} else {
|
|
|
log.info("收到数据========", oldDataStr);
|
|
|
}
|
|
|
- } else {
|
|
|
- /**
|
|
|
- * 图片数据第一条分段接收的问题进行合并
|
|
|
- */
|
|
|
- //开始符
|
|
|
- String startCharacter = oldDataStr.substring(0, 4);
|
|
|
- //结束符
|
|
|
- // 获取字符串的长度
|
|
|
- int length = oldDataStr.length();
|
|
|
-
|
|
|
- // 计算倒数第5位和第6位的位置
|
|
|
- int pos5 = length - 5;
|
|
|
- int pos6 = length - 6;
|
|
|
-
|
|
|
- // 截取倒数第5位到倒数第6位的子字符串
|
|
|
- String subStr = oldDataStr.substring(pos6, pos5 + 1);
|
|
|
- if(!"7E7E".equalsIgnoreCase(startCharacter) || !"17".equals(subStr)) {
|
|
|
- // 将不完整数据存入data1List
|
|
|
- synchronized (lock) {
|
|
|
- data1List.add(oldDataStr);
|
|
|
- }
|
|
|
- StringBuilder dataBuilder = new StringBuilder();
|
|
|
- if (data1List.size() >= 2) {
|
|
|
- for (String data : data1List) {
|
|
|
- dataBuilder.append(data);
|
|
|
- }
|
|
|
- }
|
|
|
- if (dataBuilder != null && dataBuilder.length() > 6) {
|
|
|
- //开始符
|
|
|
- String dataBuilderStartCharacter = dataBuilder.substring(0, 4);
|
|
|
- // 获取字符串的长度
|
|
|
- int dataLength = dataBuilder.length();
|
|
|
- // 计算倒数第5位和第6位的位置
|
|
|
- int dataPos5 = dataLength - 5;
|
|
|
- int dataPos6 = dataLength - 6;
|
|
|
- // 截取倒数第5位到倒数第6位的子字符串
|
|
|
- String dataSubStr = dataBuilder.substring(dataPos6, dataPos5 + 1);
|
|
|
- if (!"7E7E".equalsIgnoreCase(dataBuilderStartCharacter) && !"17".equals(dataSubStr)) {
|
|
|
- return response;
|
|
|
- } else {
|
|
|
- oldDataStr = dataBuilder.toString();
|
|
|
- System.out.println("组合不完整数据dataBuilder======" + dataBuilder);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 获取报文特征
|
|
|
- String dataType = oldDataStr.substring(20, 22);
|
|
|
-
|
|
|
- // 获取检验码数据
|
|
|
- String codeStrBuilder = oldDataStr.substring(0, oldDataStr.length() - 4);
|
|
|
- // 获取数据CRC16检验码
|
|
|
- String codeBuilder = oldDataStr.substring(oldDataStr.length() - 4);
|
|
|
-
|
|
|
- // 通过数据生成CRC16校验码
|
|
|
- String nowCodeBuilder = DataCheckUtil.getCRC16Result(codeStrBuilder);
|
|
|
- if(codeBuilder.equalsIgnoreCase(nowCodeBuilder)) {
|
|
|
- if ("36".equals(dataType)) {
|
|
|
- // 获取数据正文
|
|
|
- String dataStr = oldDataStr.substring(26, oldDataStr.length() - 6);
|
|
|
- log.info("数据主体正文:" + dataStr);
|
|
|
- pictureMessageService.savePictureMessage(oldDataStr, dataStr);
|
|
|
- }
|
|
|
- }else{
|
|
|
- log.info("==========数据解包校验不正确==========");
|
|
|
- }
|
|
|
+ }else {
|
|
|
+ log.info("==========数据解包校验不正确==========");
|
|
|
}
|
|
|
} else {
|
|
|
log.info("==========数据长度格式不正确==========");
|
|
|
}
|
|
|
- }finally {
|
|
|
- // 确保在方法结束前释放 ByteBuf
|
|
|
- dataBuf.release();
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
return response;
|
|
|
}
|