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