分享
 
 
 

CMPP SP端 C# 实例

王朝c#·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

//附CMPPClient.cs:

/*

作者:TNT 时间:2003年12月

文件说明:本文件实现SP端的协议开发。

*/

using System;

using System.Security.Cryptography;

using System.Net.Sockets;

using System.Net;

using System.Text;

using System.Threading;

using System.Collections;

namespace CMPP.YOURCOMPANY

{

public delegate void ReportEventHandler(object sender, ReportEventArgs e); //声明一个事件的指代(指针)

public delegate void SMSEventHandler(object sender, SMSEventArgs e); //声明一个事件的指代(指针)

public delegate void TerminateEventHandler(object sender,TerminateEventArgs e); //声明收到终止信号

public delegate void TerminateRespEventHandler(object sender,TerminateRespEventArgs e); //回应事件发生

public delegate void TestEventHandler(object sender,TestEventArgs e);

public delegate void TestRespEventHandler(object sender,TestRespEventArgs e);

public delegate void ConnectRespEventHandler(object sender,ConnectRespEventArgs e);

public delegate void CancelRespEventHandler(object sender,CancelRespEventArgs e);

public delegate void SubmitRespEventHandler(object sender,SubmitRespEventArgs e);

public delegate void QueryRespEventHandler(object sender,QueryRespEventArgs e);

public delegate void LogonSuccEventHandler(object sender,EventArgs e); //当成功登录系统

public delegate void SocketClosedEventHandler(object sender,EventArgs e); //当套接字被检测到关闭

public delegate void FailedItemDeletedEventHandler(object sender,WaitingQueueItemEventArgs e); //当一条等待队列的消息超过60秒没有回应

public delegate void CMPPClientSvcStopEventHandler(object sender, ClientQueueStateArgs e); //当CMPP服务停止时候触发事件

/// <summary>

/// 作为CMPP协议的客户端,具有的登陆、发送、接受功能

/// 会开3 个线程处理: 1、处理需要发送 MO(下行)的消息

/// 2、处理从移动服务器发送过来CMPP的消息

/// 3、处理连接断等信息,检查需要重发的消息,检查收到的报告、短信,并调用 OnReport 事件 OnSMS事件

/// </summary>

public class CMPPClient

{

public static long CMPP_ACTIVE_TEST_C_TICKs= 30 ; // *3 ; //长连接的active_test测试时间

public static long CMPP_ACTIVE_TEST_T_TICKs= 60 ; // 消息失败时间 60秒

public static int CMPP_ACTIVE_TEST_N_COUNT=3; //3次

//public static int CMPP_MSG_MAX=100; //一次取得的最大消息数量

public static int CMPP_Port=7890;

public event ReportEventHandler onReportHandler; //指向事件处理代码的指针

public event SMSEventHandler onSMSHandler; //短信到来处理

public event TestEventHandler onTestHandler;

public event TestRespEventHandler onTestRespHandler;

public event ConnectRespEventHandler onConnectRespHandler;

public event CancelRespEventHandler onCancelRespHandler;

public event TerminateEventHandler onTerminateHandler;

public event TerminateRespEventHandler onTerminateRespHandler;

public event SubmitRespEventHandler onSubmitRespHandler;

public event QueryRespEventHandler onQueryRespHandler;

public event LogonSuccEventHandler onLogonSuccEventHandler;

public event SocketClosedEventHandler onSocketClosedHandler;

public event FailedItemDeletedEventHandler onWaitingItemDeltedHandler; //当等待队列消息超时

public event CMPPClientSvcStopEventHandler onClientSvcStopedHandler; //当服务停止时候的事件

//private 函数区域//////////////////////////////////////////////////////////////////////

private Socket tcp=null;

private IPHostEntry ip=null;

private IPEndPoint cmpp_ep=null;

private int RecvTimeOut =1000; //2000ms的接受超时

private int SendTimeout =2000; //2000ms的发送超时

private string CMPP_Server=""; //移动的服务器IP或者DNS名

private string systemID=""; //企业编号

private string userName=""; //sp的号码 /企业编号

private string PassWord=""; //口令

private bool isStop=false; //本服务是否终止运行

private bool isLogin=false; //是否已经登录

private Thread Send_Thread; //发送线程,专门处理对移动的数据包

private Thread Recv_Thread; //专门处理接收包

private Thread Deamo_Thread; //监控线程

private string ErrorInfo=""; //存放最后一次发生的错误信息 或者参考信息

private DateTime _current_time=DateTime.Now; //上一次 ping的时间

private uint lastSequence; //流水号,每一次重新启动都需要重新设定 lastSequence

private SortedList _outSeqQueue=new SortedList(); //消息队列存储 QueueItem,存储发送队列中的状态

private SortedList _waitingSeqQueue=new SortedList(); //消息队列存储 QueueItem

private int sub_resp=0; //最后返回的包 Sequence

private DateTime _lastOkTime; //最后正确发送消息时间

private bool _bNre=false; //空引用错误,套接字错误

//private ManualResetEvent _connectionDone=new ManualResetEvent(false); //是否连接到套接字服务器,也就是CMPP服务器

//private ManualResetEvent _lastsendDone=new ManualResetEvent(false); //上一次发送是否完毕

//private ManualResetEvent _lastrecvDone=new ManualResetEvent(false); //上一次接收是否完毕

private void ping() //发送一次ping包 ,不经过_outSeqQueue 直接存储在 out queue中

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_TEST test=new MSG.CMPP_MSG_TEST(seq);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST,0,0);

q.setmsgObj(test);

this.addToOutQueue(q);

}

private string getValIdTime(DateTime d) //返回短信存活时间

{

DateTime n=d.AddHours(2); //2小时

return(n.Year.ToString().Substring(2) + n.Month.ToString().PadLeft(2,'0')+n.Day.ToString().PadLeft(2,'0')+n.Hour.ToString().PadLeft(2,'0')+n.Minute.ToString().PadLeft(2,'0')+n.Second.ToString().PadLeft(2,'0')+"032+");

}

private bool isPingTime( ) //是否到了ping一次的时间

{

System.TimeSpan l=(DateTime.Now - this._current_time );

if ( l.TotalSeconds >= (CMPPClient.CMPP_ACTIVE_TEST_C_TICKs))

{

lock(this)

{

this._current_time =DateTime.Now;

return(true);

}

}

else

{

return(false);

}

}

private void checkReSend() //是否需要再一次ping //查询 _waitingSeqQueue 是否存在 上一次 没有相应的消息

{ //调查waiting queue 中的所有消息,如果入列时间超过60

for(int i=0;i<this._waitingSeqQueue.Count;i++)

{

Thread.Sleep(20);

QueueItem q=(QueueItem)this._waitingSeqQueue.GetByIndex(i);

if(q!=null)

{

DateTime this_time=DateTime.Now ; //去当前时间

TimeSpan t=this_time-q.inQueueTime ;

if(t.TotalSeconds >CMPPClient.CMPP_ACTIVE_TEST_T_TICKs ) //达到超时时间

{//需要重新发送消息

if(q.FailedCount>=CMPPClient.CMPP_ACTIVE_TEST_N_COUNT)

{

//报告消息发送失败

if(this.onWaitingItemDeltedHandler!=null)

{

WaitingQueueItemEventArgs e=new WaitingQueueItemEventArgs(q);

this.onWaitingItemDeltedHandler(this,e);

}

this.delFromWaitingQueue(q); //从等待队列中删除

//q.MsgState =(int)MSG_STATE.SENDED_WAITTING;

}

else

{//可以尝试继续发送

q.inQueueTime = this_time;

q.FailedCount ++ ;

q.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

this.sendQueueItem(q);

}

}

}

}

}

private void startThreads()

{

Deamo_Thread=new Thread(new ThreadStart(this.DeamonThread));

Deamo_Thread.Start();

}

private QueueItem newQueueItem(int msgtype,int msgstate,object msg) //生成一个消息队列成员对象实例

{

uint seq=this.getNextSequence(); //

QueueItem q=new QueueItem(seq,(uint)msgtype,0,msgstate);

q.setmsgObj(msg); //设定消息为 object

return(q);

}

private QueueItem getOutQueueItem(uint seq) //获取MT 队列中的消息项目

{

lock(this)

{

return((QueueItem)this._outSeqQueue[seq]) ;

}

}

private QueueItem getWaitingQueueItem(uint seq) //获取等待队列中的消息

{

return((QueueItem) this._waitingSeqQueue[seq]);

}

private void addToOutQueue(QueueItem q)

{

lock(this)

{

this._outSeqQueue.Add(q.Sequence,q);

}

}

private void addToWaitingQueue(QueueItem q)

{

lock(this)

{

if(!this._waitingSeqQueue.ContainsKey(q.Sequence))

{

this._waitingSeqQueue.Add(q.Sequence,q);

}

}

}

private QueueItem getTopOutQueue() //需要在取之前进行判断

{

for(int i=0;i<this._outSeqQueue.Count;i++)

{

QueueItem q=(QueueItem)this._outSeqQueue.GetByIndex(i);

if(q!=null)

{

if(q.MsgState==(int)MSG_STATE.NEW) //新消息,立即返回

{

lock(this)

{

q.MsgState =(int)MSG_STATE.SENDING; //发送状态

}

return(q);

}

else

{

q=null;

}

}

}

return(null);

}

private ArrayList getTop16Queue() //返回16条最顶的消息

{

int arrlength=0;

ArrayList reArr=new ArrayList() ;

QueueItem q=getTopOutQueue();

while(q!=null || arrlength <= 16)

{

if(q!=null)

{

reArr.Add(q);

arrlength++;

}

else

{

break;

}

q=getTopOutQueue();

}

if(arrlength>0)

{

return(reArr);

}

else

{

return(null);

}

}

private void delFromOutQueue(QueueItem q)

{

lock(this)

{

this._outSeqQueue.Remove(q.Sequence);

}

}

private void delFromOutQueue(uint seq)

{

lock(this)

{

this._outSeqQueue.Remove(seq);

}

}

private void delFromWaitingQueue(QueueItem q)

{

lock(this)

{

this._waitingSeqQueue.Remove(q.Sequence);

}

}

private void delFromWaitingQueue(uint seq)

{

this._waitingSeqQueue.Remove(seq);

}

private void SendLogin(string SystemID,string spNum,string Password)

{//发送登录验证包

systemID=SystemID;

userName=spNum;

PassWord=Password;

uint seq=this.getNextSequence(); //取得一个流水号

MSG.CMPP_MSG_CONNECT cn=new MSG.CMPP_MSG_CONNECT(seq);

cn.Password =Password.Trim();

cn.SourceAdd =SystemID.Trim();

tcp.Send(cn.ToBytes());

}

private byte[] prepairPKs(QueueItem outitem)//将QueueItem发送出去

{

uint seq=outitem.Sequence ;

uint msgtype=outitem.MsgType;

switch(msgtype)

{

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST :

MSG.CMPP_MSG_TEST test=(MSG.CMPP_MSG_TEST) outitem.getMsgObj(); //发送队列中取出

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem); //等待服务器的active_TEST_resp

}

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

