📄 lemessage.java
字号:
package ffcs.lbp.le.message;
import java.nio.ByteBuffer;
import ffcs.config.Config;
import ffcs.lbp.LbpMessage;
import ffcs.lbp.MessageParseException;
import ffcs.lbp.ProtocolException;
import ffcs.lbp.common.LbpUtil;
import ffcs.util.SysUtil;
/**
* <p>Title: 内部协议解析</p>
* <p>Description: 内部协议解析基类</p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: 福富软件</p>
* @author chenxin
* @version 1.0
*/
public abstract class LeMessage extends LbpMessage {
public static final int Login = 0x00000001; //登陆包
public static final int LoginRsp= 0x80000001; //登陆应答
public static final int Link = 0x00000002; //连接检测
public static final int LinkRsp = 0x80000002; //连接检测应答
public static final int GetUserLoc= 0x0000000B; //获取用户位置
public static final int GetUserLocRsp= 0x8000000B; //获取用户位置应答
public static final int AddLocUser= 0x0000000C; //增加定位用户
public static final int AddLocUserRsp= 0x8000000C; //增加定位用户应答
public static final int DelLocUser= 0x0000000D; //删除定位用户
public static final int DelLocUserRsp= 0x8000000D; //删除定位用户应答
public static final int UserTrig= 0x0000000E; // 用户触发
public static final int UserTrigRsp= 0x8000000E ; //用户触发应答
public static final int CycLoc = 0x01100001; //周期性定位请求
public static final int CycLocRsp= 0x81100001; //周期性定位请求应答
public static final int StopCycLoc= 0x01100002; //终止周期性定位请求
public static final int StopCycLocRsp= 0x81100002; //终止周期性定位请求应答
public static final int LocReport = 0x01100003; //周期性定位报告
public static final int TriArea = 0x01100006; //区域触发定位请求
public static final int TriAreaRsp= 0x81100006; //区域触发定位请求应答
public static final int TriAreaReport =0x01100007; //区域触发定位报告
public static final int TriAreaStop= 0x01100008; //终止区域触发定位请求
public static final int TriAreaStopRsp= 0x81100008; //终止区域触发定位请求应答
public static final int Dstan = 0x01100009; //定点测距请求
public static final int DstanRsp = 0x81100009; //定点测距请求应答
public static final int DstanReport= 0x0110000A; //定点测距报告
public static final int MAX_PACKAGE_SIZE=4096;
public final static int HEADER_LENGTH=24;
private boolean readHeader = false; //标记头部是否读完
private boolean writeHeader = false; //标记头部是否写完
private static int getSystemIdCount=0;
protected int PackLength;
protected int CommandId ;
protected int SequenceId;
protected int PackFlag ;
protected int OrgSystemID=0x20001;
protected int DstSystemID;
public LeMessage(int command) {
this(command,LbpUtil.getNextSeqNum());
}
public LeMessage(int command,int seqNum) {
CommandId = command;
SequenceId = seqNum;
defaultSystemId();
}
/**
* 读取协议包的包体
* @param buf ByteBuffer
* @throws MessageParseException
* @return boolean
*/
protected abstract boolean readBody(ByteBuffer buf) throws
ProtocolException;
/**
* 读取协议包的包体
* @param buf ByteBuffer
* @return boolean
*/
protected abstract boolean writeBody(ByteBuffer buf);
/**
* 得到包体的长度,因为包体的长度是动态的,不同包的计算方式不一样,所以在具体的子类中实现
* @return int
*/
protected abstract int getBodyLength();
public boolean readMsg(ByteBuffer buf) throws ProtocolException {
if(buf.remaining()<HEADER_LENGTH){
return false;
}
readHeader(buf);
return readBody(buf);
}
public boolean writeMsg(ByteBuffer buf) {
// write a header if not written yet.
if (!writeHeader) {
writeHeader = writeHeader(buf);
if (!writeHeader)
return false; // buffer is almost full perhaps
}
// check if there is enough space to write body
if (buf.remaining() < getBodyLength()) {
return false;
}
// Header is written, now try to write body
if (writeBody(buf)) {
// finished writing single complete message
writeHeader = false;
return true;
} else {
return false;
}
}
protected boolean writeHeader(ByteBuffer buf){
// check if there is enough space to write header
if (buf.remaining() < HEADER_LENGTH) {
return false;
}
buf.putInt(getPackLength());
buf.putInt(CommandId);
buf.putInt(SequenceId);
buf.putInt(PackFlag);
buf.putInt(OrgSystemID);
buf.putInt(DstSystemID);
writeHeader = true;
return true;
}
protected boolean readHeader(ByteBuffer buf)throws LeProtocolException {
if (buf.remaining() < HEADER_LENGTH) {
return false;
}
PackLength = buf.getInt();
CommandId = buf.getInt();
if (!checkCommandID(CommandId)) {
throw new LeProtocolException ("解析内部协议包头的命令ID错误,非法的命令ID:" +
CommandId);
}
SequenceId = buf.getInt();
PackFlag = buf.getInt();
OrgSystemID = buf.getInt();
DstSystemID = buf.getInt();
return true;
}
private void defaultSystemId(){
if(getSystemIdCount<1){
OrgSystemID = SysUtil.makeSystemId(SysUtil.LocSmf,Config.getInstance().getGlobalProp("moduleNo"));
// DstSystemID = SysUtil.makeSystemId(SysUtil.SendRcvManage,Config.getInstance().getModule("SendRcvMgr").getProperties("ModuleNo"));
getSystemIdCount++;
}
}
public static boolean checkCommandID(int comID) {
switch (comID) {
case Login :
break;
case LoginRsp :
break;
case Link :
break;
case LinkRsp :
break;
case GetUserLoc :
break;
case GetUserLocRsp :
break;
case AddLocUser :
break;
case AddLocUserRsp :
break;
case DelLocUser :
break;
case DelLocUserRsp :
break;
case UserTrig :
break;
case UserTrigRsp :
break;
case CycLoc :
break;
case CycLocRsp :
break;
case StopCycLoc :
break;
case StopCycLocRsp:
break;
case LocReport :
break;
/* case TriArea :
break;
case TriAreaRsp :
break;
case TriAreaReport :
break;
case TriAreaStop :
break;
case TriAreaStopRsp :
break;
case Dstan :
break;
case DstanRsp :
break;
case DstanReport :
break;*/
// case RunTest :
// break;
// case Fllow :
// break;
default:
return false;
}
return true;
}
public static LeMessage createPDU(int commandId){
switch (commandId) {
case LeMessage.Login :
return new Login();
case LeMessage.LoginRsp :
return new LoginRsp();
case LeMessage.Link :
return new Link();
case LeMessage.LinkRsp :
return new LinkRsp();
case LeMessage.GetUserLoc :
return new GetUserLoc();
case LeMessage.GetUserLocRsp :
return new GetUserLocRsp();
case LeMessage.AddLocUser :
return new AddLocUser();
case LeMessage.AddLocUserRsp :
return new AddLocUserRsp();
case LeMessage.DelLocUser :
return new DelLocUser();
case LeMessage.DelLocUserRsp :
return new DelLocUserRsp();
case LeMessage.UserTrig :
return new UserTrig();
case LeMessage.UserTrigRsp :
return new UserTrigRsp();
case LeMessage.CycLoc :
return new CycLoc();
case LeMessage.CycLocRsp :
return new CycLocRsp();
case LeMessage.LocReport :
return new LocReport();
case LeMessage.StopCycLoc :
return new StopCycLoc();
case LeMessage.StopCycLocRsp:
return new StopCycLocRsp();
case LeMessage.TriArea :
return new TriArea();
case LeMessage.TriAreaRsp :
return new TriAreaRsp();
case LeMessage.TriAreaReport :
return new TriAreaReport();
case LeMessage.TriAreaStop :
return new TriAreaStop();
case LeMessage.TriAreaStopRsp :
return new TriAreaStopRsp();
case LeMessage.Dstan :
return new Dstan();
case LeMessage.DstanRsp :
return new DstanRsp();
case LeMessage.DstanReport :
return new DstanReport();
default:return null;
}
}
/**
* 返回消息简单信息
* 该方法似toString方法,但比toString方法返回的信息更简要,
* 主要用来调试用
* @return 返回字符串信息
*/
public String getSimpleInfo(){
return toString();
}
public String toString(){
StringBuffer sb=new StringBuffer("");
sb.append("PackLength");
sb.append("=0x");
sb.append(intToHex(this.getPackLength()));
sb.append(" ");
sb.append("CommandId");
sb.append("=0x");
sb.append(intToHex(CommandId));
sb.append(" ");
sb.append("SequenceId");
sb.append("=0x");
sb.append(intToHex(SequenceId));
sb.append(" ");
sb.append("PackFlag");
sb.append("=0x");
sb.append(intToHex(PackFlag));
sb.append(" ");
sb.append("OrgSystemID");
sb.append("=0x");
sb.append(intToHex(OrgSystemID));
sb.append(" ");
sb.append("DstSystemID");
sb.append("=0x");
sb.append(intToHex(DstSystemID));
sb.append(" ");
return sb.toString();
}
public int getCommandId() {
return CommandId;
}
public void setCommandId(int commandId) {
CommandId = commandId;
}
public int getDstSystemID() {
return DstSystemID;
}
public void setDstSystemID(int dstSystemID) {
DstSystemID = dstSystemID;
}
public int getOrgSystemID() {
return OrgSystemID;
}
public void setOrgSystemID(int orgSystemID) {
OrgSystemID = orgSystemID;
}
public int getPackFlag() {
return PackFlag;
}
public void setPackFlag(int packFlag) {
PackFlag = packFlag;
}
public int getPackLength() {
return (HEADER_LENGTH+getBodyLength());
}
public void setPackLength(int packLength) {
PackLength = packLength;
}
public int getSequenceId() {
return SequenceId;
}
public void setSequenceId(int sequenceId) {
SequenceId = sequenceId;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -