与C通讯2

与C通信2

协议都是双方统一的

java端定义的报文

 

 

 

package cn.com.henan.socket;

import java.util.Calendar;
 


//此类试图将所有的通讯协议的编解码都包含在内!按照一次交互的过程来区分
public class newsDetail implements InewsDetail
{
	protected int		netErr;	//用来表示是不是网络出错了,主要是超时。这个时候就不需要检查其他参数了。
	protected int		type;	//就是对应具体的操作类型码
	protected byte[]	StreamID=new byte[16];	//对应具体的流水号
	protected byte[]	asyn = new byte[2];
	
	//这个还是有问题 不能达到预计效果 需要修改
	static private int 	seq=0;	//生成流水号后2位的时候使用的
	static private Calendar	lastCa;
	
	public newsDetail() 
	{
		getStreamID();
	}
	
	
	
	public int getType() {
		return type;
	}



	public void setType(int type) {
		this.type = type;
	}



	//基类中的编解码函数没有作用,具体使用的编解码函数在各个子类中需要重新实现
	//必须有返回值 因为调用者需要根据返回值做一些操作
	//这里的参数 buf是需要填写的缓冲区  start 是缓冲区开始位置 len 是可用的缓冲区长度
	public int encode(byte[] buf,int start,int len)
	{
		return 0;
	}
	//这里的参数 buf是需要需要解码的缓冲区  start 是缓冲区开始位置 len 是需要解码的长度
	public int decode(byte[] buf,int start,int len)
	{
		return 0;
	}

	public void getStreamID()
	{
		Calendar ca = Calendar.getInstance();
	      int year = ca.get(Calendar.YEAR);//获取年份
	      int month=ca.get(Calendar.MONTH)+1;//获取月份 
	      int day=ca.get(Calendar.DATE);//获取日
	      int minute=ca.get(Calendar.MINUTE);//分 
	      int hour=ca.get(Calendar.HOUR);//小时 
	      int second=ca.get(Calendar.SECOND);//秒
	      int am_pm=ca.get(Calendar.AM_PM);
	      if (am_pm==Calendar.PM)
	    	  hour += 12;
	      if (hour>=24)
	    	  hour -= 24;
	      
	    System.out.println(seq);
	       
	      if (lastCa!=ca)
	      {
	    	  lastCa = ca;
	    	  seq = 12;
	      }
	      else
	      {
	    	  seq++;
	    	  if (seq>=100)
	    		  seq = 0;
	      }
	      
	      //现在根据上面的字段组成StreamID字符串
	      //目前先使用手工的办法来写,效率高一些     
	      StreamID[0] = (byte)(year/1000+'0');
	      StreamID[1] = (byte)((year-(StreamID[0]-'0')*1000)/100+'0');
	      StreamID[2] = (byte)((year-(StreamID[0]-'0')*1000-(StreamID[1]-'0')*100)/10+'0');
	      StreamID[3] = (byte)(year-(StreamID[0]-'0')*1000-(StreamID[1]-'0')*100-(StreamID[2]-'0')*10+'0');
	      
	      StreamID[4] = (byte)(month/10+'0');
	      StreamID[5] = (byte)((month-(StreamID[4]-'0')*10)+'0');
	      
	      StreamID[6] = (byte)(day/10+'0');
	      StreamID[7] = (byte)((day-(StreamID[6]-'0')*10)+'0');
	      
	      StreamID[8] = (byte)(hour/10+'0');
	      StreamID[9] = (byte)((hour-(StreamID[8]-'0')*10)+'0');
	      
	      StreamID[10] = (byte)(minute/10+'0');
	      StreamID[11] = (byte)((minute-(StreamID[10]-'0')*10)+'0');
	      
	      StreamID[12] = (byte)(second/10+'0');
	      StreamID[13] = (byte)((second-(StreamID[12]-'0')*10)+'0');
	      
	      StreamID[14] = (byte)(seq/10+'0');
	      StreamID[15] = (byte)((seq-(StreamID[14]-'0')*10)+'0');   
	      
	      System.out.println("现在时间");
	      System.out.println("用Calendar.getInstance().getTime()方式显示时间: " + ca.getTime());
	      System.out.println("用Calendar获得日期是:" + year +"年"+ month +"月"+ day + "日");      
	      System.out.println("用Calendar获得时间是:" + hour +"时"+ minute +"分"+ second +"秒");
	
	      
	}
	

	public static void main(String[] args) 
	{
		{
			newsDetail nn1 = new newsDetail();
		}
		try {
			Thread.currentThread().sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		{
			newsDetail nn2 = new newsDetail();
		}
	      	


	}

}

 

 

 

 

 

package cn.com.henan.socket;

//针对操作类型码0x05 主要是发送彩信给指定用户使用的 add by ysen
public class newsDetailMMS extends newsDetail 
{
	//发送方设置
	private String   mmsfile;	//需要发送的文件名
	private int	    mmsfileL;	//彩信内容长度
	private int      isdnnum;	//接受方号码总数
	private String[] isdn;	    //接受方号码
 
