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

📄 cmpp30api_user.h

📁 发送短信的例程.利用东软的发送短信的API函数完成的功能.
💻 H
字号:
#define ERROR_OK			0
#define ERROR_SOCKET_CREATE -100
#define ERROR_CONNECT		-101
#define ERROR_SOCKET_WRITE	-102
#define ERROR_SOCKET_READ	-103
#define ERROR_RSP_TIMEOUT	-104
#define ERROR_BIND_FAILED   -105

#define ASK_DELAY 5   //等待BIND和MT应答的阻塞时间,秒。
#define MSG_MAXLEN 140 //when msg_format = 0;
#define MSISDN_LEN 32

#pragma pack(1)
typedef struct CMPP_HEAD
{
	unsigned int Total_Length;		//消息总长度(含消息头及消息体)
	unsigned int Command_Id;		//命令或响应类型
	unsigned int Sequence_Id;		//消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)
}CMPP_HEAD;

typedef struct CMPP_CONNECT
{
	unsigned char Source_Addr[6];			//源地址,此处为网关分配给SP的用户名(非SP_ID)。
	unsigned char AuthenticatorSource[16];	/*用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:
									AuthenticatorSource =
									MD5(Source_Addr+9 字节的0 +shared secret+timestamp)
									Shared secret 由中国移动与源地址实体事先商定,timestamp格式为:MMDDHHMMSS,即月日时分秒,10位.*/
	unsigned char Version;			//双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号),对于3.0的版本,高4bit为3,低4位为0
	unsigned int Timestamp;			//时间戳的明文,由客户端产生,格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐 。
}CMPP_CONNECT;

typedef struct CMPP_CONNECT_RSP
{
	unsigned int Status;			/*状态`
									0:正确
									1:消息结构错
									2:非法源地址
			 						3:认证错
									4:版本太高
									5~ :其他错误*/
	unsigned char AuthenticatorISMG[16];		/*ISMG认证码,用于鉴别ISMG。
									其值通过单向MD5 hash计算得出,表示如下:
									AuthenticatorISMG =MD5(Status+AuthenticatorSource+shared secret),Shared secret 由中国移动与源地址实体事先商定,AuthenticatorSource为源地址实体发送给ISMG的对应消息CMPP_Connect中的值。
									认证出错时,此项为空。*/
	unsigned char Version;			//服务器支持的最高版本号,对于3.0的版本,高4bit为3,低4位为0
}CMPP_CONNECT_RSP;

typedef struct CMPP_SUBMIT
{
	unsigned __int64 Msg_Id;		//信息标识。
	unsigned char Pk_total;			//相同Msg_Id的信息总条数,从1开始。
	unsigned char Pk_number;		//相同Msg_Id的信息序号,从1开始。
	unsigned char Registered_Delivery;	/*是否要求返回状态确认报告:
										0:不需要;
										1:需要。*/
	unsigned char Msg_level;		//信息级别。
	char Service_Id[10];			//业务标识,是数字、字母和符号的组合。
	unsigned char Fee_UserType;		/*计费用户类型字段:
									0:对目的终端MSISDN计费;
									1:对源终端MSISDN计费;
									2:对SP计费;
									3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。*/
	char Fee_terminal_Id[MSISDN_LEN];		//被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。
	unsigned char Fee_terminal_type;//被计费用户的号码类型,0:真实号码;1:伪码。
	unsigned char TP_pId;			//GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9。
	unsigned char TP_udhi;			//GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
	unsigned char Msg_Fmt;			/*息格式:
									0:ASCII串;
									3:短信写卡操作;
									4:二进制信息;
									8:UCS2编码;
									15:含GB汉字。。。。。。*/
	char Msg_src[6];				//信息内容来源(SP_Id)。
	char FeeType[2];				/*资费类别:
									01:对"计费用户号码"免费;
									02:对"计费用户号码"按条计信息费;
									03:对"计费用户号码"按包月收取信息费。*/
	char FeeCode[6];				//资费(以分为单位)。
	char ValId_Time[17];			//存活有效期,yymmddhhmmss032+
	char At_Time[17];				//定时发送时间, yymmddhhmmss032+
	char Src_Id[21];				//源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。
	unsigned char DestUsr_tl;		//接收信息的用户数量(小于100个用户)。
	char Dest_terminal_Id[99][MSISDN_LEN];	//接收短信的MSISDN号码。
	unsigned char Dest_terminal_type;//接收短信的用户的号码类型,0:真实号码;1:伪码。
	unsigned char Msg_Length;		//信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节),取值大于或等于0。
	char Msg_Content[MSG_MAXLEN];			//信息内容。
	char LinkID[20];				//点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
}CMPP_SUBMIT;