return(test.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP:

MSG.CMPP_MSG_TEST_RESP test_reply=(MSG.CMPP_MSG_TEST_RESP)outitem.getMsgObj(); //发送队列中取出//取出需要发送的具体消息

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

outitem.MsgState = (int)MSG_STATE.SENDING_FINISHED ; //完成

return(test_reply.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_CANCEL :

MSG.CMPP_MSG_CANCEL cancel=(MSG.CMPP_MSG_CANCEL)outitem.getMsgObj(); //还原成消息类

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem); //等待回应

}

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

return(cancel.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_DELIVER_RESP:

MSG.CMPP_MSG_DELIVER_RESP deliver_resp=(MSG.CMPP_MSG_DELIVER_RESP)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

outitem.MsgState=(int)MSG_STATE.SENDING_FINISHED ; //完成

return (deliver_resp.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_QUERY :

MSG.CMPP_MSG_QUERY query = (MSG.CMPP_MSG_QUERY )outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem);

}

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ; //等待回应

return(query.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT :

MSG.CMPP_MSG_SUBMIT submit =(MSG.CMPP_MSG_SUBMIT)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue (outitem);

}

outitem.MsgState =(int)MSG_STATE.SENDING_FINISHED ;

return(submit.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE :

MSG.CMPP_MSG_TERMINATE terminate=(MSG.CMPP_MSG_TERMINATE)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem);

}

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

return(terminate.toBytes());

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE_RESP :

MSG.CMPP_MSG_TERMINATE_RESP terminate_resp=(MSG.CMPP_MSG_TERMINATE_RESP)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

outitem.MsgState =(int)MSG_STATE.SENDING_FINISHED ;

return(terminate_resp.toBytes());

default:

test=(MSG.CMPP_MSG_TEST) outitem.getMsgObj(); //发送队列中取出

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem); //等待服务器的active_TEST_resp

}

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

return(test.toBytes());

}

}

private void sendQueueItem(QueueItem outitem)//将QueueItem发送出去

{

uint seq=outitem.Sequence ;

uint msgtype=outitem.MsgType;

try

{

switch(msgtype)

{

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST :

MSG.CMPP_MSG_TEST test=(MSG.CMPP_MSG_TEST) outitem.getMsgObj(); //发送队列中取出

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem); //等待服务器的active_TEST_resp

}

tcp.Send(test.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP:

MSG.CMPP_MSG_TEST_RESP test_reply=(MSG.CMPP_MSG_TEST_RESP)outitem.getMsgObj(); //发送队列中取出//取出需要发送的具体消息

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

tcp.Send(test_reply.toBytes());

outitem.MsgState = (int)MSG_STATE.SENDING_FINISHED ; //完成

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_CANCEL :

MSG.CMPP_MSG_CANCEL cancel=(MSG.CMPP_MSG_CANCEL)outitem.getMsgObj(); //还原成消息类

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem); //等待回应

}

tcp.Send(cancel.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_DELIVER_RESP:

MSG.CMPP_MSG_DELIVER_RESP deliver_resp=(MSG.CMPP_MSG_DELIVER_RESP)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

tcp.Send(deliver_resp.toBytes());

outitem.MsgState=(int)MSG_STATE.SENDING_FINISHED ; //完成

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_QUERY :

MSG.CMPP_MSG_QUERY query = (MSG.CMPP_MSG_QUERY )outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem);

}

tcp.Send(query.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ; //等待回应

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT :

MSG.CMPP_MSG_SUBMIT submit =(MSG.CMPP_MSG_SUBMIT)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue (outitem);

}

tcp.Send(submit.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDING_FINISHED ;

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE :

MSG.CMPP_MSG_TERMINATE terminate=(MSG.CMPP_MSG_TERMINATE)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

this.addToWaitingQueue(outitem);

}

if(this.tcpIsCanUse())

{

tcp.Send(terminate.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDED_WAITTING ;

}

this.isStop =true; //通知其他线程可以退出了

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE_RESP :

MSG.CMPP_MSG_TERMINATE_RESP terminate_resp=(MSG.CMPP_MSG_TERMINATE_RESP)outitem.getMsgObj(); //发送队列中取出;

lock(this)

{

outitem.MsgState =(int)MSG_STATE.SENDING ;

this.delFromOutQueue(seq);

}

tcp.Send(terminate_resp.toBytes());

outitem.MsgState =(int)MSG_STATE.SENDING_FINISHED ;

break;

}

LogLastOkTime(DateTime.Now ); //记录当前最后一次消息soket正确时间

}

catch(SocketException se)

{

//发生套接字错误

this.ErrorInfo =this.ErrorInfo +"\r\n"+se.ToString ();

}

catch(NullReferenceException nre)

{

this._bNre =true; //出现空引用错误

this.ErrorInfo =this.ErrorInfo +"\r\n"+nre.ToString ();

}

}

private bool tcpIsCanUse() //测试当前tcp是否可用

{

bool reval=true;

DateTime t=DateTime.Now ;

TimeSpan ts=t- this._lastOkTime;

if(ts.TotalSeconds > CMPPClient.CMPP_ACTIVE_TEST_T_TICKs ) //60秒

{

reval=false; //不可用

}

if(this._bNre )

{

reval=false;

}

return(reval);

}

private void _reStartRecvNSend()

{

Send_Thread=new Thread(new ThreadStart(this.SendSPMsgThread));

Send_Thread.Start();

Recv_Thread=new Thread(new ThreadStart(this.RecvISMGMsgThread));

Recv_Thread.Start();

}

private void LogLastOkTime(DateTime lastoktime)

{

lock(this)

{

this._lastOkTime=lastoktime; //设定最后成功消息交互时间

}

}

private void defaultReportHandler() //却省的报告事件处理函数

{

}

private void defaultSMSHandler()

{

}

private void defaultTeminateHandler()

{

}

private void defaultTestEventHandler()

{

}

private void defaultTestRespEventHandler()

{

}

private void defaultTerminateEventHandler()

{

}

private void defaultTerminateRespEventHandler()

{

}

private void defaultCancelRespEventHandler()

{

}

private void defaultQueryRespEventHandler()

{

}

private void defaultConnectRespEventHandler()

