协议都是双方统一的
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作为一种广泛应用于Web开发的脚本语言,经常需要与其他语言编写的后端服务进行通信。其中,PHP与...
总结来说,I2C通信程序的C语言实现涉及理解I2C协议、配置微控制器的GPIO和I2C控制器、以及正确处理开始、停止、读写操作。通过使用库函数和错误处理机制,可以构建稳定可靠的I2C通信系统。在实践中,不断调试和优化...
标题中的"I2C.zip_PCF8574_Proteus使用8574_c51 i2c通信_c语言i2c通信_proteus 7se"表明了这个压缩包内容是关于I2C通信协议的实践教程,具体是通过AT89C51微控制器与PCF8574扩展I/O接口芯片之间的交互。这里我们将...
《C语言通信程序:连接PC与PIC单片机的实践指南》 在现代电子系统设计中,PC(个人计算机)与各种嵌入式处理器如PIC单片机的通信扮演着至关重要的角色。C语言,作为一种广泛应用的编程语言,因其简洁、高效而常被...
2. **指针与内存管理**:指针是C语言的一大特色,能够直接操作内存,理解指针与数组、函数之间的关系至关重要。此外,动态内存分配(malloc/free)也是常见的考点。 3. **结构体与联合体**:结构体用于组合不同类型...
SPI(Serial Peripheral Interface)通信协议是一种同步串行接口,常用于微控制器与各种外围设备之间的数据传输。在C语言环境中,实现SPI通信涉及到对硬件寄存器的操作、时序控制以及数据帧格式的理解。FPGA(Field-...
串口通信(内含完整的C语言代码)
在跨语言编程中,有时我们需要Java程序与C语言程序通过网络进行通信,这时可以利用Socket进行数据传输。本文将深入探讨如何使用Java模拟C语言的结构体,以便于两者之间通过Socket进行有效通信。 首先,我们需要理解...
### C语言串口通信经典范例解析 #### 一、串口通信基础知识 在深入了解本文提供的C语言串口通信范例之前,我们首先简要回顾一下串口通信的基础概念。 **串行通信**是一种数据传输方式,其中数据一位接一位地进行...
【通用I2C通信源程序】是一个专门为单片机项目开发的C语言代码库,它提供了I2C通信协议的实现,适用于各种不同的应用场景。I2C(Inter-Integrated Circuit)是一种多主控、双向二线制同步串行总线,由飞利浦(现为...
它涵盖了串行通信、电源线载波调制解调、错误检测与纠正等多个方面,对于提升电子工程师的技能和知识面有着重要的价值。通过实际项目的学习和实践,可以加深对这一技术的理解,进一步提升在嵌入式系统设计中的能力。
2. `demo.c`:这是一个演示程序,它调用了`serialport.c`中的函数,展示了如何在实际应用中使用串口通信功能。用户可以通过编译并运行这个示例来了解如何与串口设备交互。 3. `serialport.h`:这是一个头文件,包含...
"RTC.c"可能实现了实时时钟功能,通常也是通过I2C接口与单片机通信。 "SW485.c"是关于RS-485通信协议的实现。RS-485是一种用于长距离、多点通信的电气标准,适合工业环境中的分布式系统。在C51单片机上实现485通信...
根据给定的文件信息,我们可以深入探讨51单片机串口通信的C语言程序设计。串口通信是计算机科学中一种重要的数据传输方式,尤其在嵌入式系统开发中非常常见。对于51单片机而言,串口通信是实现设备间数据交换的基本...
LINUX下JAVA程序与C语言程序通过SOCKET通信的简单例子.pdf
本教程将深入探讨如何使用C语言实现基于Socket的客户端-服务器通信。在完成这个项目后,用户可以通过telnet连接到localhost并成功收发消息,这为理解和实践网络编程提供了实用的示例。 首先,我们要理解什么是...
《Visual C++/Turbo C串口通信编程实践(第2版)》是龚建伟老师编写的关于串口通信编程的教材,主要面向使用Visual C++和Turbo C环境的程序员。在本书中,作者深入浅出地讲述了串口通信的基本原理、编程方法和应用实践...
在Linux环境中,C语言是构建系统级程序,如网络通信应用的理想选择。Socket编程是C语言在实现网络通信中的核心部分,它允许不同计算机之间的进程进行数据交换。本项目涉及的"Linux C语言 socket通信聊天小程序"是一...
总结,设计一个PS/2接口的C语言通信函数库涉及对硬件接口的理解、协议的实现以及C语言编程技巧。通过这样的库,开发者可以方便地与PS/2设备交互,尤其是键盘设备,从而在不依赖操作系统内核的情况下实现自定义的输入...