package com.fzzy.protocol.zldz.cmd; import com.fzzy.api.data.ApiCommonDevice; import com.fzzy.api.utils.BytesUtil; import com.fzzy.api.utils.ContextUtil; import com.fzzy.protocol.zldz.data.ReMessage; import com.fzzy.protocol.zldz.data.ReMessageBody; 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 device * @param strMsg * @return */ public ReMessage buildMessage(byte[] bytes, ApiCommonDevice device, String strMsg) { ReMessage message = new ReMessage(); message.setIp(device.getIp()); message.setPort(device.getPort()); 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 = device.getOrgId(); // 目标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; } }