{

QueueItem q=new QueueItem(this.getNextSequence(),(uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST,0,(int)MSG_STATE.NEW);

MSG.CMPP_MSG_TEST test=new MSG.CMPP_MSG_TEST(q.Sequence ); //立即发送包过去

q.setmsgObj(test);

this.addToOutQueue(q);

}

private void defaultSubmitRespEventHandler()

{

}

private void defaultClientStopEventHandler()

{}

private void rePortError(string info)

{

}

private bool _init(string CMPPServer,int CMPPPort)

{

bool reVal=false;

CMPP_Server=CMPPServer;

CMPP_Port=CMPPPort;

try

{

tcp=new Socket(AddressFamily.InterNetwork ,SocketType.Stream ,ProtocolType.Tcp );

ip=Dns.GetHostByName(CMPP_Server);

cmpp_ep=new IPEndPoint(ip.AddressList[0],CMPP_Port);

tcp.Connect(cmpp_ep); //连接

reVal=true;

}

catch(SocketException se)

{

ErrorInfo="Socker Error:" + se.ToString();

}

return(reVal);

}

private uint getNextSequence()

{

lock(typeof(CMPPClient))

{

try

{

lastSequence++;

}

catch(OverflowException ofe)

{

this.ErrorInfo =this.ErrorInfo +"\r\n"+ofe.ToString();

lastSequence=uint.MinValue;

}

return(lastSequence);

}

}

private void RecvISMGMsgThread() //处理ISMG消息的线程

{

while(!this.isStop )

{

try

{

byte[] rbuf=new byte[10240]; //结果缓冲区

byte[] recv_temp=new Byte[1024]; //recv临时缓冲区

int index=0;

int msglength=tcp.Receive(rbuf); //阻塞接收//分析收到的数据

MSG.CMPP_MSG_Header header; //=new MSG.CMPP_MSG_Header(rbuf,index); //取得一个消息

while(index<msglength) //逐个消息分析

{

header=new MSG.CMPP_MSG_Header(rbuf,index); //取得一个消息

byte[] the_pk= new byte[header.MSGLength] ; //生成此消息的大小

for(int i=0;i<header.MSGLength ;i++)

{

the_pk[i]=rbuf[index++];

}

uint seq; //取得回复消息的下一个流水序列号

switch(header.Command_ID)

{

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST : //服务器给客户的测试信号

this.ErrorInfo =this.ErrorInfo +"\r\n"+"收到:CMPP_ACTIVE_TEST";

MSG.CMPP_MSG_TEST test=new MSG.CMPP_MSG_TEST(the_pk);

seq=test.Sequence; //取得发送过来的流水号

MSG.CMPP_MSG_TEST_RESP test_reply=new MSG.CMPP_MSG_TEST_RESP(seq);

tcp.Send(test_reply.toBytes()); //马上送出回应包,不需要进入队列

if(this.onTestHandler!=null)

{

TestEventArgs e=new TestEventArgs(test);

onTestHandler(this,e);

}

else

{

defaultTestEventHandler();

}

this.ErrorInfo =this.ErrorInfo +"\r\n"+"发送:CMPP_ACTIVE_TEST_RESP ";

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP : //服务器的回应消息,应当丢弃不管

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_ACTIVE_TEST_RESP ");

MSG.CMPP_MSG_TEST_RESP test_reply2=new MSG.CMPP_MSG_TEST_RESP(the_pk); //构造消息

seq=test_reply2.Sequence; //寻找 曾经发送过去的消息

this.delFromWaitingQueue(seq); //删除等待队列中的消息 //清空等待回应队列

if(this.onTestRespHandler!=null)

{

TestRespEventArgs e=new TestRespEventArgs(test_reply2);

onTestRespHandler(this,e);

}

else

{

defaultTestRespEventHandler();

}

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_CANCEL_RESP :

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_CANCEL_RESP ");

MSG.CMPP_MSG_CANCEL_RESP cancel_reply=new MSG.CMPP_MSG_CANCEL_RESP(the_pk);//构造消息

seq=cancel_reply.Sequence;

this.delFromWaitingQueue(seq);

if(this.onCancelRespHandler!=null)

{

CancelRespEventArgs e=new CancelRespEventArgs(cancel_reply);

onCancelRespHandler(this,e);

}

else

{

defaultCancelRespEventHandler();

}

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_CONNECT_RESP : //检查下消息的正确性,清除等待队列 设定连接成功标志

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_CONNECT_RESP ");

MSG.CMPP_MSG_CONNECT_RESP cn_reply=new MSG.CMPP_MSG_CONNECT_RESP(the_pk);

seq=cn_reply.Sequence; //取得消息的seq

if(this.onConnectRespHandler !=null)

{

ConnectRespEventArgs e=new ConnectRespEventArgs(cn_reply);

onConnectRespHandler(this,e);

}

else

{

defaultConnectRespEventHandler();

}

if(cn_reply.isOk)

{

this.isLogin =true;

}

else

{

this.isLogin =false;

}

this.delFromWaitingQueue(seq); //删除队列中的等待连接信息包

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_DELIVER: //检查消息正确定,立即返回 正确 或者 失败,正确则处理是否状态包,不是状态包则存到MO缓存,表示收到信息,时状态包则判断缓存消息进行消息送达处理

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_DELIVER ");

BIConvert.DumpBytes(the_pk,"c:\\CMPP_DELIVER.txt");//保留映像

MSG.CMPP_MSG_DELIVER deliver=new MSG.CMPP_MSG_DELIVER(the_pk);

seq=(uint)deliver.ISMGSequence; //发过来的流水号,需要立即发送一个deliver_resp //一条 ISMG--〉SP 的消息

MSG.CMPP_MSG_DELIVER_RESP deliver_resp=new MSG.CMPP_MSG_DELIVER_RESP(seq);

deliver_resp.MsgID =deliver.MsgID ;

deliver_resp.Result =0;

byte[] t=deliver_resp.toBytes();

tcp.Send(t);

this.ErrorInfo =this.ErrorInfo +"\r\n"+("发送:CMPP__DELIVER_RESP ");

if(deliver.isReport)

{ //删除等待队列的消息//报告消息已经正确发送到

//UInt64 ReportMsgID=deliver.ReportMsgID ; //取得消息ID ,更新 MsgID

string StateReport=deliver.StateReport; //取得关于此消息的状态

//_debugBs(the_pk);

ReportEventArgs arg=new ReportEventArgs(the_pk,MSG.CMPP_MSG_Header.HeaderLength+8+21+10+1+1+1+21+1+1); //构造报告事件参数

//ReportEventArgs arg=new ReportEventArgs(ReportMsgID.ToString(),

if(this.onReportHandler!=null) //ReportEventArgs传递的字节数组是 报告信息包的数据,在此不考虑多个报告的情况

{

onReportHandler(this,arg);

}

else

{

this.defaultReportHandler();

}

}

else

{//SMSEventArgs 传递的整个deliver包

SMSEventArgs smsarg=new SMSEventArgs (the_pk,MSG.CMPP_MSG_Header.HeaderLength);

if(this.onSMSHandler!=null)

{

onSMSHandler(this,smsarg); //触发事件,应当很快结束处理,不要靠考虑存储之类的耗费资源事宜

}

else

{

defaultSMSHandler();

}

}

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_QUERY_RESP :

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_QUERY_RESP ");

//收到消息,处理后存入数据库

MSG.CMPP_MSG_QUERY_RESP query_resp=new MSG.CMPP_MSG_QUERY_RESP(the_pk);

this.delFromWaitingQueue(query_resp.Sequence ); //将等待的队列中的元素删除

if(this.onQueryRespHandler!=null)

{

QueryRespEventArgs e=new QueryRespEventArgs(query_resp);

}

else

{

defaultQueryRespEventHandler();

}

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT_RESP : //收到服务器送达的慧英消息

this.ErrorInfo =this.ErrorInfo +"\r\n"+("收到:CMPP_SUBMIT_RESP ");

MSG.CMPP_MSG_SUBMIT_RESP submit_resp=new MSG.CMPP_MSG_SUBMIT_RESP(the_pk);

BIConvert.DumpBytes(the_pk,"c:\\CMPP_SUBMIT_RESP.txt");//保留映像

//BIConvert.DumpBytes(initValue,"c:\\CMPP_SUBMIT_RESP.txt");//保留映像

sub_resp++; //该变量仅供测试使用

delFromWaitingQueue(submit_resp.Sequence); //删除需要等待的消息

if(this.onSubmitRespHandler!=null)

{

SubmitRespEventArgs e=new SubmitRespEventArgs(submit_resp);

//submit_resp.

onSubmitRespHandler(this,e);

}

else

{

defaultSubmitRespEventHandler();

}

break;

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE :

this.ErrorInfo =this.ErrorInfo +"\r\n"+"收到:CMPP_TERMINATE";

MSG.CMPP_MSG_TERMINATE terminate=new MSG.CMPP_MSG_TERMINATE(the_pk);

seq=terminate.Sequence;

MSG.CMPP_MSG_TERMINATE_RESP terminate_resp=new MSG.CMPP_MSG_TERMINATE_RESP(seq);

this.ErrorInfo =this.ErrorInfo +"\r\n"+"收到:CMPP_TERMINATE_RESP";

tcp.Send(terminate_resp.toBytes());

if(this.onTerminateHandler!=null)

{

TerminateEventArgs e=new TerminateEventArgs(terminate);

onTerminateHandler(this,e);

this.StopMe() ; //准备自我停止?

}

else

{

defaultTerminateEventHandler();

}

this._StopMe(); //发出终止设定

return; //退出线程

case (uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE_RESP :

this.ErrorInfo =this.ErrorInfo +"\r\n"+"收到:CMPP_TERMINATE_RESP";

MSG.CMPP_MSG_TERMINATE_RESP ter_resp=new MSG.CMPP_MSG_TERMINATE_RESP(the_pk);

seq=ter_resp.Sequence ; //取得流水信号

this.delFromOutQueue(seq); //删除输出表重点项目

if(this.onTerminateRespHandler!=null)

{

TerminateRespEventArgs e=new TerminateRespEventArgs(ter_resp);

onTerminateRespHandler(this,e);

}

else

{

defaultTerminateRespEventHandler();

}

this._StopMe();

break;

}

}

LogLastOkTime(DateTime.Now ); //记录当前最后一次消息soket正确时间

}

catch(SocketException se)

{

//超时

}

Thread.Sleep(50);

}

}

//debug

// private void _debugBs(byte[] the_pk) //存储byte字节

// {

//

// }

//debug

private void DeamonThread() //监视本系统连接是否正常

{//此线程是监视线程

int t_count =0; //循环时间计数

_reStartRecvNSend(); //启动接收和发送

while(! this.isStop)

{

t_count++; //0.1秒

if(tcpIsCanUse())

{

if(this.isPingTime())

{

this.ping(); //发送一个ping包

}

if(t_count>50) // 500*100=50000=50秒

{

t_count=0;

checkReSend() ; //检查需要重新发送的消息

//触发一个事件,让系统自动检查消息队列,存储消息队列中的消息状态

}

}

else

{

EventArgs e=new EventArgs();

if(this.onSocketClosedHandler!=null)

{

onSocketClosedHandler(this,e);

}

else

{

}

this.isStop =true; //通知其他线程退出

}

Thread.Sleep(1000);

}

}

private void SendSPMsgThread()

{

while (!this.isStop )

{

Thread.Sleep(10);

if(this.isLogin)

{

ArrayList lists=this.getTop16Queue(); //取出16条最顶的消息

if(lists!=null && lists.Count >0)

{

int count=lists.Count;

ArrayList pks=new ArrayList( count); //定义容量

for (int i=0;i<lists.Count; i++)

{

QueueItem outitem=(QueueItem)lists[i]; //取出每一个消息对象

if(outitem!=null)

{

try

{

sendQueueItem(outitem); //发送每一个消息

}

catch(SocketException se)

{

//发送失败

outitem.FailedCount ++;

}

}

}

}

}

Thread.Sleep(100);

}

}

private void _StopMe()

{

lock(this)

{

this.isStop =true;

}

}

private void _forcedSubThread(Thread t) //强制停止线程

{

try

{

t.Abort();

t.Join();

}

catch(Exception )

{}

}

//private 函数区域//////////////////////////////////////////////////////////////////

//公用函数 属性区域////////////////////////////////////////

public bool Init(string CMPPServer,int CMPPPort)

{

return(this._init(CMPPServer,CMPPPort));

}

public bool Init(string CMPPServer,int CMPPPort,int recvtimeout,int sendtimeout)

{

this.RecvTimeOut =recvtimeout;

this.SendTimeout =sendtimeout;

return(this._init(CMPPServer,CMPPPort));

}

public bool Init(string CMPPServer,int CMPPPort,int recvtimeout)

{

this.RecvTimeOut =recvtimeout;

this.SendTimeout =recvtimeout;

return(this._init(CMPPServer,CMPPPort));

}

public bool Login(string SystemID,string UserName,string Password)

{

try

{

SendLogin(SystemID, UserName, Password);

this.LogLastOkTime(DateTime.Now); //最后一次正确的发送

}

catch(SocketException se)

{

//发送出错

this.ErrorInfo = this.ErrorInfo +"\r\n"+se.ToString();

return(false);

}

DateTime t1=DateTime.Now;

while(!this.isLogin)

{

byte[] rbuf=new Byte[400];

int l;

try

{

l=tcp.Receive(rbuf) ;

if(l>16)

{

if(BIConvert.Bytes2UInt(rbuf,4)==(uint)MSG.CMPP_COMMAND_ID.CMPP_CONNECT_RESP)

{

MSG.CMPP_MSG_CONNECT_RESP resp=new MSG.CMPP_MSG_CONNECT_RESP(rbuf);

if(resp.isOk)

{

EventArgs e=new EventArgs();

if(onLogonSuccEventHandler!=null)

{

onLogonSuccEventHandler(this,e);

}

else

{

this.defaultConnectRespEventHandler();

}

this.isLogin =true;

}

else

{

}

break;

}

}

this._lastOkTime =DateTime.Now ; //更新当前最后成功收发套接字的时间

}

catch(SocketException)

{

}

System.TimeSpan t=DateTime.Now - t1;

if(t.TotalSeconds > 10)

{

break;

}

}

if(this.isLogin)

{ //登录ok,就立即发送active_test包

this.ErrorInfo =this.ErrorInfo + "\r\n"+" Logon succ! ";

startThreads(); // 启动 主监视程序de线程

return(true);

}

else

{

return(false);

}

}

public uint SubmitSMS(string to_user,string fee_code,string svc_code, string fee_user,string spnum,string content,int fee_usertype)

{

MSG.CMPP_MSG_SUBMIT sndmsg;

uint seq=this.getNextSequence(); //取得下一个sequence

sndmsg=new MSG.CMPP_MSG_SUBMIT(seq);

sndmsg.FeeCode =fee_code;

sndmsg.FeeTerminalId =to_user;

sndmsg.FeeType=MSG.FeeType.FEE_TERMINAL_PERITEM; //按条收取

sndmsg.FeeUserType = fee_usertype ;

sndmsg.Msg_Level=0;

sndmsg.MSGFormat = (uint)MSG.Msg_Format.UCS2;

sndmsg.SMS_Content=content;

sndmsg.SrcID=spnum; //长号码

sndmsg.SPID=this.systemID ;

sndmsg.Svc_Code= svc_code;

sndmsg.UDHI=0;

sndmsg.ValIdTime=getValIdTime(DateTime.Now); //存活时间

sndmsg.addTerminalID(to_user);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT ,0,0);

q.setmsgObj(sndmsg);

this.addToOutQueue(q);

return(seq);

}

public uint SendMsg(string to_user,string fee_user,string fee,string svccode,string content,string spnum)

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_SUBMIT sndmsg=new MSG.CMPP_MSG_SUBMIT(seq) ;

sndmsg.FeeCode=fee;

sndmsg.FeeType=MSG.FeeType.FEE_TERMINAL_PERITEM ;

sndmsg.FeeTerminalId =fee_user;

sndmsg.FeeUserType =(int)MSG.FeeUserType.FEE_NULL ; //计费 按照计费号码计费

sndmsg.SPID =this.systemID ; //企业代码

sndmsg.UDHI=0; //

sndmsg.MSGFormat=(uint)MSG.Msg_Format.GB2312 ;

sndmsg.SMS_Content =content;

sndmsg.SrcID=spnum;

sndmsg.Svc_Code=svccode;

sndmsg.addTerminalID(to_user);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT ,0,0);

