📄 cmpp.h
字号:
// CMPP.h: interface for the CCMPP class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_CMPP_H__747FA963_9BE1_11D8_A9E5_0050BA40A374__INCLUDED_)
#define AFX_CMPP_H__747FA963_9BE1_11D8_A9E5_0050BA40A374__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <Winsock2.h>
#define MAX_TIMEOUT 60000000
#define ERR_OK 0
#define ERR_SOCK_START_FAIL ERR_OK - 1
#define ERR_SOCK_INIT_FAIL ERR_OK - 2
#define ERR_SOCK_SEL_FAIL ERR_OK - 3
#define ERR_SOCK_S_TIMEOUT ERR_OK - 4
#define ERR_SOCK_S_FAIL ERR_OK - 5
#define ERR_SOCK_R_TIMEOUT ERR_OK - 6
#define ERR_SOCK_R_FAIL ERR_OK - 7
#define ERR_SOCK_UNRESOLVE ERR_OK - 8
#define ERR_INITED ERR_OK + 1
#define ERR_INIT_FAIL ERR_OK + 2
#define ERR_INVALID_IP ERR_OK + 3
#define ERR_BINDED ERR_OK + 4
#define ERR_BIND_FAIL ERR_OK + 5
#define ERR_SUBMIT_FAIL ERR_OK + 6
#define ERR_BUF_FULL ERR_OK + 7
#define ERR_BINDING ERR_OK + 8
#define BUF_VALID 0
#define BUF_PENDING 1
#define BUF_READY 2
#define BUF_SENDED 3
#define BUF_RETRY 4
#define MAX_BUF_SIZE 32
#define MAX_DEST_USR 100
#define MAX_LEN_MOBILE_ID 20
#define MAX_BUF_LEN_MOBILE_ID MAX_DEST_USR * (MAX_LEN_MOBILE_ID + 1)
#define MAX_LEN_CONTENT 160
#define MAX_BUF_LEN_CONTENT MAX_LEN_CONTENT * MAX_BUF_SIZE
#ifndef BZERO
#define BZERO(buf) memset(&(buf), 0, sizeof(buf))
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////// C M P P ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CMPP part
//port
#define PORT_LONG_CONNECT 7890
#define PORT_SHORT_CONNECT 7900
//Both 消息类型包括:
#define CMPP_TERMINATE 0x00000002 //终止连接
#define CMPP_TERMINATE_REP 0x80000002 //终止连接应答
//ICP向ISMG发送的消息类型包括:
#define CMPP_CONNECT 0x00000001 //请求连接
#define CMPP_DELIVER_REP 0x80000005 //下发短信应答
#define CMPP_SUBMIT 0x00000004 //提交短信
#define CMPP_QUERY 0x00000006 //发送短信状态查询
#define CMPP_CANCEL 0x00000007 //删除短信
//ISMG向ICP发送的消息类型包括:
#define CMPP_CONNECT_REP 0x80000001 //请求连接应答
#define CMPP_DELIVER 0x00000005 //短信下发
#define CMPP_SUBMIT_REP 0x80000004 //提交短信应答
#define CMPP_QUERY_REP 0x80000006 //发送短信状态查询应答
#define CMPP_CANCEL_REP 0x80000007 //删除短信应答
//长连接时,消息类型包括:
#define CMPP_ACTIVE 0x00000008 //激活测试
#define CMPP_ACTIVE_REP 0x80000008 //激活测试应答
//短连接时,ISMG处于同一级别之上,ISMG之间数据传输采用短连接方式实现,
//互为客户/服务器模式,连接由请求的发起方建立,发送的消息类型包括:
#define CMPP_FWD 0x00000009 //消息前转
#define CMPP_FWD_REP 0x80000009 //消息前转应答
#define CMPP_ROUTE 0x00000003 //路由请求
#define CMPP_ROUTE_REP 0x80000003 //路由请求应答
struct _CMPP_HEAD
{
DWORD Total_Length;
DWORD Command_ID;
DWORD Sequence_ID;
};
//CMPP_CONNECT消息定义(SP——>ISMG)
struct _CMPP_CONNECT
{
//源地址,此处为SP_Id,即SP的企业代码。
char Source_Addr[6];
//用于鉴别源地址。其值通过单向MD5 hash计算得出,表示如下:
//AuthenticatorSource =MD5(Source_Addr+9 字节的0 +shared secret+timestamp)
//Shared secret 由中国移动与源地址实体事先商定,
//timestamp格式为:MMDDHHMMSS,即月日时分秒,10位。
BYTE AuthenticatorICP[16];
//双方协商的版本号(高位4bit表示主版本号,低位4bit表示次版本号
BYTE Version;
//时间戳的明文,由客户端产生,
//格式为MMDDHHMMSS,即月日时分秒,10位数字的整型,右对齐 。
long Timestamp;
};
//CMPP_CONNECT_RESP消息定义(ISMG——>SP)
struct _CMPP_CONNECT_REP
{
//状态——0:正确,1:消息结构错 ,2:非法源地址
//3:认证错,4:版本太高,5~ :其他错误
BYTE Status;
//ISMG认证码,用于鉴别ISMG。
//其值通过单向MD5 hash计算得出,表示如下:
//AuthenticatorISMG =MD5(Status+AuthenticatorSource+shared secret),
//Shared secret 由中国移动与源地址实体事先商定,
//AuthenticatorSource为源地址实体发送给ISMG的对应消息CMPP_Connect中的值。
//认证出错时,此项为空。
char AuthenticatorISMG[16];
//服务器支持的最高版本号
BYTE Version;
};
// CMPP_TERMINATE消息定义(SP——>ISMG或ISMG——>SP)
struct _CMPP_TERMINATE
{
//Null
};
//CMPP_TERMINATE_RESP消息定义(SP——>ISMG或ISMG——>SP)
struct _CMPP_TERMINATE_REP
{
//Null
};
//此结构为信息标识,生成算法如下:采用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)
struct _CMPP_ID
{
__int64 Time_Stamp:24;
__int64 SMC_ID:24;
__int64 Sequence_ID:16;
};
//CMPP_SUBMIT消息定义(SP——>ISMG)
struct _CMPP_SUBMIT
{
//信息标识,由SP侧短信网关本身产生,本处填空.
_CMPP_ID Msg_id;
//相同Msg_Id的信息总条数,从1开始
BYTE Pk_total;
//相同Msg_Id的信息序号,从1开始
BYTE Pk_number;
//是否要求返回状态确认报告:
//0:不需要,1:需要
//2:产生SMC话单(该类型短信仅供网关计费使用,不发送给目的终端)
BYTE Reg_Delivery;
//信息级别
BYTE Msg_level;
//业务类型,是数字、字母和符号的组合。
char Service_id[10];
//计费用户类型字段
//0:对目的终端MSISDN计费;
//1:对源终端MSISDN计费;
//2:对SP计费;
//3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
BYTE Fee_UserType;
//被计费用户的号码
//(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,
//本字段与Fee_UserType字段互斥)
char Fee_terminal_id[MAX_LEN_MOBILE_ID + 1];
//GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
BYTE TP_pid;
//GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
BYTE TP_udhi;
//信息格式
//0:ASCII串
//3:短信写卡操作
//4:二进制信息
//8:UCS2编码
//15:含GB汉字
BYTE Msg_Fmt;
//信息内容来源(SP_Id)
char Msg_src[6];
//资费类别
//01:对"计费用户号码"免费
//02:对"计费用户号码"按条计信息费
//03:对"计费用户号码"按包月收取信息费
//04:对"计费用户号码"的信息费封顶
//05:对"计费用户号码"的收费是由SP实现
char FeeType[2];
//资费代码(以分为单位)
char FeeCode[6];
//存活有效期,格式遵循SMPP3.3协议
char Valid_Time[17];
//定时发送时间,格式遵循SMPP3.3协议
char At_Time[17];
//源号码
//SP的服务代码或前缀为服务代码的长号码,
//网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
//该号码最终在用户手机上显示为短消息的主叫号码
char Src_terminal_id[MAX_LEN_MOBILE_ID + 1];
//接收信息的用户数量(小于100个用户)
BYTE DestUsr_tl;
//接收短信的MSISDN号码
char Dest_terminal_id[(MAX_LEN_MOBILE_ID + 1) * MAX_DEST_USR];
//信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节)
BYTE Msg_Length;
//信息内容
char Msg_Content[MAX_LEN_CONTENT];
//保留
BYTE Reserve[8];
};
//CMPP_SUBMIT_RESP消息定义(ISMG——>SP)
struct _CMPP_SUBMIT_REP
{
//信息标识,生成算法如下:采用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)
_CMPP_ID Msg_id;
//结果0:正确,1:消息结构错 ,2:命令字错 ,3:消息序号重复,4:消息长度错,
//5:资费代码错,6:超过最大信息长,7:业务代码错,8:流量控制错,9~ :其他错误
BYTE bResult;
};
// CMPP_QUERY消息的定义(SP——>ISMG)
struct _CMPP_QUERY
{
//时间YYYYMMDD(精确至日)
char szTime[8];
//查询类别0:总数查询,1:按业务类型查询
BYTE bQueryType;
//查询码当Query_Type为0时,此项无效;
//当Query_Type为1时,此项填写业务类型Service_Id.
char szQueryCode[10];
//保留
BYTE Reserve[8];
};
//CMPP_QUERY_RESP消息的定义(ISMG——>SP)
struct _CMPP_QUERY_REP
{
//时间(精确至日)
char szTime[8];
//查询类别0:总数查询,1:按业务类型查询
BYTE bQueryType;
//查询码
char szQueryCode[10];
//从SP接收信息总数
DWORD lMTTotalMsg;
//从SP接收用户总数
DWORD lMTTotalUsr;
//成功转发数量
DWORD lMTSuccessMsg;
//待转发数量
DWORD lMTWaitMsg;
//转发失败数量
DWORD lMTFailMsg;
//向SP成功送达数量
DWORD lMOSuccessMsg;
//向SP待送达数量
DWORD lMOWaitMsg;
//向SP送达失败数量
DWORD lMOFailMsg;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -