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

📄 sgippdu.h

📁 一个用vc开发的Sgip通讯程序
💻 H
字号:
#ifndef _SGIPPDU_H_
#define _SGIPPDU_H_

#include "TcpSocket.h"

#define MAX_TASK_SIZE		2000
#define S_IDLE				0
#define S_WAITANS			1

enum{
	SGIP_BIND_SEND	= 0,
	SGIP_BIND_RECV	= 1
};

enum{
	SGIP_DC_ASCII	= 0,
	SGIP_DC_STK		= 3,
	SGIP_DC_BIN		= 4,
	SGIP_DC_UCS2	= 8,
	SGIP_DC_GB2312	= 15,
};

enum{
	SGIP_BIND			= 0x1L,
	SGIP_BIND_RESP		= 0x80000001L,
	SGIP_UNBIND			= 0x2L,
	SGIP_UNBIND_RESP	= 0x80000002L,
	SGIP_SUBMIT			= 0x3L,
	SGIP_SUBMIT_RESP	= 0x80000003L,
	SGIP_DELIVER		= 0x4L,
	SGIP_DELIVER_RESP	= 0x80000004L,
	SGIP_REPORT			= 0x5L,
	SGIP_REPORT_RESP	= 0x80000005L,
	SGIP_TRACE			= 0x1000L,
	SGIP_TRACE_RESP		= 0x80001000L,
};

//最大包长度
#define	MAX_PACKET_SIZE					4096
//最大短信息长度
#define MAX_MESSAGE_LENGTH				1024

#define SGIP_OK					0	//无错误,命令正确接收
#define SGIP_ERRLOGIN			1	//非法登录,如登录名、口令出错、登录名与口令不符等。
#define SGIP_DUPLOGIN			2	//重复登录,如在同一TCP/IP连接中连续两次以上请求登录。
#define SGIP_CONNECTIONTOOMUCH	3	//连接过多,指单个节点要求同时建立的连接数过多。
#define SGIP_ERRLOGINTYPE		4	//登录类型错,指bind命令中的logintype字段出错。
#define SGIP_ERRPARAM			5	//参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符。
#define SGIP_ERRMOBILENUMBER	6	//非法手机号码,协议中所有手机号码字段出现非86130号码或手机号码前未加“86”时都应报错。
#define SGIP_ERRCOMMANDID		7	//消息ID错
#define SGIP_ERRMSGLENGTH		8	//信息长度错
#define SGIP_ERRSEQUENCE		9	//非法序列号,包括序列号重复、序列号格式错误等
#define SGIP_ERROPERATORGNS		10	//非法操作GNS
#define SGIP_ERRTODEST			21	//目的地址不可达,指路由表存在路由且消息路由正确但被路由的节点暂时不能提供服务的情况
#define SGIP_ERRROUTE			22	//路由错,指路由表存在路由但消息路由出错的情况,如转错SMG等
#define SGIP_ROUTENOTEXIST		23	//路由不存在,指消息路由的节点在路由表中不存在
#define SGIP_ERRCHARGENUMBER	24	//计费号码无效,鉴权不成功时反馈的错误信息
#define SGIP_CANNOTCOMMUNITE	25	//用户不能通信(如不在服务区、未开机等情况)
#define SGIP_MEMORYFULL			26	//手机内存不足
#define SGIP_NOTSUPPORTSHORTMSG	27	//手机不支持短消息
#define SGIP_RECVSHORTMSGERR	28	//手机接收短消息出现错误
#define SGIP_UNKNOWNUSER		29	//不知道的用户
#define SGIP_NOFUNCTION			30	//不提供此功能
#define SGIP_INVALIDDEVICE		31	//非法设备
#define SGIP_SYSTEMFAILED		32	//系统失败


//用户计费类别描述
#define FEETYPE_0			0	//"短消息类型"为"发送",对"计费用户号码"不计信息费,此类话单仅用于核减SP对称的信道费
#define FEETYPE_FREE		1	//对"计费用户号码"免费
#define FEETYPE_BYNUMBER	2	//对"计费用户号码"按条计信息费
#define FEETYPE_BYMONTH		3	//对"计费用户号码"按包月收取信息费
#define FEETYPE_BYSP		4	//对"计费用户号码"的收费是由SP实现

//登入类型
#define BINDTYPE_SP_CONNECT_TO_SMG	1
#define BINDTYPE_SMG_CONNECT_TO_SP	2
#define BINDTYPE_SMG_CONNECT_TO_SMG	3
#define BINDTYPE_SMG_CONNECT_TO_GNS	4
#define BINDTYPE_SP_SMG_TRACE		5

typedef struct tagSGipPduHeader
{
	int iMessageLength; //消息总长度(字节)
	int iCommandId;     //命令ID
	int iSequenceNumber1; //序列号
	int iSequenceNumber2; //序列号
	int iSequenceNumber3; //序列号
} SSGipPduHeader;