q.setmsgObj(sndmsg);

this.addToOutQueue(q);

return(seq);

}

public uint SendSMC(string fee_user,string feecode,string svccode) //向计费用户发送一条包月计费信息

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_SUBMIT sndmsg=new MSG.CMPP_MSG_SUBMIT(seq) ;

sndmsg.SMS_Delivery_Type=2; //产生包月SMC

sndmsg.FeeCode=feecode;

sndmsg.FeeType=MSG.FeeType.FEE_TERMINAL_MONTH ; //包月计费

sndmsg.FeeTerminalId =fee_user;

sndmsg.FeeUserType =(int)MSG.FeeUserType.FEE_TERMINAL_ID ; //计费 按照计费号码计费

sndmsg.SPID =this.systemID ; //企业代码

sndmsg.UDHI=0; //

sndmsg.MSGFormat=(uint)MSG.Msg_Format.UCS2 ;

sndmsg.SMS_Content ="SMC";

sndmsg.SrcID =this.userName; //sp的特符号码

sndmsg.Svc_Code=svccode;

sndmsg.addTerminalID(fee_user);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT ,0,0);

q.setmsgObj(sndmsg);

this.addToOutQueue(q);

return(seq);

}

public uint SendSMT(string to_user,string feecode,string svccode,string spnum,string content)

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_SUBMIT sndmsg=new MSG.CMPP_MSG_SUBMIT(seq) ;

sndmsg.SMS_Delivery_Type=1; //产生包月SMC

sndmsg.FeeCode=feecode; //包月计费代码

sndmsg.FeeType=MSG.FeeType.FEE_TERMINAL_MONTH ; //包月计费

sndmsg.FeeTerminalId =to_user;

sndmsg.FeeUserType =(int)MSG.FeeUserType.FEE_TERMINAL_ID ; //计费 按照计费号码计费

sndmsg.SPID =this.systemID ; //企业代码

sndmsg.UDHI=0; //

sndmsg.MSGFormat=(uint)MSG.Msg_Format.UCS2 ;

sndmsg.SMS_Content =content;

sndmsg.SrcID =spnum; //sp的特符号码

sndmsg.Svc_Code=svccode;

sndmsg.addTerminalID(to_user);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_SUBMIT ,0,0);

q.setmsgObj(sndmsg);

this.addToOutQueue(q);

return(seq);

}

public uint SendQuery(string svccode,string whichday) //查询某个业务的总计数

{

string wd=whichday.Trim();

int query_type=0;

if(svccode==null || svccode.CompareTo("")==0)

{//查询全部页数量

}

else

{//查询某项业务

query_type=1;

}

if(wd==null|| wd.CompareTo ("")==0)

{

DateTime d=DateTime.Now;

wd=d.Year.ToString()+d.Month.ToString().PadLeft(2,'0')+d.Day.ToString().PadLeft(2,'0');

}

uint seq=this.getNextSequence();

MSG.CMPP_MSG_QUERY query=new MSG.CMPP_MSG_QUERY(seq);

query.Query_Type =query_type;

query.Query_Code =svccode;

query.Time =wd; //设定那一天

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_QUERY ,0,0);

q.setmsgObj(query);

this.addToOutQueue(q);

return(seq); //返回消息的内部编号

}

public uint StopCMPPConnection() //停止CMPP协议的socket连接

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_TERMINATE t=new MSG.CMPP_MSG_TERMINATE(seq);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE,0,0);

q.setmsgObj(t);

this.addToOutQueue(q);

return(seq); //返回终止消息,便于等待

}

public uint CancelMsg( string msgid)

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_CANCEL cancel=new MSG.CMPP_MSG_CANCEL(seq);

cancel.MsgID =msgid;

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_CANCEL ,0,0);

q.setmsgObj(cancel);

this.addToOutQueue(q);

return(seq); //返回消息的内部编号

}

public void StopMe()

{

if(!this.isStop)

{

if(this.tcpIsCanUse())//发送一条对服务器的通告

{

uint seq=this.getNextSequence();

MSG.CMPP_MSG_TERMINATE t=new MSG.CMPP_MSG_TERMINATE(seq);

QueueItem q=new QueueItem(seq,(uint)MSG.CMPP_COMMAND_ID.CMPP_TERMINATE,0,0);

q.setmsgObj(t);

this.addToOutQueue(q);

}

Thread.Sleep(500); //等待1000ms,告知服务器

this._StopMe();

tcp.Close();

if(this.onClientSvcStopedHandler!=null)

{

ClientQueueStateArgs arg=new ClientQueueStateArgs(this._outSeqQueue ,this._waitingSeqQueue);

onClientSvcStopedHandler(this,arg);

}

else

{

this.defaultClientStopEventHandler();

}

Thread.Sleep(500); //再次主动等待线程结束

//此处报告 2个队列中的信息

}

//准备强行结束

_forcedSubThread(this.Send_Thread);

Thread.Sleep(500); //等待1000ms,告知服务器

_forcedSubThread(this.Recv_Thread );

Thread.Sleep(500); //等待1000ms,告知服务器

_forcedSubThread(this.Deamo_Thread );

Thread.Sleep(500); //等待1000ms,告知服务器

}

public string getLogInfo()

{

string t= this.ErrorInfo;

this.ErrorInfo="";

return(t);

}

public int getQueueItemState(uint seq) //根据seq寻找发送内部队列的消息对象的状态

{

int status=0; //状态未知

if(this._outSeqQueue.ContainsKey(seq)) //存在于outSeqQueue中

{

if(this._waitingSeqQueue.Contains(seq))

{

//正在发送等待返回,状态未定

}

else

{

//还没有发送

}

}

else

{

if(this._waitingSeqQueue.ContainsKey(seq))

{

//正等待回应

}

else

{

//已经发送结束了

}

}

return(status);

}

public void TestSubmit( string[] nums ,int topI,int topJ) //发送测试包

{

int count=0;

int total=0;

ArrayList pks=new ArrayList( );

//准备100个包

for(int i=0;i<10;i++)

{

for(int j=0;j<10;j++)

{

uint seq=this.getNextSequence(); //准备流水号

MSG.CMPP_MSG_SUBMIT sndmsg=new MSG.CMPP_MSG_SUBMIT(seq);

sndmsg.FeeCode ="000001";

sndmsg.FeeTerminalId =nums[i];

sndmsg.FeeType=MSG.FeeType.FEE_TERMINAL_PERITEM; //按条收取

sndmsg.FeeUserType = 0 ; //终端用户计费

sndmsg.Msg_Level=0;

sndmsg.MSGFormat = (uint)MSG.Msg_Format.UCS2;

sndmsg.SMS_Content="test";

sndmsg.SrcID="09880"; //长号码

sndmsg.SPID=this.systemID ;

sndmsg.Svc_Code= "cmcctest";

sndmsg.UDHI=0;

sndmsg.ValIdTime=getValIdTime(DateTime.Now); //存活时间

sndmsg.addTerminalID(nums[i]);

pks.Add( sndmsg.toBytes()) ; //存入数组

}

}

DateTime t1=DateTime.Now ;

for(int i=0;i< topI;i++)

{

for(int j=0;j<topJ;j++)

{

try

{

tcp.Send((byte[])pks[i*10+j]);

count++;

total++;

}

catch (SocketException se)

{

this.ErrorInfo =this.ErrorInfo +"\r\n"+"发送错误: "+se.ToString() ;

}

if( count>=16)

{

count=0; //复位

Thread.Sleep(50); //暂停20ms

}

}

}

DateTime t2=DateTime.Now ;

TimeSpan t= t2-t1;

this.ErrorInfo =this.ErrorInfo +"\r\n"+"发送: "+total +" 条消息, 总计花费时间:"+ t.TotalMilliseconds +"毫秒" ;

} //测试函数////////////////////////////////////////////////供测试移动网络测试

//测试翰数区域///////////////////////////////////////////

//公用函数 属性区域////////////////////////////////////////

}

//*************工具类结束***********************************

enum MSG_STATE //CMPP消息在队列中的状态枚举值

{

NEW=0, //加入到队列等待发送出去

SENDING=1, //正被某个线程锁定

SENDED_WAITTING=2, //发送出去,现在等待resp消息返回

SENDING_FINISHED=3 //得到回应,一般等待被清理出队列

}

public class QueueItem //代表一个存储在缓存队列中的消息,序列号由CMPPClient产生

{

uint _sequence; //消息索引 就是流水号

uint _msgType; //消息的类别就是COMMAND_ID,根据此值决定 Object _msgObj的原类型

int _failedCount=0; //失败计数,如果失败次数超过3此需要进行清理

int _msgState; //当前消息状态,具体为 MSG_STATE的枚举类型

object _msgObj; //存放消息对象,具体类型参考 _msgType

DateTime _inQueueTime; //消息进入队列的时间,上次消息的发送时间

public int FailedCount

{

set

{

this._failedCount =value;

}

get

{

return(this._failedCount);

}

}

public object getMsgObj()

{

return(this._msgObj);

}

public void setmsgObj(object inmsg)

{

this._msgObj=inmsg;

}

public DateTime inQueueTime

{

set

{

this._inQueueTime =value;

}

get

{

return(this._inQueueTime);

}

}

public uint MsgType

{

get

{

return(this._msgType);

}

}

public int MsgState

{

get

{

return(this._msgState);

}

set

{

this._msgState =value;

}

}

public uint Sequence

{

get

{

return(this._sequence);

}

set

{

this._sequence =value;

}

}

public QueueItem(uint sequence,uint msgtype ,int faildedcount,int msgstate)

{

this._failedCount =faildedcount;

this._msgState =msgstate;

this._msgType =msgtype;

this._sequence=sequence;

}

public QueueItem(uint sequence,uint msgtype,int faildedcount,int msgstate,object msgobj)

{

this._failedCount =faildedcount;

this._msgState =msgstate;

this._msgType =msgtype;

this._sequence=sequence;

this.setmsgObj(msgobj);

}

}

public class BIConvert //字节 整形 转换类 网络格式转换为内存格式

{

public static byte[] Int2Bytes(uint i) //转换整形数据网络次序的字节数组

{

byte[] t=BitConverter.GetBytes(i) ;

byte b=t[0];

t[0]=t[3];

t[3]=b;

b=t[1];

t[1]=t[2];

t[2]=b;

return(t);

}

public static uint Bytes2UInt(byte[] bs,int startIndex) //返回字节数组代表的整数数字,4个数组

{

byte[] t=new byte[4];

for(int i=0;i<4 && i< bs.Length-startIndex ;i++)

{

t[i]=bs[startIndex+i];

}

byte b=t[0];

t[0]=t[3];

t[3]=b;

b=t[1];

t[1]=t[2];

t[2]=b;

return(BitConverter.ToUInt32(t,0));

}

public static uint Bytes2UInt(byte[] bs) //没有指定起始索引

{

return( Bytes2UInt(bs,0));

}

public static void DumpBytes(byte[] bs,string txt)

{

System.IO.StreamWriter sw=new System.IO.StreamWriter(txt);

for(int i=0;i<bs.Length ;i++)

{

byte b=bs[i];

sw.WriteLine(b.ToString("X")+" ");

}

sw.WriteLine("-----"+DateTime.Now.ToLocalTime() );

sw.Close();

}

public static void DebugString(string bs,string txt)

{

System.IO.StreamWriter sw=new System.IO.StreamWriter(txt);

sw.WriteLine(bs);

sw.WriteLine("-----"+DateTime.Now.ToLocalTime() );

sw.Close();

}

}

