package com.ld.igds.protocol.zldz.analysis.builder; import com.ld.igds.protocol.zldz.analysis.message.ReMessage; import com.ld.igds.protocol.zldz.analysis.message.ReMessageBody; import com.ld.igds.util.BytesUtil; import com.ld.igds.util.ContextUtil; import java.util.Date; /** * 根据接收到的信息进行封装 * * @author Andy */ public class ReMessageBuilder { private final static ReMessageBuilder instance = new ReMessageBuilder(); private ReMessageBuilder() { } public static ReMessageBuilder getInstance() { return instance; } /** * 使用中发现CRC16可能以EE结尾,NETTY误以为是结尾导致截取少了一个EE,当前方法必须从头向后截取,保证CRC16的位置准确 * * @param bytes * @param ip * @param port * @param strMsg * @return */ public ReMessage buildMessage(byte[] bytes, String ip, int port, String strMsg) { ReMessage message = new ReMessage(); message.setIp(ip); message.setPort(port); message.setStrMsg(strMsg); message.setByteMsg(bytes); // 源ID,分机唯一ID int start = 2, len = 2; String temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setSourceId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + ""); //分机所属组织编码 String companyId = ContextUtil.getCompanyIdBySn(message.getSourceId()); // 目标ID start = 4; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setTargetId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + ""); // 发送ID start = 6; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setSendId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + ""); // 路由信息,不解析 // 消息类型 start = 12; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setMessageType(BytesUtil.tran_LH(temp)); // 处理结果 start = 14; len = 1; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setResult(BytesUtil.hexToInt(temp)); // 组织编码 start = 15; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); if(null == companyId){ message.setCompanyId(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)) + ""); }else{ message.setCompanyId(companyId); } //包头校验 start = 17; len = 1; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setHexCrc8(temp); // 命令体-长度 message.setBody(buildBody()); start = 18; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); int bodyLen = BytesUtil.hexToInt(BytesUtil.tran_LH(temp)); message.getBody().setLength(bodyLen); //命令体-内容 start = 20; len = bodyLen; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.getBody().setContent(temp); // crc16验证 start = 20 + bodyLen; len = 2; temp = strMsg.substring(start * 2, start * 2 + len * 2); message.setHexCrc16(temp); message.setReceiveDate(new Date()); message.setBatchId(ContextUtil.getDefaultBatchId()); return message; } /** * 创建BODY对象 * * @param * @return */ public ReMessageBody buildBody() { ReMessageBody body = new ReMessageBody(); body.setLength(0); body.setContent(""); return body; } }