typedef struct tagSGipBind
{
	char cLoginType;		  //登入类型,1:SP向SMG建立的连接 2:SMG向SP建立的连接;11:SP与SMG以及SMG之间建立的测试连接,用于跟踪测试
	char szLoginName[16];     //服务器端给客户端分配的登入名
	char szLoginPassword[16]; //服务器和Login Name对应的密码
	char szReserve[8];		  //保留
} SSGipBind;

typedef struct tagSGipBindResp
{
	unsigned char cResult;		//Bind执行命令是否成功,0:执行成功;其它:错误码
	char szReserve[8];	//保留
} SSGipBindResp;

typedef struct tagSGipSubmitSingle
{
	char szSPNumber[21];    //SP的接入号码
	char szChargeNumber[21];  //付费号码,手机号码前加“86”国别标志。若为空,则该条消息的费用由
							  //UserNumber代表的用户支付,如果为全零字符串“000000000000000000000”,则费用由SP支付。
	char cUserCount;          //接收短消息的手机数量(1--100)
	char szUserNumber[21];        //接收短消息的手机号码,手机号码前加“86”
	char szCorpId[5];		  //企业代码(0-99999)
	char szServiceType[10];	  //业务代码,由SP定义
	char cFeeType;			  //计费类型
	char szFeeValue[6];		  //该条短消息的收费值,单位为分,由SP定义,对于包月制收费的用户,该值为月租费的值(范围0-99999)
	char szGivenValue[6];	  //赠送用户的话费,单位为分,由SP定义,特指由SP向用户发送广告时的赠送话费
	char cAgentFlag;		  //代收费标志,0:应收;1:实收
	char cMorelatetoMTFlag;   //引起MT消息的原因 0-MO点播引起的第一条MT消息;
							  //1-MO点播引起的第一条MT消息;2-非MO点播引起的MT消息;3-系统反馈引起的MT消息
	char cPriority;			  //优先级0-9从低到高,默认为0
	char szExpireTime[16];    //短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。
							  //时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
	char szScheduleTime[16];  //短消息定时发送的时间,如果为空,表示立刻发送该短消息。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
	char cReportFlag;		  /* 状态报告标记 
							      0-该条消息只有最后出错时要返回状态报告
								  1-该条消息无论最后是否成功都要返回状态报告
								  2-该条消息不需要返回状态报告
								  其它-保留
								  缺省设置为0
								*/
	char cTP_pid;			  //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
	char cTP_udhi;			  //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
	char cMessageCoding;	  /* 短消息的编码格式。
									0:纯ASCII字符串
									3:写卡操作
									4:二进制编码
									8:UCS2编码
									15: GBK编码
									其它参见GSM3.38第4节:SMS Data Coding Scheme
								*/
	char cMessageType;		  //信息类型:0-短消息信息;其它:待定
	int	 nMessageLength;	  //短消息的长度
	char szMessageContent[MAX_MESSAGE_LENGTH];	  //短消息的内容
	char szReserve[8];		  //保留,扩展用
} SSGipSubmitSingle;

typedef struct tagSGipSubmitResp
{
	char cResult;		//Submit命令是否成功接收。0:接收成功;其它:错误码
	char szReserve[8];	//保留,扩展用
} SSGipSubmitResp;

typedef struct tagSGipDeliver
{
	char szUserNumber[21];		//发送短消息的用户手机号,手机号码前加"86"国别标志
	char szSPNumber[21];		//SP的接入号码
	char cTP_pid;			  //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
	char cTP_udhi;			  //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
	char cMessageCoding;	  /* 短消息的编码格式。
									0:纯ASCII字符串
									3:写卡操作
									4:二进制编码
									8:UCS2编码
									15: GBK编码
									其它参见GSM3.38第4节:SMS Data Coding Scheme
								*/
	int	 nMessageLength;	  //短消息的长度
	char szMessageContent[MAX_MESSAGE_LENGTH];	  //短消息的内容
	char szReserve[8];		  //保留,扩展用
} SSGipDeliver;


typedef struct tagSGipDeliverResp
{
	char cResult;		//Deliver命令是否成功接收。0:接收成功;其它:错误码
	char szReserve[8];		  //保留,扩展用
} SSGipDeliverResp;

typedef struct tagSGipReport
{
	int  nSubmitSequenceNumber1;
	int  nSubmitSequenceNumber2;
	int  nSubmitSequenceNumber3; //该命令所涉及的Submit或deliver命令的序列号
	char cReportType;			 //Report命令类型0:对先前一条Submit命令的状态报告;1:对先前一条前转Deliver命令的状态报告
	char szUserNumber[21];		//接收短消息的用户手机号,手机号码前加"86"国别标志
	char cState;			  /*该命令所涉及的短消息的当前执行状态
									0:发送成功
									1:等待发送
									2:发送失败
								*/
	char cErrorCode;		  //当State=2时为错误码值,否则为0
	char szReserve[8];		  //保留,扩展用
} SSGipReport;