public class ReportEventArgs : EventArgs //报告事件携带的数据

{

string _smsState; //发送短信的应答结果,含义与SMPP协议要求中stat字段定义相同 。SP根据该字段确定CMPP_SUBMIT消息的处理状态。

string _submitTime; //提交短信的时间,也可根据此时间决定是否重发

string _doneTime; //送达目的地的时间

string _destNum; //送达的号码

string _msgID; //关于那一条消息的报告

uint _sequence; //CMPP网关产生的流水号

UInt64 _msg_id; //被报告的提交短信的msgID,ISMG在submit_resp返回给SP的

public string State

{

get

{

return(this._smsState);

}

set

{

this._smsState =value;

}

}

public uint Sequence

{

get

{

return(this._sequence );

}

set

{

this._sequence =value;

}

}

public string toUserNum

{

get

{

return(this._destNum);

}

set

{

this._destNum =value;

}

}

public string MsgID

{

get

{

return( this._msgID );

}

set

{

this._msgID =value;

}

}

public string SubmitTime

{

get

{

return(this._submitTime);

}

set

{

this._submitTime =value;

}

}

public string DoneTime

{

get

{

return(this._doneTime );

}

set

{

this._doneTime =value;

}

}

public ReportEventArgs(byte[] bs) //从一个字节数组中获得报告

{

byte[] temp=new byte[8+7+10+10+21+4];

for(int i=0;i<temp.Length;i++)

{

temp[i]=bs[i];

}

init(temp);

}

public ReportEventArgs(byte[] bs,int startIndex) //起始

{

byte[] temp=new byte[8+7+10+10+21+4];//定义长度

for(int i=0;i<temp.Length;i++)

{

temp[i]=bs[startIndex+i];

}

init(temp);

}

public ReportEventArgs(string msgid,string destnum,string smsstate,string submittime,string donetime,uint seq)

{

this._msgID =msgid;

this._destNum =destnum;

this._smsState =smsstate;

this._submitTime =submittime;

this._doneTime =donetime;

this._sequence =seq;

}

public DateTime getSubmitTime()

{

return(getTime(this._submitTime));

}

public DateTime getDoneTime()

{

return(getTime(this._doneTime));

}

private DateTime getTime(string time_string)

{

int index=0;

int yy=Convert.ToInt32("20"+ time_string.Substring(index,2));

index+=2;

int mm=Convert.ToInt32(time_string.Substring(index,2));

index+=2;

int dd=Convert.ToInt32(time_string.Substring(index,2));

index+=2;

int hh=Convert.ToInt32(time_string.Substring(index,2));

index+=2;

int mms=Convert.ToInt32(time_string.Substring(index,2));

DateTime t=new DateTime(yy,mm,dd,hh,mms,0);

return(t);

}

private void init(byte[] bs)

{

BIConvert.DumpBytes(bs,"c:\\ReportEventArgs.txt");//保留映像

int index=0;

this._msg_id =BitConverter.ToUInt64(bs,index); //BitConverter.ToUInt64(bs,index);

this._msgID =(this._msg_id.ToString());

// BIConvert.DebugString(this._msgID ,"c:\\MSGID.txt");

index +=8;

this._smsState = Encoding.ASCII.GetString(bs,index,7);

index+=7;

this._submitTime = Encoding.ASCII.GetString(bs,index,10);

index+=10;

this._doneTime = Encoding.ASCII.GetString(bs,index,10);

index+=10;

this._destNum = Encoding.ASCII.GetString(bs,index,21);

index+=21;

this._sequence = BIConvert.Bytes2UInt(bs,index);

}

}

public class SMSEventArgs : EventArgs

{

UInt64 _msgid; //8字节的消息标示

string _destID; //接受信息的目标ID

string _svcCode; //业务代码

int _tpPID; //参考GSM协议

int _tpUDHI; //

int _msgFrm; //消息的编码格式

string _srcTerminateID; //源终端ID,如果使报告

int _msgLength; //消息的字节数,并非实际字符串长度

string _Content; //消息正文内容

public SMSEventArgs(byte[] bs)

{

int msglen=BitConverter.ToInt32(bs,8+21+10+1+1+1+21+1); //取得消息长度字节长度

int tempLen=msglen+8+21+10+1+1+1+21+1+1+msglen+8;

byte[] temp=new byte[tempLen];

for(int i=0;i<temp.Length ;i++)

{

temp[i]=bs[i];

}

init(temp);

}

public SMSEventArgs(byte[] bs,int baseIndex)

{

int msglen= (int)bs[MSG.CMPP_MSG_Header.HeaderLength +8+21+10+1+1+1+21+1]; //取得消息长度字节长度

int tempLen=8+21+10+1+1+1+21+1+1+msglen+8;

byte[] temp=new byte[tempLen];

for(int i=0;i<temp.Length ;i++)

{

temp[i]=bs[i+baseIndex];

}

init(temp);

}

private void init(byte[] bs)

{

BIConvert.DumpBytes(bs,"c:\\SMSEventArgs.txt");//保留映像

int index=0;

this._msgid = BitConverter.ToUInt64(bs,0);

index+=8;

this._destID = Encoding.ASCII.GetString(bs,index,_getRealBytesLength(bs,index));

index+=21;

this._svcCode = Encoding.ASCII.GetString(bs,index,_getRealBytesLength(bs,index));

index+=10;

this._tpPID =(int)bs[index++];

this._tpUDHI =(int)bs[index++];

this._msgFrm = (int)bs[index++];

this._srcTerminateID =Encoding.ASCII.GetString(bs,index,_getRealBytesLength(bs,index));

index+=21;

index++; //是否是状态报告字节

this._msgLength = (int)bs[index++]; //取得字节长度

switch ( this._msgFrm )

{

case (int)MSG.Msg_Format.ASCII :

this._Content =Encoding.ASCII.GetString(bs,index,this._msgLength );

break;

case (int)MSG.Msg_Format.GB2312 :

this._Content = Encoding.Default.GetString(bs,index,this._msgLength );

break;

case (int)MSG.Msg_Format.UCS2 :

this._Content = Encoding.BigEndianUnicode.GetString(bs,index,this._msgLength );

break;

case (int)MSG.Msg_Format.BINARY :

break;

case (int)MSG.Msg_Format.WRITECARD :

break;

default:

break;

}

}

public string toSPNum

{

get

{

return(this._destID );

}

}

public string SrcNum

{

get

{

return(this._srcTerminateID);

}

}

public string Content

{

get

{

return(this._Content );

}

}

public string SvcCode

{

get

{

return(this._svcCode);

}

}

public UInt64 MsgID

{

get

{

return(this._msgid) ;

}

//set

//{

// this._msgid =value;

//}

}

public string MsgIDString

{

get

{

return(this._msgid).ToString();

}

}

private int _getRealBytesLength(byte[] bts,int index)

{

int i=index;

for( ;i<bts.Length ;i++)

{

if(bts[i]==0)

{

break;

}

}

return i-index;

}

}

public class TerminateEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_TERMINATE _msg;

public TerminateEventArgs( uint seq)

{

this._seq =seq;

}

public TerminateEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_TERMINATE)msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg);

}

}

public class TerminateRespEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_TERMINATE_RESP _msg;

public TerminateRespEventArgs(uint seq)

{

this._seq =seq;

}

public TerminateRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_TERMINATE_RESP)msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg );

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq);

}

}

}

public class TestEventArgs: EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_TEST _msg;

public TestEventArgs(uint seq)

{

this._seq =seq;

}

public TestEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_TEST)msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg );

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq );

}

}

}

public class TestRespEventArgs: EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_TEST_RESP _msg;

public TestRespEventArgs(uint seq)

{

this._seq =seq;

}

public TestRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_TEST_RESP)msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg );

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq);

}

}

}

public class CancelRespEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_CANCEL_RESP _msg;

public CancelRespEventArgs(uint seq)

{

this._seq =seq;

}

public CancelRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_CANCEL_RESP) msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg);

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq );

}

}

}

public class QueryRespEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_QUERY_RESP _msg;

public QueryRespEventArgs(uint seq)

{

this._seq =seq;

}

public QueryRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_QUERY_RESP)msg;

this._seq =this._msg.Sequence;

}

public object getMSG()

{

return(this._msg);

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq);

}

}

}

public class ConnectRespEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_CONNECT_RESP _msg;

public ConnectRespEventArgs(uint seq)

{

this._seq =seq;

}

public ConnectRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_CONNECT_RESP)msg;

this._seq =this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg );

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq );

}

}

}

public class SubmitRespEventArgs:EventArgs

{

private uint _seq;

private MSG.CMPP_MSG_SUBMIT_RESP _msg;

public SubmitRespEventArgs(uint seq)

{

this._seq =seq;

}

public SubmitRespEventArgs(object msg)

{

this._msg =(MSG.CMPP_MSG_SUBMIT_RESP)msg;

this._seq=this._msg.Sequence ;

}

public object getMSG()

{

return(this._msg );

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq );

}

}

}

public class WaitingQueueItemEventArgs:EventArgs

{

private uint _seq;

private object _q;

public WaitingQueueItemEventArgs(uint seq)

{

this._seq =seq;

}

public WaitingQueueItemEventArgs(object q)

{

this._q =q;

}

public uint Sequence

{

set

{

this._seq =value;

}

get

{

return(this._seq );

}

}

public object getQueueItem()

{

return(this._q );

}

}

public class ClientQueueStateArgs //当CMPP client的服务停止时候,队列的状态参数

{

private SortedList _waiting;

private SortedList _out;

public ClientQueueStateArgs(SortedList outQueue,SortedList inQueue)

{

this._waiting =inQueue;

this._out =outQueue;

}

public SortedList WaitingQueue

{

get

{

return(this._waiting );

}

set

{

this._waiting =value;

}

}

public SortedList OutQueue

{

get

{

return(this._out );

}

set

{

this._out =value;

}

}

}

public class StateObject

{

public Socket workSocket = null; // Client socket.

public const int BufferSize = 1024; // Size of receive buffer.

public byte[] buffer = new byte[BufferSize]; // Receive buffer.

public byte[] result_buf=null; //接收最终的结果缓冲区

public int _msglength=0; //接收到多少个字节数据

}

public enum SMSDBQueue_Status :int

{

NEW=0, //新消息,等待发送

SENDED=1, //正在发送,等待回应

RESP=2, //送达SMSC,得到msgid

DELIVRD=3, //得到报告,状态ok

EXPIRED=4, //过期

DELETED=5, //已经删除此消息 UNDELIV

ACCEPTD=6, // ACCEPTD 状态 未送达 ACCEPTED为中间状态,网关若从短信中心收到后应丢弃,不做任何操作

UNDELIV=7, //未送达

UNKNOWN=8, //未知

REJECTD=9 //被弹回

}

public class SMSDBQueue