typedef struct CMPP_SUBMIT_RSP
{
	unsigned __int64 Msg_Id;		/*信息标识,生成算法如下:
									采用64位(8字节)的整数:
									(1)	时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
									bit64~bit61:月份的二进制表示;
									bit60~bit56:日的二进制表示;
									bit55~bit51:小时的二进制表示;
									bit50~bit45:分的二进制表示;
									bit44~bit39:秒的二进制表示;
									(2)	短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中;
									(3)	序列号:bit16~bit1,顺序增加,步长为1,循环使用。
									各部分如不能填满,左补零,右对齐。
									(SP根据请求和应答消息的Sequence_Id一致性就可得到CMPP_Submit消息的Msg_Id)*/
	unsigned int Result;			/*结果:
									0:正确;
									1:消息结构错;
									2:命令字错;
									3:消息序号重复;
									4:消息长度错;
									5:资费错;
									6:超过最大信息长;
									7:业务代码错;
									8:流量控制错;
									9:本网关不负责服务此计费号码;
									10:Src_Id错误;
									11:Msg_src错误;
									12:Fee_terminal_Id错误;
									13:Dest_terminal_Id错误;
									100: 时间参数错                  
									101: 用户数错                     
									102: 服务器故障                   
									103: 用户手机号码格式错           
									104: 超过最大连接数               
									105: 黑名单用户                   
									106: 其他错                           
									107: 拒绝接收                     
									108: 服务器无回应                 
									109: IP地址不对                   

									110: SendSocket的TCP连接不对     
									111: RecvSocket的TCP连接不对      
									112: 发送的命令不对               
									113: 发送超时                     
									114: 发送有误                     
									115: 应用层连接有误               
									116: 错误的Smc群发                

									200: 为了区分 2,3,4,9而设定的      
									202: 非法SP_ID                   
									203: SP认证错                     
									204: 版本太高                     
									205: 队列建立错误                  
									209: 前转判断错                  

									……*/
}CMPP_SUBMIT_RSP;