	//接受方解码设置
	private int		result;	//接受结果
	private int		recvisdnnum;//实际接收的号码数
	
	private String   resultMessage;//操作解析的结果
	
	
	public newsDetailMMS() {
		super();
	}
	
	public int encode(byte[] buf,int start,int len)
	{
		//如果可用缓冲区小于最小字节要求 直接退出
		if(len<21)
			return -1;
		int 	step=start;
		System.out.println("This is a newsDetailMMS encode!");
		
		buf[step] = (byte)0x88;
		step++;
		buf[step] = (byte)0x88;
		step++;
		
		//长度 先预留 最后填写	
		step+=2;
		
		for (int i=0;i<16;i++)
			buf[step+i] = this.StreamID[i];
		step += 16;
		
		buf[step] = (byte)(this.type);
		step ++;
		
		buf[step] = (byte)(this.mmsfileL);
		step ++;
		
		for(int i=0;i<this.mmsfileL;i++){
			
			buf[step++]=this.mmsfile.getBytes()[i]; 
			
		}
		
		buf[step] = (byte) isdnnum;
		step ++;
		
		for(int i=0;i<this.isdnnum;i++){
			
			for(int num=0;num<11;num++){
				
				buf[step++]=this.isdn[i].getBytes()[num];
			}
			
		}
		
		//最后填写出长度字段 step-start-20  
		buf[start+2] =  (byte)((step-start-20)&0xff);
		buf[start+3] =  (byte)(((step-start-20)>>8)&0xff);
		
		return step;
		
		
		
	}
	
	//如果返回0  表示解码数据还不完整 正数就是解码的字节数 负数表示解码出错
	public int decode(byte[] buf,int start,int len)
	{
		int step=0;
		int		ltype;	//就是对应具体的操作类型码
		byte[]	lStreamID = new byte[16];
		byte[]	lasyn = new byte[2];
		int		datalen=0;
		
		
		System.out.println("This is a newsDetailMMS decode!");
		
		//如果头部还没有接受完整就不解码
		if (len<=20)
			return 0;
		
		lasyn[0] = buf[step];
		step++;
		
		lasyn[1] = buf[step];
		step++;
		
		//如果同步码不正确 后面就不需要解码了
		if ((lasyn[0]!=(byte)0x88)||(lasyn[1]!=(byte)0x88))
			return -1;
		
		datalen = (buf[step]&0xff)+(buf[step+1]<<8)&0xff00;
		step += 2;
		//如果数据部分还没有接受完全 也要退出
		if (datalen+20>len)
			return 0;
		
		for (int i=0;i<16;i++)
		{
			lStreamID[i] = buf[step+i];
			//如果STREAMID不一样 出错退出
			if (lStreamID[i]!=this.StreamID[i])
				return -1;
		}
		step += 16;
		
		ltype = buf[step];
		step++;
		if (ltype!=this.type)
			return -1;
		
		result = buf[step];
		step++;
		recvisdnnum = buf[step];
		step++;

		return step;
	}
	
	
	
	
	
	

	public String getResultMessage() {
		
		
	switch(this.result){
		
		case(1):this.resultMessage="成功,完整接收到所有号码";
				break;
		case(2):this.resultMessage="成功,只接收到部分号码";
				break;
		case(3):this.resultMessage="失败,彩信文件不存在";
				break;
		default:this.resultMessage="失败原因未知";
		
		}
		
		
		return resultMessage;
		
	 
	}

	public void setResultMessage(String resultMessage) {
		this.resultMessage = resultMessage;
	}

	public String getMmsfile() {
		return mmsfile;
	}

	public void setMmsfile(String mmsfile) {
		this.mmsfile = mmsfile;
	}

	public int getMmsfileL() {
		return mmsfileL;
	}

	public void setMmsfileL(int mmsfileL) {
		this.mmsfileL = mmsfileL;
	}

	public int getIsdnnum() {
		return isdnnum;
	}

	public void setIsdnnum(int isdnnum) {
		this.isdnnum = isdnnum;
	}

	public String[] getIsdn() {
		return isdn;
	}

	public void setIsdn(String[] isdn) {
		this.isdn = isdn;
	}

	public int getResult() {
		return result;
	}

	public void setResult(int result) {
		this.result = result;
	}

	public int getRecvisdnnum() {
		return recvisdnnum;
	}

	public void setRecvisdnnum(int recvisdnnum) {
		this.recvisdnnum = recvisdnnum;
	}

	public static void main(String[] args) 
	{
		

	}

}