{

private uint _sequence=0; //对应的cmppclient的序列号

private int _smsdbID=0; //对应的数据库的发送自动增长ID

private int _cmpp_msgType; //cmpp协议的定义的消息类型

private object _cmpp_msg_object; //cmpp消息对象,备检索

private int _currentStatus; //当前消息体状态

private DateTime _inQueueTime=DateTime.Now; //消息产生设定值

private UInt64 _msgid; //消息返回的SMSC给出的id遍号

public uint Sequence

{

get

{

return(this._sequence );

}

set

{

this._sequence =value;

}

}

public int SMSDBID

{

get

{

return(this._smsdbID);

}

set

{

this._smsdbID =value;

}

}

public int CurrentStatus

{

get

{

return(this._currentStatus );

}

set

{

this._currentStatus =value;

}

}

public int CMPPMsgType

{

get

{

return(this._cmpp_msgType );

}

set

{

this._cmpp_msgType =value;

}

}

public DateTime InQueueTime

{

get

{

return(this._inQueueTime );

}

set

{

this._inQueueTime =value;

}

}

public object MsgObject

{

get

{

return(this._cmpp_msg_object );

}

set

{

this._cmpp_msg_object =value;

}

}

public UInt64 UIMsgID

{

get

{

return(this._msgid );

}

set

{

this._msgid =value;

}

}

public string MsgID

{

get

{

return(this._msgid.ToString ());

}

set

{

this._msgid =Convert.ToUInt64(value);

}

}

}

//*************工具类结束***********************************

//********************接口类,用于连接对外的短信存储系统**********************

public interface ISMSStore //定义一个存储接口

{

SMSRec[] getSMSsFromStore(); //从外部存储中获取消息

void updateStoreObjec(int storeObjectID,string state); //更新id代表的对象状态,用于监测状态报告

void updateSMSCMsgID(int storeObjectID,UInt64 msgid);

bool addSMS2Store(SMSRec sms); //向store中存储短消息

string getFeeCode(string svccode); //根据svccode返回消息的收费,根据移动参数进行设定

}

public class SMSRec //SMS载数据库中的表达

{

private int _RecID;

private string _feeUser; //计费用户

private int _smsType=0; //短信类型 0 普通文字短信 1 闪烁短信 2 查询命令短信 3 包月短信

private string _svccode; //服务代码

private string _msg; //消息

private string _state; //消息状态

private string _feecode;

private string _spnum;

private string _toUser;

public SMSRec(int recid,string feeuser,string feecode,string svccode,string msg,string spnum)

{

this._RecID =recid;

this._feeUser =feeuser;

this._toUser =feeuser;

this._svccode =svccode;

this._msg =msg;

this._spnum =spnum;

}

public SMSRec(int recid,string feeuser,string touser,string feecode,string svccode,string msg,string spnum)

{

this._RecID =recid;

this._feeUser =feeuser;

this._toUser =touser;

this._svccode =svccode;

this._msg =msg;

this._spnum =spnum;

}

public string SvcCode

{

get

{

return(this._svccode );

}

set

{

this._svccode =value;

}

}

public string FeeCode

{

get

{

return(this._feecode );

}

set

{

this._feecode =value;

}

}

public string FeeUser

{

get

{

return(this._feeUser );

}

set

{

this._feeUser =value;

}

}

private string ToUser

{

get

{

return(this._toUser);

}

set

{

this._toUser=value;

}

}

public string SPNum

{

get

{

return(this._spnum );

}

set

{

this._spnum =value;

}

}

public string Message

{

get

{

return(this._msg );

}

set

{

this._msg =value;

}

}

}

//****************************** 接口类结束 *********************************

//*************************定义 处理数据库接口的SMS系统类,该类对外提供CMPP处理功能***********

//**功能,实现队列监测,处理失败消息、成功消息,处理定时存储更新等抽象功能的组织,将CMPPClient包装提供

public class SMSSystem

{

private ISMSStore dbcls=null;

private CMPPClient client=null;

private string pwd;

private string systemid;

private string spnum;

public void setISMSStoreInterface(ISMSStore ismsstore)

{

dbcls=ismsstore;

}

public SMSSystem(string systemid,string spnum,string password,string cmppserverip,int cmppport)

{

client=new CMPPClient();

client.Init(cmppserverip,cmppport);

this.spnum =spnum;

this.systemid =systemid;

this.pwd =password;

}

}

//********************************处理SMS系统类结束

namespace MSG //消息类定义

{

//*************枚举类型开始***********************************

public enum CMPP_COMMAND_ID:uint

{

CMPP_CONNECT =1,

CMPP_CONNECT_RESP =0x80000001,

CMPP_TERMINATE =0x00000002, // 终止连接

CMPP_TERMINATE_RESP =0x80000002, // 终止连接应答

CMPP_SUBMIT =0x00000004 , //提交短信

CMPP_SUBMIT_RESP =0x80000004, // 提交短信应答

CMPP_DELIVER =0x00000005 , //短信下发

CMPP_DELIVER_RESP =0x80000005, // 下发短信应答

CMPP_QUERY =0x00000006 , //发送短信状态查询

CMPP_QUERY_RESP =0x80000006, // 发送短信状态查询应答

CMPP_CANCEL =0x00000007, // 删除短信

CMPP_CANCEL_RESP =0x80000007, // 删除短信应答

CMPP_ACTIVE_TEST =0x00000008 , //激活测试

CMPP_ACTIVE_TEST_RESP=0x80000008 // 激活测试应答

}

public enum FeeUserType

{

FEE_TERMINAL_ID =0, //

FEE_SOURCE_ID =1,

FEE_SP =2,

FEE_NULL =3

}

public enum Msg_Format

{

ASCII =0,

WRITECARD =1,

BINARY =2,

UCS2 =8,

GB2312 =15

}

public enum SUBMIT_RESULT

{

SUCC =0,

MSG_STRUCTURE_ERR =1,

COMMANID_ERR =2,

MSG_SEQUENCE_ERR =3,

MSG_LENGTH_ERR =4,

FEE_CODE_ERR =5,

OUT_OF_MSG_LEN_ERR =6,

SVC_CODE_ERR =7,

FLUX_ERR =8,

OTHER_ERR =9

}

//*************枚举类型结束***********************************

//*************结构定义开始***********************************

public struct FeeType

{

public static readonly string FEE_TERMINAL_FREE ="01";

public static readonly string FEE_TERMINAL_PERITEM ="02";

public static readonly string FEE_TERMINAL_MONTH ="03";

public static readonly string FEE_TERMINAL_TOP ="04";

public static readonly string FEE_TERMINAL_SP ="05";

}

public struct DELIVER_STATE

{

public static readonly string DELIVERED ="DELIVRD";

public static readonly string EXPIRED ="EXPIRED";

public static readonly string DELETED ="DELETED";

public static readonly string UNDELIVERABLE ="UNDELIV";

public static readonly string ACCEPTED ="ACCEPTD";

public static readonly string UNKNOWN ="UNKNOWN";

public static readonly string REJECTED ="REJECTD";

}

//*************结构类型结束***********************************

//****************消息类**************************************

public class CMPP_MSG_Header //消息头

{

private byte[] initValue=new byte[MSG.CMPP_MSG_Header.HeaderLength];

public CMPP_MSG_Header(CMPP_COMMAND_ID Command_ID) //发送前

{

BIConvert.Int2Bytes((uint)Command_ID).CopyTo(initValue,4);

}

public CMPP_MSG_Header(byte[] bs) //根据受到的字节进行构造 字节序列

{

int l=MSG.CMPP_MSG_Header.HeaderLength ;

for(int i=0;i<l;i++)

{

initValue[i]=bs[i];

}

}

public CMPP_MSG_Header(byte[] bs,int baseIndex) //根据受到的字节进行构造 字节序列

{

int l=MSG.CMPP_MSG_Header.HeaderLength ;

for(int i=0;i<l;i++)

{

initValue[i]=bs[baseIndex+i];

}

}

public uint MSGLength //获取此消息头代表的消息的整个长度

{

get

{

return(BIConvert.Bytes2UInt(initValue,0));

}

set

{

byte[] t=BIConvert.Int2Bytes(value);

for(int i=0;i<4;i++)

{

initValue[i]=t[i];

}

}

}

public uint Command_ID

{

get

{

return(BIConvert.Bytes2UInt(initValue,4));

}

set

{

byte[] t=BIConvert.Int2Bytes(value);

for(int i=0;i<4;i++)

{

initValue[i+4]=t[i];

}

}

}

public uint SequenceId

{

get

{

return(BIConvert.Bytes2UInt(initValue,8));

}

set

{

byte[] t=BIConvert.Int2Bytes(value);

for(int i=0;i<4;i++)

{

initValue[i+4+4]=t[i];

}

}

}

public byte[] toBytes()

{

return( initValue ); //将字段转化为字节

}

public void fromBytes(byte[] bs)

{

for(int i=0;i<MSG.CMPP_MSG_Header.HeaderLength;i++)

{

initValue[i]=bs[i];

}

}

public static int HeaderLength

{

get

{

return(4+4+4);

}

}

}

public class CMPP_MSG_CONNECT

{

CMPP_MSG_Header header;

byte[] initValue;

byte[] body;

int baseIndex=MSG.CMPP_MSG_Header.HeaderLength ; //消息的起始

byte ver=0x20;

byte[] AuthenticatorSource=new Byte[16]; //发送的验证信息

string _SystemID="000000";

string _Password="00000000";

string _timestamp="0000000000";

public CMPP_MSG_CONNECT(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_CONNECT);

header.SequenceId =sequence;

header.MSGLength =(uint)(this.BodyLength +MSG.CMPP_MSG_Header.HeaderLength);

body=new byte[this.BodyLength];

}

public CMPP_MSG_CONNECT(byte[] bs)

{

initValue=new byte[bs.Length];

bs.CopyTo(initValue,0); //进行初始化行为

byte[] temp=new byte[ MSG.CMPP_MSG_Header.HeaderLength ];

for(int i=0;i<temp.Length ;i++)

{

temp[i]=bs[i];

}

byte[] body=new Byte[bs.Length - MSG.CMPP_MSG_Header.HeaderLength ];

for(int i=0;i<body.Length ;i++)

{

body[i]=bs[MSG.CMPP_MSG_Header.HeaderLength+i]; //将消息的字节存储

}

header=new MSG.CMPP_MSG_Header(temp); //构造 消息头

header.MSGLength = (uint)(this.BodyLength +MSG.CMPP_MSG_Header.HeaderLength );

header.Command_ID =(uint)MSG.CMPP_COMMAND_ID.CMPP_CONNECT ;

}

public int BodyLength

{

get

{

return(6+16+4+1);

}

}

public string SourceAdd

{

set

{

_SystemID=value;

byte[] t=Encoding.ASCII.GetBytes(_SystemID); //转换为字节数组

t.CopyTo(body,0);

}

}

public string Password

{

set

{

_Password=value;

}

}

public string Version

{

set

{

ver=Convert.ToByte ("0x" + value,16);

}

}

private static string getTimestamp() //返回一个时间戳 4 字节

{

DateTime msgtime=DateTime.Now;

string u=msgtime.Month.ToString().PadLeft(2,'0');

u=u+msgtime.Day.ToString().PadLeft(2,'0');

u=u+msgtime.Hour.ToString().PadLeft(2,'0');

u=u+msgtime.Minute.ToString().PadLeft(2,'0');

u=u+msgtime.Second.ToString().PadLeft(2,'0');

return(u);

}

private byte[] getMd5Code()

{

MD5 md5= new MD5CryptoServiceProvider(); //创建MD5类别

byte[] buf=new byte[6+9+_Password.Length+10] ;

byte[] s_a=Encoding.ASCII.GetBytes(_SystemID); //Source_ADD 就是企业代码

byte[] s_0={0,0,0,0,0,0,0,0,0}; //9字节的0,此处当作右补0

byte[] s_p=Encoding.ASCII.GetBytes(_Password); //密码

this._timestamp =getTimestamp(); //取得认证码时赋值字符串

byte[] s_t=Encoding.ASCII.GetBytes(_timestamp); //10位的字符串字节数组

s_a.CopyTo(buf,0); //base 0

s_0.CopyTo(buf,6); //base 6

s_p.CopyTo(buf,6+9); //base 6+9

s_t.CopyTo(buf,6+9+_Password.Length); //base 6+9+password.length

return(md5.ComputeHash(buf,0,buf.Length));

}

private byte[] getSourceAdd()

{

return( Encoding.ASCII.GetBytes(this._SystemID ));

}

public byte[] ToBytes() //返回当前对象的字节数组印象

{

byte[] reVal=new Byte[MSG.CMPP_MSG_Header.HeaderLength+this.BodyLength];

header.toBytes().CopyTo(reVal,0); //消息头

getSourceAdd().CopyTo(reVal,MSG.CMPP_MSG_Header.HeaderLength); //源地址 企业代码

getMd5Code().CopyTo(reVal,MSG.CMPP_MSG_Header.HeaderLength+6); //认证md5

reVal[MSG.CMPP_MSG_Header.HeaderLength+6+16]=this.ver; //版本字节

BIConvert.Int2Bytes(Convert.ToUInt32(this._timestamp)).CopyTo(reVal, MSG.CMPP_MSG_Header.HeaderLength+6+16+1);

return(reVal);

}

}

