⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lemessage.java

📁 中国移动定位引擎的客户端
💻 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 + -