typedef struct CMPP_DELIVER
{
	unsigned __int64 Msg_Id;		/*信息标识。
									生成算法如下:
									采用64位(8字节)的整数:
									(1)	时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
									bit64~bit61:月份的二进制表示;
									bit60~bit56:日的二进制表示;
									bit55~bit51:小时的二进制表示;
									bit50~bit45:分的二进制表示;
									bit44~bit39:秒的二进制表示;
									(2)	短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中;
									(3)	序列号:bit16~bit1,顺序增加,步长为1,循环使用。
									各部分如不能填满,左补零,右对齐。*/
	char Dest_Id[21];				//目的号码。SP的服务代码,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫号码。
	char Service_Id[10];			//业务标识,是数字、字母和符号的组合。
	unsigned char TP_pid;			//GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9。
	unsigned char TP_udhi;			//GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
	unsigned char Msg_Fmt;			/*信息格式:
									0:ASCII串;
									3:短信写卡操作;
									4:二进制信息;
									8:UCS2编码;
									15:含GB汉字。*/
	char Src_terminal_Id[MSISDN_LEN];		//源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)。
	unsigned char Src_terminal_type;//源终端号码类型,0:真实号码;1:伪码。
	unsigned char Registered_Delivery;/*是否为状态报告:
									  0:非状态报告;
									  1:状态报告。*/
	unsigned char Msg_Length;		//消息长度,取值大于或等于0。
	union MSG_CONTENT				
	{	char Text[MSG_MAXLEN];		//消息内容。
		struct CMPP_DELIVER_STATUS			//当ISMG向SP送交状态报告时,CMPP_DELIVER信息内容字段(Msg_Content)格式定义如下:
		{	unsigned __int64 Msg_Id;		//信息标识。SP提交短信(CMPP_SUBMIT)操作时,与SP相连的ISMG产生的Msg_Id。
			char Stat[7];					//发送短信的应答结果。SP根据该字段确定CMPP_SUBMIT消息的处理状态。
			char Submit_time[10];			//YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)。
			char Done_time[10];				//YYMMDDHHMM。
			char Dest_terminal_Id[MSISDN_LEN];		//目的终端MSISDN号码(SP发送CMPP_SUBMIT消息的目标终端)。
			unsigned int SMSC_sequence;		//取自SMSC发送状态报告的消息体中的消息标识。
		}status;
	}Msg_Content;
	char LinkID[20];				//点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
}CMPP_DELIVER;
	
typedef struct CMPP_DELIVER_RSP
{
	unsigned __int64 Msg_Id;		//信息标识(CMPP_DELIVER中的Msg_Id字段)。
	unsigned int Result;			/*结果:
									0:正确;
									1:消息结构错;
									2:命令字错;
									3:消息序号重复;
									4:消息长度错;
									5:资费错;
									6:超过最大信息长;
									7:业务代码错;
									8: 流量控制错;
									9~ :其他错误。*/
}CMPP_DELIVER_RSP;


/*返回值:	 ERROR_SOCKET_CREATE   socket创建失败
			 ERROR_CONNECT	socket连接失败
			 ERROR_SOCKET_WRITE   socket写失败
			 ERROR_SOCKET_READ	socket读失败
			 ERROR_RSP_TIMEOUT   网关超时应答(API等待5秒)
			 >0    socket操作成功的socket号	
param1:  网关IP
param2:  网关端口 MO=7911 MT=7891			
param3:  SP的用户名(非SP_ID)
param4:  SP的密码
param5:  与网关的认证结果*/
int  cmpp_connect(char *pip, char *pport, char *usrnm, char *usrpwd, CMPP_CONNECT_RSP *pcmpp_connect_rsp); 


/*返回值:	ERROR_SOCKET_WRITE    socket写失败
			ERROR_SOCKET_READ	  socket读失败
			ERROR_RSP_TIMEOUT     网关超时应答(API等待5秒)
    		ERROR_OK              socket success
param1:  socket号,是cmpp_connect函数的返回值;					
param2:  用户填写需要发送的CMPP_SUBMIT包;
param3:  查看网关的应答结果;*/
int  cmpp_submit(int socketnumber, CMPP_SUBMIT *pcmpp_submit, CMPP_SUBMIT_RSP *pcmpp_submit_rsp); 


/*返回值:	ERROR_SOCKET_WRITE    socket写失败
			ERROR_SOCKET_READ	socket读失败
			0       得到MO消息
			1       得到状态报告
			2		无消息返回
            3       返回非CMPP_DELIVER消息
param1:  socket号,又cmpp_connect函数返回.
param2:	 返回DELIVER消息包。*/
int  get_cmpp_deliver(int socketnumber, CMPP_DELIVER *pcmpp_deliver);	


/*返回值:   0    断开MO或MT连接成功
param1:  socket号,由cmpp_connect函数返回。*/																				 
int  cmpp_connect_terminate(int socketnumber); 

#pragma pack(8) 

⌨️ 快捷键说明

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