public class CMPP_MSG_CONNECT_RESP

{

CMPP_MSG_Header header;

byte Status;

byte[] AuthenticatorISMG;

byte _Version;

public CMPP_MSG_CONNECT_RESP(byte[] bs)

{

byte[] temp_head=new Byte[MSG.CMPP_MSG_Header.HeaderLength ];

int index=0;

for(int i=0;i<MSG.CMPP_MSG_Header.HeaderLength ;i++)

{

temp_head[i]=bs[index++];

}

header=new MSG.CMPP_MSG_Header(temp_head);

Status=bs[index++]; //状态字节

AuthenticatorISMG=new byte[16]; //回应摘要

for(int i=0;i<AuthenticatorISMG.Length ;i++)

{

AuthenticatorISMG[i]=bs[index++];

}

_Version=bs[index++];

}

public bool isOk

{

get

{

return(true);

}

}

public string Ver

{

get

{

return(Convert.ToString(this._Version,16));

}

}

public string ISMGREturnAuthCode

{

get

{

return(Encoding.ASCII.GetString(AuthenticatorISMG));

}

}

public uint Command_ID

{

get

{

return(header.Command_ID);

}

set

{

header.Command_ID =value;

}

}

public uint Sequence

{

get

{

return(header.SequenceId);

}

}

}

public class CMPP_MSG_TERMINATE

{

CMPP_MSG_Header header;

public CMPP_MSG_TERMINATE(uint sequence)

{

header=new MSG.CMPP_MSG_Header(CMPP.YOURCOMPANY.MSG.CMPP_COMMAND_ID.CMPP_TERMINATE);

header.MSGLength =(uint)MSG.CMPP_MSG_Header.HeaderLength ;

header.SequenceId =sequence;

}

public CMPP_MSG_TERMINATE(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

}

public byte[] toBytes()

{

return(header.toBytes());

}

public uint Sequence

{

get

{

return(header.SequenceId );

}

}

}

public class CMPP_MSG_TERMINATE_RESP

{

CMPP_MSG_Header header;

public CMPP_MSG_TERMINATE_RESP(byte[] bs)

{

header=new CMPP_MSG_Header(bs);

}

public CMPP_MSG_TERMINATE_RESP(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_TERMINATE_RESP);

header.MSGLength=(uint)MSG.CMPP_MSG_Header.HeaderLength ;

header.SequenceId =sequence;

}

public byte[] toBytes()

{

return(header.toBytes());

}

public uint Command_ID

{

get

{

return(header.Command_ID);

}

set

{

header.Command_ID =value;

}

}

public uint Sequence

{

get

{

return(header.SequenceId);

}

}

}

public class CMPP_MSG_SUBMIT

{

CMPP_MSG_Header header;

int _isReportOrSMC=1; //是否需要状态报告

int _msgTotal =1; //相同消息的条数

int _msgNumber =1; //

int _msgLevel =0; //消息级别,却胜0

string _svcCode=""; //业务类型

int _feeUserType=0; //计费用户类型字段0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段

string _feeTerminalId=""; //被计费终端

int _tpPid=0;

int _tpUDHI=0;

uint _msgFmt=0; //消息格式

string _msgsrc=""; //消息来源 即spid

string _feeType=MSG.FeeType.FEE_TERMINAL_PERITEM ; //

string _feeCode=""; //资费

string _valIdTime=""; //存活期

string _atTime=""; //调度时间

string _srcId=""; //源号码,就是在手机上显示的号码

int _destUsrNum=0; //接受消息的手机数

string[] _destTerminalIds=new string[100]; //至多100个号码

int _msgLengt=(int)MSG.Msg_Format.GB2312;

string _MsgContent="";

UInt64 _MsgID; //返回的消息ID

public CMPP_MSG_SUBMIT(uint sequence)

{

header=new MSG.CMPP_MSG_Header(CMPP.YOURCOMPANY.MSG.CMPP_COMMAND_ID.CMPP_SUBMIT );

header.SequenceId =sequence;

}

//属性////////////////////////////////////////////////////

public string SMS_Content

{

set

{

this._MsgContent=value;

byte[] t = Encoding.ASCII.GetBytes(value) ;

this._msgLengt=t.Length;

}

}

public int SMS_Delivery_Type //是否要求返回状态确认报告:0:不需要1:需要2:产生SMC话单 (该类型短信仅供网关计费使用,不发送给目的终端)

{

set

{

_isReportOrSMC=value;

}

}

public int Msg_Level

{

set

{

this._msgLevel=value;

}

}

public string Svc_Code

{

set

{

this._svcCode=value;

}

}

public int FeeUserType

{

set

{

this._feeUserType=value;

}

}

public string FeeTerminalId

{

set

{

this._feeTerminalId=value;

}

}

public int UDHI

{

set

{

this._tpUDHI=value;

}

}

public uint MSGFormat

{

set

{

this._msgFmt=value;

}

}

public string SPID

{

set

{

this._msgsrc=value;

}

}

public string SrcID //可以此处确定长号码

{

set

{

this._srcId =value;

}

}

public string FeeType

{

set

{

this._feeType =value.PadLeft(2,'0');

}

}

public string FeeCode

{

set

{

this._feeCode =value;

}

}

public string ValIdTime

{

set

{

this._valIdTime =value;

}

}

public string AtTime

{

set

{

this._atTime =value;

}

}

public UInt64 MsgID

{

set

{

this._MsgID =value;

}

get

{

return(this._MsgID);

}

}

//属性结束//////////////////////////////////////////////

public void addTerminalID(string id)

{

if(this._destUsrNum <100)

{

this._destTerminalIds[this._destUsrNum++]=id;

}

}

public byte[] toBytes() //返回字节数印象

{

byte[] submitData=new byte[400];

int index=MSG.CMPP_MSG_Header.HeaderLength ; //当前包的填充指针

{//进入填充包的过程

index=index+8; //msgid跳过

submitData[index++]=(byte)this._msgTotal;

submitData[index++]=(byte)this._msgNumber;

submitData[index++]=(byte)this._isReportOrSMC;

submitData[index++]=(byte)this._msgLevel;

byte[] svccode=Encoding.ASCII.GetBytes(this._svcCode);

svccode.CopyTo(submitData,index); //拷贝到目标

index=index+10; //index增加

submitData[index++]=(byte)this._feeUserType;

byte[] feetid=Encoding.ASCII.GetBytes(this._feeTerminalId);

feetid.CopyTo(submitData,index);

index=index+21;

submitData[index++]=(byte)this._tpPid;

submitData[index++]=(byte)this._tpUDHI;

submitData[index++]=(byte)this._msgFmt;

byte[] spid=Encoding.ASCII.GetBytes(this._msgsrc);

spid.CopyTo(submitData,index);

index=index+6;

byte[] feetype=Encoding.ASCII.GetBytes(this._feeType);

feetype.CopyTo(submitData,index);

index=index+2;

byte[] feecode=Encoding.ASCII.GetBytes(this._feeCode);

feecode.CopyTo(submitData,index);

index=index+6;

//byte[] validtime=Encoding.ASCII.GetBytes(this._valIdTime);

//validtime.CopyTo (submitData,index);

index=index+17;

//byte[] attime=Encoding.ASCII.GetBytes(this._valIdTime);

//attime.CopyTo (submitData,index);

index=index+17;

byte[] srcid=Encoding.ASCII.GetBytes(this._srcId);

srcid.CopyTo(submitData,index);

index=index+21;

submitData[index++]=(byte)this._destUsrNum;

for(int i=0;i<this._destUsrNum;i++)

{

byte[] temp=Encoding.ASCII.GetBytes(this._destTerminalIds[i]);

temp.CopyTo(submitData,index);

index=index+21;

}

submitData[index++]=(byte)this._msgLengt;

byte[] msg=null;

switch (this._msgFmt)

{//根据编码类型确定转换字节

case (uint)MSG.Msg_Format.ASCII :

msg= Encoding.ASCII.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+ msg.Length;

break;

case (uint)MSG.Msg_Format.BINARY :

msg= Encoding.ASCII.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+ msg.Length;

break;

case (uint)MSG.Msg_Format.GB2312 :

msg=Encoding.Default.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+msg.Length;

break;

case (uint)MSG.Msg_Format.UCS2 :

msg= Encoding.BigEndianUnicode.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+msg.Length;

break;

case (uint)MSG.Msg_Format.WRITECARD : //写卡操作

msg= Encoding.ASCII.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+msg.Length;

break;

default:

msg= Encoding.ASCII.GetBytes(this._MsgContent );

msg.CopyTo(submitData,index);

submitData[index-1]=(byte)msg.Length; //重新设定长度

index=index+msg.Length;

break;

}

index=index+8; //8个保留字节

}

header.MSGLength=(uint)index;//根据index的长度决定传输数据字节长度

byte[] reVal=new byte[index];

header.toBytes().CopyTo(reVal,0);

for(int i=MSG.CMPP_MSG_Header.HeaderLength ;i<reVal.Length;i++)

{

reVal[i]=submitData[i];

}

return(reVal);

}

}

public class CMPP_MSG_SUBMIT_RESP

