📄 cmpp30api_user.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 + -