`
ysen
  • 浏览: 122184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

与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) 
	{
		

	}

}

 

 

 

 

 

 

分享到:
评论

相关推荐

    PHP怎么与C语言通信

    ### PHP与C语言之间的通信机制 #### 一、引言 在现代软件开发中,不同编程语言间的交互是非常常见的需求之一。PHP作为一种广泛应用于Web开发的脚本语言,经常需要与其他语言编写的后端服务进行通信。其中,PHP与...

    I2C通信程序的C语言详细

    总结来说,I2C通信程序的C语言实现涉及理解I2C协议、配置微控制器的GPIO和I2C控制器、以及正确处理开始、停止、读写操作。通过使用库函数和错误处理机制,可以构建稳定可靠的I2C通信系统。在实践中,不断调试和优化...

    I2C.zip_PCF8574_Proteus使用8574_c51 i2c通信_c语言i2c通信_proteus 7se

    标题中的"I2C.zip_PCF8574_Proteus使用8574_c51 i2c通信_c语言i2c通信_proteus 7se"表明了这个压缩包内容是关于I2C通信协议的实践教程,具体是通过AT89C51微控制器与PCF8574扩展I/O接口芯片之间的交互。这里我们将...

    C语言通信程序

    《C语言通信程序:连接PC与PIC单片机的实践指南》 在现代电子系统设计中,PC(个人计算机)与各种嵌入式处理器如PIC单片机的通信扮演着至关重要的角色。C语言,作为一种广泛应用的编程语言,因其简洁、高效而常被...

    广东工业大学研究生初试试试卷信号与信息处理,通信,电子与通信c语言

    2. **指针与内存管理**:指针是C语言的一大特色,能够直接操作内存,理解指针与数组、函数之间的关系至关重要。此外,动态内存分配(malloc/free)也是常见的考点。 3. **结构体与联合体**:结构体用于组合不同类型...

    用C语言实现SPI通信协议

    SPI(Serial Peripheral Interface)通信协议是一种同步串行接口,常用于微控制器与各种外围设备之间的数据传输。在C语言环境中,实现SPI通信涉及到对硬件寄存器的操作、时序控制以及数据帧格式的理解。FPGA(Field-...

    串口通信(内含完整的C语言代码)

    串口通信(内含完整的C语言代码)

    java 与C语言使用socket通信传递结构体数据

    在跨语言编程中,有时我们需要Java程序与C语言程序通过网络进行通信,这时可以利用Socket进行数据传输。本文将深入探讨如何使用Java模拟C语言的结构体,以便于两者之间通过Socket进行有效通信。 首先,我们需要理解...

    c语言串口通信范例

    ### C语言串口通信经典范例解析 #### 一、串口通信基础知识 在深入了解本文提供的C语言串口通信范例之前,我们首先简要回顾一下串口通信的基础概念。 **串行通信**是一种数据传输方式,其中数据一位接一位地进行...

    通用I2C通信源程序

    【通用I2C通信源程序】是一个专门为单片机项目开发的C语言代码库,它提供了I2C通信协议的实现,适用于各种不同的应用场景。I2C(Inter-Integrated Circuit)是一种多主控、双向二线制同步串行总线,由飞利浦(现为...

    51单片机基于C语言双机通信

    它涵盖了串行通信、电源线载波调制解调、错误检测与纠正等多个方面,对于提升电子工程师的技能和知识面有着重要的价值。通过实际项目的学习和实践,可以加深对这一技术的理解,进一步提升在嵌入式系统设计中的能力。

    Linux C语言版串口通信代码

    2. `demo.c`:这是一个演示程序,它调用了`serialport.c`中的函数,展示了如何在实际应用中使用串口通信功能。用户可以通过编译并运行这个示例来了解如何与串口设备交互。 3. `serialport.h`:这是一个头文件,包含...

    51单片机C语言实现GPRS通信

    "RTC.c"可能实现了实时时钟功能,通常也是通过I2C接口与单片机通信。 "SW485.c"是关于RS-485通信协议的实现。RS-485是一种用于长距离、多点通信的电气标准,适合工业环境中的分布式系统。在C51单片机上实现485通信...

    51串口通信c语言程序

    根据给定的文件信息,我们可以深入探讨51单片机串口通信的C语言程序设计。串口通信是计算机科学中一种重要的数据传输方式,尤其在嵌入式系统开发中非常常见。对于51单片机而言,串口通信是实现设备间数据交换的基本...

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf

    C语言实现socket通信

    本教程将深入探讨如何使用C语言实现基于Socket的客户端-服务器通信。在完成这个项目后,用户可以通过telnet连接到localhost并成功收发消息,这为理解和实践网络编程提供了实用的示例。 首先,我们要理解什么是...

    Visual C++/Turbo C串口通信编程实践(第2版)教材清晰版

    《Visual C++/Turbo C串口通信编程实践(第2版)》是龚建伟老师编写的关于串口通信编程的教材,主要面向使用Visual C++和Turbo C环境的程序员。在本书中,作者深入浅出地讲述了串口通信的基本原理、编程方法和应用实践...

    linux C语言 socket通信聊天小程序

    在Linux环境中,C语言是构建系统级程序,如网络通信应用的理想选择。Socket编程是C语言在实现网络通信中的核心部分,它允许不同计算机之间的进程进行数据交换。本项目涉及的"Linux C语言 socket通信聊天小程序"是一...

    PS/2接口C语言通信函数库设计.rar_C语言通信函数_keyboard_ps/2_函数库

    总结,设计一个PS/2接口的C语言通信函数库涉及对硬件接口的理解、协议的实现以及C语言编程技巧。通过这样的库,开发者可以方便地与PS/2设备交互,尤其是键盘设备,从而在不依赖操作系统内核的情况下实现自定义的输入...

Global site tag (gtag.js) - Google Analytics