{

CMPP_MSG_Header header;

byte[] Msg_Id=new byte[8];

byte[] initValue;

public CMPP_MSG_SUBMIT_RESP(byte[] bs)

{

initValue=new byte[bs.Length];

for(int i=0;i<bs.Length ;i++)

{

initValue[i]=bs[i];

}

init();

}

private void init()

{

int index=0;

byte[] temp=new byte[MSG.CMPP_MSG_Header.HeaderLength];

for ( int i=0;i<MSG.CMPP_MSG_Header.HeaderLength;i++)

{

temp[i]=initValue[i];

index=i;

}

index +=1 ;//指到正确位置

header=new MSG.CMPP_MSG_Header(temp);

for(int i=0;i<8;i++)

{

Msg_Id[i]=initValue[index+i];

}

BIConvert.DumpBytes(Msg_Id,"C:\\Submit_resp_MsgID.txt");

}

public UInt64 Msg_ID

{

get

{

UInt64 t= BitConverter.ToUInt64(this.Msg_Id,0) ;

return(t) ;

}

}

public string MsgID

{

get

{

return BitConverter.ToUInt64(this.Msg_Id,0).ToString();

}

}

public uint Command_ID

{

get

{

return(header.Command_ID);

}

set

{

header.Command_ID =value;

}

}

public uint Sequence

{

get

{

return(header.SequenceId);

}

}

public bool isOK

{

get

{

byte b=initValue[MSG.CMPP_MSG_Header.HeaderLength+8];

if((int)b==0)

{

return(true);

}

else

{

return(false);

}

}

}

}

public class CMPP_MSG_QUERY

{

CMPP_MSG_Header header;

string _time;

int _queryType=0;

string _queryCode;

public string Time

{

set

{

_time=value;

}

}

public int Query_Type

{

set

{

_queryType=value;

}

}

public string Query_Code

{

set

{

_queryCode=value;

}

}

public CMPP_MSG_QUERY(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_QUERY);

header.SequenceId =sequence;

}

public byte[] toBytes()

{

byte[] reVal=new byte[MSG.CMPP_MSG_Header.HeaderLength + 8+1+10+8];

int index=0;

header.toBytes().CopyTo(reVal,index);

index=index+MSG.CMPP_MSG_Header.HeaderLength ;

Encoding.ASCII.GetBytes(this._time).CopyTo(reVal,index);//8 Octet String 时间YYYYMMDD(精确至日)

index=index+8;

reVal[index++]=Convert.ToByte(this._queryType);

Encoding.ASCII.GetBytes(this._queryCode).CopyTo(reVal,index);

return(reVal);

}

}

public class CMPP_MSG_QUERY_RESP

{

CMPP_MSG_Header header;

string _time;

byte _queryType;

string _queryCode;

System.UInt32 _MT_TLMsg;

System.UInt32 _MT_Tlusr;

System.UInt32 _MT_Scs;

System.UInt32 _MT_WT;

System.UInt32 _MT_FL;

System.UInt32 _MO_Scs;

System.UInt32 _MO_WT;

System.UInt32 _MO_FL;

public CMPP_MSG_QUERY_RESP(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

int index=MSG.CMPP_MSG_Header.HeaderLength ;

_time=BitConverter.ToString(bs,index,8);

index=index+8;

this._queryType =bs[index++];

this._queryCode=BitConverter.ToString(bs,index,10);

index=index+10;

this._MT_TLMsg=BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MT_Tlusr =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MT_Scs =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MT_WT =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MT_FL =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MO_Scs =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MO_WT =BIConvert.Bytes2UInt(bs,index);

index=index+4;

this._MO_FL =BIConvert.Bytes2UInt(bs,index);

}

public string Time

{

get

{

return(this._time);

}

}

public int Qery_Type

{

get

{

return(this._queryType);

}

}

public string QueryCode

{

get

{

return(this._queryCode);

}

}

public uint Sequence

{

get

{

return(header.SequenceId);

}

}

public uint MT_TLMsg

{

get

{

return(this._MT_TLMsg);

}

}

public uint MT_TLUsr

{

get

{

return(this._MT_Tlusr);

}

}

public uint MT_Src

{

get

{

return(this._MT_Scs);

}

}

public uint MT_WT

{

get

{

return(this._MT_WT);

}

}

public uint MT_FL

{

get

{

return(this._MT_FL);

}

}

public uint MO_Src

{

get

{

return(this._MO_Scs);

}

}

public uint MO_WT

{

get

{

return(this._MO_WT);

}

}

public uint MO_FL

{

get

{

return(this._MO_FL);

}

}

}

public class CMPP_MSG_DELIVER

{

CMPP_MSG_Header header;

System.UInt64 _msgid;

string _destid;

string _svccode;

int _tpid;

int _udhi;

int _msgfmt;

string _srctid;

bool _isReport;

int _msglength;

string _msg;

System.UInt64 _reportForMsgid;

string _reportState;

string _submitTime;

string _doneTime;

string _reportDesttid;

int _smscSequence;

public CMPP_MSG_DELIVER(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

int index=MSG.CMPP_MSG_Header.HeaderLength;

this._msgid = BitConverter.ToUInt64(bs,index);

index+=8;

this._destid = Encoding.ASCII.GetString(bs,index,21);

index=index+21;

this._svccode =Encoding.ASCII.GetString(bs,index,10);

index=index+10;

this._tpid =(int) bs[index++];

this._udhi =(int) bs[index++];

this._msgfmt=(int) bs[index++];

this._srctid =Encoding.ASCII.GetString(bs,index,21);

index+=21;

if(bs[index++]==1)

{

this._isReport =true;

}

else

{

this._isReport =false;

}

this._msglength =(int) bs[index++];

if(! this._isReport )

{

switch(this._msgfmt )

{

case (int) MSG.Msg_Format.ASCII :

this._msg = Encoding.ASCII.GetString(bs,index,this._msglength );

index+=this._msglength ;

break;

case (int)MSG.Msg_Format.BINARY :

this._msg = Encoding.Default.GetString (bs,index,this._msglength );

index+=this._msglength ;

break;

case (int)MSG.Msg_Format.GB2312 :

this._msg = Encoding.Default.GetString(bs,index,this._msglength );

index+=this._msglength ;

break;

case (int)MSG.Msg_Format.UCS2 :

this._msg = Encoding.BigEndianUnicode.GetString(bs,index,this._msglength );

index+=this._msglength ;

break;

default:

break;

}

}

else

{//状态报告

this._reportForMsgid = BitConverter.ToUInt64(bs,index);

index+=8;

this._reportState = BitConverter.ToString(bs,index,7);

index+=7;

this._submitTime = BitConverter.ToString(bs,index,10);

index+=10;

this._doneTime = BitConverter.ToString(bs,index,10);

index+=10;

this._reportDesttid = BitConverter.ToString(bs,index,21);

index+=21;

this._smscSequence =(int) BIConvert.Bytes2UInt(bs,index );

}

}

public bool isReport

{

get

{

return(_isReport);

}

}

public string Msg

{

get

{

return(this._msg );

}

}

public string SrcID

{

get

{

return(this._srctid);

}

}

public string SvcCode

{

get

{

return(this._svccode);

}

}

public string DestID

{

get

{

return(this._destid );

}

}

public UInt64 MsgID //给应用程序提供序号

{

get

{

return(this._msgid);

}

}

public string StateReport

{

get

{

{

return(this._reportState);

}

}

}

public UInt64 ReportMsgID

{

get

{

{

return(this._reportForMsgid);

}

}

}

public string SubmitTime

{

get

{

{

return(this._submitTime);

}

}

}

public string DoneTime

{

get

{

{

return(this._doneTime);

}

}

}

public string ReportbyDestID

{

get

{

{

return(this._reportDesttid);

}

}

}

public int SMSCSequence

{

get

{

return(this._smscSequence);

}

}

public int ISMGSequence

{

get

{

return((int)this.header.SequenceId);

}

}

public int MsgBytelen

{

get

{

return(this._msglength); //返回deliver包的报告正文长度

}

}

}

public class CMPP_MSG_DELIVER_RESP

{

CMPP_MSG_Header header;

int _result;

//byte[] _msgidbytes=new byte[8];

System.UInt64 _msgid;

public CMPP_MSG_DELIVER_RESP(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_DELIVER_RESP );

header.SequenceId =sequence;

header.MSGLength =(uint) MSG.CMPP_MSG_Header.HeaderLength +8+1;

}

public int Result

{

set

{

this._result = value;

}

}

public UInt64 MsgID

{

set

{

this._msgid =value;

}

}

public byte[] toBytes()

{

byte[] reVal=new byte[MSG.CMPP_MSG_Header.HeaderLength + 9];

int index=0;

header.toBytes().CopyTo(reVal,index);

index=index+MSG.CMPP_MSG_Header.HeaderLength ;

BitConverter.GetBytes(this._msgid).CopyTo(reVal,index);

index=index+8;

reVal[index++]=Convert.ToByte(this._result);

return(reVal);

}

}

public class CMPP_MSG_CANCEL

{

CMPP_MSG_Header header;

byte[] Msg_Id=new byte[8];

string _msgid;

public CMPP_MSG_CANCEL(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_CANCEL);

header.SequenceId =sequence;

header.MSGLength =(uint)( MSG.CMPP_MSG_Header.HeaderLength + 8);

}

public string MsgID

{

set

{

this._msgid =value;

}

}

public byte[] toBytes()

{

byte[] reVal=new byte[MSG.CMPP_MSG_Header.HeaderLength + 8];

int index=0;

header.toBytes().CopyTo(reVal,index);

index=index+MSG.CMPP_MSG_Header.HeaderLength ;

Encoding.ASCII.GetBytes(this._msgid).CopyTo(reVal,index);

return(reVal);

}

}

public class CMPP_MSG_CANCEL_RESP

{

CMPP_MSG_Header header;

bool _Suceeid;

public CMPP_MSG_CANCEL_RESP(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

if(bs[MSG.CMPP_MSG_Header.HeaderLength]==0 )

{

this._Suceeid=false;

}

else

{

this._Suceeid =true;

}

}

public bool isSucc

{

get

{

return(this._Suceeid);

}

}

public uint Sequence

{

get

{

return(this.header.SequenceId);

}

set

{

header.SequenceId =value;

}

}

}

public class CMPP_MSG_TEST

{

CMPP_MSG_Header header;

public CMPP_MSG_TEST( uint sequence )

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST);

header.MSGLength =(uint)MSG.CMPP_MSG_Header.HeaderLength ;

header.SequenceId =sequence;

}

public CMPP_MSG_TEST(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

}

public byte[] toBytes()

{

return(header.toBytes());

}

public uint Sequence

{

get

{

return(header.SequenceId );

}

}

}

public class CMPP_MSG_TEST_RESP

{

CMPP_MSG_Header header;

public CMPP_MSG_TEST_RESP(uint sequence)

{

header=new MSG.CMPP_MSG_Header(MSG.CMPP_COMMAND_ID.CMPP_ACTIVE_TEST_RESP);

header.MSGLength =(uint)(MSG.CMPP_MSG_Header.HeaderLength+1) ;

header.SequenceId =sequence;

}

public CMPP_MSG_TEST_RESP(byte[] bs)

{

header=new MSG.CMPP_MSG_Header(bs);

}

public uint Sequence

{

get

{

return(header.SequenceId );

}

}

public byte[] toBytes()

{

byte[] reVal=new byte[MSG.CMPP_MSG_Header.HeaderLength +1 ];

header.toBytes().CopyTo(reVal,0);

return(reVal);

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有