package com.fzzy.protocol.zldz.analysis;
|
|
import com.fzzy.api.Constant;
|
import com.fzzy.api.data.ApiCommonDevice;
|
import com.fzzy.api.utils.BytesUtil;
|
import com.fzzy.gateway.GatewayUtils;
|
import com.fzzy.gateway.entity.GatewayDevice;
|
import com.fzzy.protocol.zldz.cmd.ReMessageBuilder;
|
import com.fzzy.protocol.zldz.data.ReMessage;
|
import com.fzzy.protocol.zldz.server.ZldzServerUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Component;
|
import com.fzzy.protocol.zldz.util.*;
|
|
import javax.annotation.Resource;
|
|
|
/**
|
* 协议解析入口
|
*
|
* @author jiazx
|
*/
|
@Slf4j
|
@Component(AnalysisService.BEAN_ID)
|
public class AnalysisService {
|
|
public static final String BEAN_ID = "zldz.analysisService";
|
|
|
@Resource
|
private AnalysisGrain analysisGrain;
|
|
@Resource
|
private AnalysisTH analysisTH;
|
|
@Resource
|
private AnalysisConf analysisConf;
|
|
|
public void analysis(String ip, Integer port, String strMsg) {
|
|
ApiCommonDevice commonDevice = Constant.getCommonDeviceCacheByIp(ip);
|
|
ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(null, commonDevice, strMsg);
|
|
if (null == reMessage) {
|
log.error("分机----->>>平台:返回信息没有获取组织编码信息,无法继续解析----{}", commonDevice.getIp());
|
return;
|
}
|
|
//获取设备信息
|
GatewayDevice device = GatewayUtils.getCacheByDeviceSn(commonDevice.getSn());
|
if (null == device) {
|
log.error("分机----->>>平台:为获取到设备配置信息,无法继续解析----{}", commonDevice.getIp());
|
return;
|
}
|
|
String checkMsg = this.checkMsg(reMessage, device);
|
|
if (null != checkMsg) {
|
log.error("分机----->>>平台:命令验证异常:异常信息-{},报文信息-{}", checkMsg, reMessage.getStrMsg());
|
return;
|
}
|
|
switch (reMessage.getMessageType()) {
|
case ZldzServerUtil.MSG_TYPE_8828:// 温湿度解析
|
analysisTH.analysis8828(reMessage, device);
|
break;
|
|
case ZldzServerUtil.MSG_TYPE_8815:// 终端应答粮情请求
|
analysisGrain.analysis8815(reMessage, device);
|
break;
|
|
case ZldzServerUtil.MSG_TYPE_1117:// 粮情数据信息
|
analysisGrain.analysis8817(reMessage, device);
|
break;
|
case ZldzServerUtil.MSG_TYPE_1129:// 终端发送通道电缆数据给后台
|
analysisConf.analysis1129(reMessage, device);
|
break;
|
case ZldzServerUtil.MSG_TYPE_8816:// 解析配置
|
analysisConf.analysis8816(reMessage, device,commonDevice);
|
break;
|
case ZldzServerUtil.MSG_TYPE_8822:// 电缆初始化成功
|
analysisConf.analysis8822(reMessage, device);
|
break;
|
case ZldzServerUtil.MSG_TYPE_8823:// 电缆汇总应答
|
analysisConf.analysis8823(reMessage, device);
|
break;
|
|
case ZldzServerUtil.MSG_TYPE_8825:// 读取通道电缆配置
|
analysisConf.analysis8825(reMessage, device);
|
break;
|
|
case ZldzServerUtil.MSG_TYPE_8826:// 修改电缆的返回
|
analysisConf.analysis8826(reMessage, device);
|
break;
|
default:
|
break;
|
}
|
}
|
|
/**
|
* 校验,正常返回NULL,异常返回异常原因,正常异常原因返回不踢掉重新连接
|
*
|
* @param message
|
* @param device
|
* @return
|
* @throws Exception
|
*/
|
private String checkMsg(ReMessage message, GatewayDevice device) {
|
String result;
|
if (message.getResult() == 1) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:接收的应答校验异常";
|
return result;
|
}
|
if (message.getResult() == 2) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:发送的数据校验异常";
|
return result;
|
}
|
if (message.getResult() == 3) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:排队中";
|
return result;
|
}
|
if (message.getResult() == 4) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:发送超时错误";
|
return result;
|
}
|
if (message.getResult() == 9) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:Io模块不在线";
|
return result;
|
}
|
if (message.getResult() == 10) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:发送中";
|
return result;
|
}
|
if (message.getResult() == 11) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:无线模块故障";
|
return result;
|
}
|
if (message.getResult() == 12) {
|
result = "分机=" + device.getDeviceName()
|
+ " 协议解析失败,原因:主要是反馈坐标点交换命令或者是电缆修改命令的错误,或者粮情采集的参数不对";
|
return result;
|
}
|
if (message.getResult() == 13) {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:网关未注册";
|
return result;
|
}
|
|
// 获取校验的报文信息
|
int end = 4 + 18 * 2 + message.getBody().getLength() * 2;
|
String checkStr = message.getStrMsg().substring(4, end);
|
|
byte[] byteCrc16 = BytesUtil.hexStrToBytes(checkStr);
|
short crc16Hex2 = CRC8.calculateCrc16(byteCrc16, (short) 0,
|
(short) (byteCrc16.length));
|
byte[] crc16Hex2Bytes = BytesUtil.shortToByte(crc16Hex2);
|
int crc16 = BytesUtil.bytesToInt(crc16Hex2Bytes);
|
String hexCrc16 = BytesUtil.intToHexStr(crc16);
|
|
if (message.getHexCrc16().equals(hexCrc16)) {
|
return null;
|
} else {
|
result = "分机=" + device.getDeviceName() + " 协议解析失败,原因:CRC16校验异常";
|
return result;
|
}
|
}
|
|
}
|