typedef struct tagSGipReportResp
{
	char cResult;		//Report命令是否成功接收。0:接收成功;其它:错误码
	char szReserve[8];	//保留,扩展用
} SSGipReportResp;

typedef struct tagSGipTrace
{
	int  nSubmitSequenceNumber1;
	int  nSubmitSequenceNumber2;
	int  nSubmitSequenceNumber3; //被跟踪MT短消息的命令序列号
	char szUserNumber[21];		//被跟踪MT短消息的目的手机号,手机号码前加"86"国别标志
	char szReserve[8];		  //保留,扩展用
} SSGipTrace;

typedef struct tagSGipTraceResp
{
	char cCount;		//被跟踪MT短消息经过的节点个数,当被跟踪短消息经过多个节点时,以下各个字段可重复
	char cResult;		/*Trace命令在该节点是否成功接收。十六进制数字
							0:接收成功
							1:等待处理
							其它:错误码
						  */
	char szNodeId[6];	//节点编号
	char szReceiveTime[16];  //被跟踪的短消息到达该节点时刻,格式为"yymmddhhmmss"
	char szSendTime[16];	 //该节点发出被跟踪的短消息时刻,格式为"yymmddhhmmss"
	char szReserve[8];		  //保留,扩展用
} SSGipTraceResp;

#define PDU_HEADER_SIZE		sizeof(SSGipPduHeader)
void	GetStatusMessage(unsigned long status,char * szMessage);
CString GetLeftTChar(CString strSrc, int iWordsNum, int iStartPos, int& iDestStrLength);
BOOL	AnalyseNoChineseMessage(CString *strSrc, CString *strDest);
BOOL	IncludeChinese(CString strMsg);
int		GetWorsNumOfStr(CString strMsg);
BOOL	AnalyseMessage(CString *strSrc, CString *strDest);
CString LeftTChar(CString kk, int length, int pos,int &back);
BOOL	IsDigital(char cSrc);
int		SendPacket(CTcpAsyncSocket *pstSocket,unsigned char* szSendBuf,int nSendLen);
int		ReceivePdu(CTcpAsyncSocket* pstSocket,char *szRecvBuf,int nMaxLen);
void	GetIpAddr(CTcpAsyncSocket* pstSocket,char* szIpAddr);
int		UnicodeToAnsi(char *szSourceCode, int nSourceLen, char *szDestCode);
void	LogFile(const char* szMsg);
void    LogTPLSFile(const char* szMsg);
CString TrimStr(CString strSrc);


class CSGipPdu
{
public:
	int			m_nSequenceNumber;
	int			m_nSourceNode;
	int			m_nTotalLen;
	int			m_iSequenceNumber1;
	int			m_iSequenceNumber2;
	int			m_iSequenceNumber3;
	char		m_szBuffer[MAX_PACKET_SIZE];
	CString		m_strSPNumber;
	CString		m_strCorpId;
	char		cReportFlag;

public:
	BOOL SubmitSingle(const char *szUserNumber, const char *szChargeNumber,const char* szSender, const unsigned char * bData,UINT nLength, const char *szServiceType,const char* szLinkID, char cFeeType, const char *szFeeValue, const char *szGivenValue, const char *szScheduleTime, char cMOrelatetoMTFlag,char cMessageCoding,int iTP_pid,int iTP_udhi,int iReportFlag=0,int iPriority=0,int iExpireTimeSpan=0);
	CSGipPdu();
	virtual ~CSGipPdu();
	void	InitData(int nSourceNode,const char* szSPNumber,const char* szCorpId);
	unsigned char*	GetBuffer();
	int		GetLen();
	void	GetHeaderInfo(const char *szBuf,int &nCommandID,int &nSequence1,int &nSequence2,int &nSequence3);
	char	GetBindRespResult(const char *szBuf);
	char	GetSubmitRespResult(const char *szBuf);
	void	PacketHeader(int nCommandId,int nTotalLen);
	void	PacketRespHeader(const char* szBuf,int nCommandId,int nTotalLen);
	void	Bind(int cLoginType,const char* szLoginName,const char* szLoginPassword);
	void	UnBind();
	void	UnBindResp(const char* szBuf);
	void	BindResp(const char* szBuf,char cResult);
	void	SubmitSingle(const char* szUserNumber,const char* szMessageContent,const char* szChargeNumber,
						 const char* szSender,const char* szServiceType,const char* szLinkID,char cFeeType,const char *szFeeValue,const char* szGivenValue,
							const char* szScheduleTime,char cMessageCoding,char cMOrelatetoMTFlag,int iReportFlag=0,int iPriority=0,int iTP_pid=0,int iTP_udhi=0,int iExpireTimeSpan=0);
	void	DeliverResp(const char* szBuf,char cResult);
	void	ReportResp(const char* szBuf,char cResult);

};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -