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); 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; } } }