📄 cmppapi_test.cpp
字号:
// cmppapi_test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//包含需要的文件.
#include "md5.h"
#include "cmpp.h"
#pragma comment(lib, "cmppapi.lib")
#define CMPP_IMPORT
//用一全局变量记录SubmitResp中的MsgId,用于测试Cancel命令.
_int64 g_nMsgid = 0;
void LogHex(CString szpre, char *msgContent, int nSize)
{
int ix = 0;
CString strOut;
CString strsingle;
strOut.Empty();
strsingle.Empty();
if ( !AfxIsValidAddress(msgContent, nSize) )
{
printf("输入参数无效(LogHex)\r\n");
return;
}
try
{
if (nSize>1000) nSize = 1000;
printf( szpre );
while(ix<nSize)
{
strsingle.Format("%02x ", (unsigned char)msgContent[ix++]);
strOut += strsingle;
}
strOut += "\r\n";
printf( strOut );
}
catch(...)
{
printf("LogHex失败.\r\n");
}
return;
}
void OnSmgMsg(CMPP_SMGTOSP css)
{
char sMultiByte[141];
ZeroMemory(&sMultiByte, 141);
unsigned char uchTmp = 0;
unsigned char pchTmp[1024];
ZeroMemory(pchTmp, 1024);
if (css.pk_head.nCommandId != 0x80000008) {
printf("这是消息处理函数打印出来的:**smg msg,len = %d, cmd = 0x%08x, seq = %d**\n", \
css.pk_head.nTotalLength, css.pk_head.nCommandId, css.pk_head.nSeqId);
}
if (css.pk_head.nCommandId == 0x80000004) {
g_nMsgid = css.pk_body.pk_submitresp.nMsgid;
// stat不是零的话,
// 1:消息结构错
// 2:命令字错
// 3:消息序号重复
// 4:消息长度错
// 5:资费代码错
// 6:超过最大信息长
// 7:业务代码错
// 8:流量控制错
// 9~ :其他错误
printf("SubmitResp, stat = %d.\n", css.pk_body.pk_submitresp.uchResult);
}
if (css.pk_head.nCommandId == 0x00000005) {
// 是状态报告
if (1 == css.pk_body.pk_deliver.uchRegisteredDelivery) {
// stat不是DELIVED的话,取出前七位,例如:MB:0201,给网关技术支持打电话,让他们查原因.
printf("Report, stat = %s.\n", css.pk_body.pk_deliver.MO_Msg_Content.csr.sStat);
}
else {
if (8 == css.pk_body.pk_deliver.uchMsgfmt) {
LogHex("Deliver消息内容", (char*)css.pk_body.pk_deliver.MO_Msg_Content.sMsgcontent, css.pk_body.pk_deliver.uchMsglength);
// Ucs2消息,需要转码
// 高低字节转换
memcpy(pchTmp, css.pk_body.pk_deliver.MO_Msg_Content.sMsgcontent, css.pk_body.pk_deliver.uchMsglength);
for (int ix=0; ix<css.pk_body.pk_deliver.uchMsglength/2; ix++) {
uchTmp = pchTmp[ix*2]; // 低
pchTmp[ix*2] = pchTmp[ix*2 + 1]; // 低 = 高
pchTmp[ix*2 + 1] = uchTmp; // 高 = 低
}
// 转换成MultiByte形式.
int nRet = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (LPCWSTR)pchTmp, css.pk_body.pk_deliver.uchMsglength/2, sMultiByte, 140, NULL, NULL);
// 重新给消息包的长度和内容赋值.
css.pk_body.pk_deliver.uchMsglength = nRet;
ZeroMemory(css.pk_body.pk_deliver.MO_Msg_Content.sMsgcontent, 160);
memcpy(css.pk_body.pk_deliver.MO_Msg_Content.sMsgcontent, sMultiByte, nRet);
}
printf("Deliver消息,消息编码:<%d>, 源号码:<%s>, 消息长度:<%d>, 消息内容:<%s>.\n", \
css.pk_body.pk_deliver.uchMsgfmt, \
css.pk_body.pk_deliver.sSrcterminalid, \
css.pk_body.pk_deliver.uchMsglength, \
css.pk_body.pk_deliver.MO_Msg_Content.sMsgcontent);
}
}
return;
}
void OutProgramInfo()
{
printf("\n*****************************************************************************\n");
printf("**软件名称 - <<中国移动通信CMPP2.0短消息网关开发接口库>> V2.51 客户端例程.\n");
printf("**作者主页 - http://www.zealware.com\n");
printf("**联系方式 - Email:princetoad@126.com\n");
printf("**QQ - 50506711\n");
printf("**MSN - princetoad2003@hotmail.com\n");
printf("**授权方式 - Used Free,SourceCode On Sale.\n");
printf("**********************Published By PrinceToad Jul.4.04.*********************\n\n");
}
//标准cmpp方式,MOMT同一连接的演示例程.
int main(int argc, char* argv[])
{
int nRetCode = 0;
unsigned int nSeq = 0;
OutProgramInfo();
CCmppClient cmpp;
printf("Press Any To Start CmppClient.\n");
system("pause");
//1.启动CMPPCLIENT模块.
//参数的含义(具体可以参考使用手册):网关地址,网关端口,登陆用户名,口令,版本号(最好填0x12),网关连接类型.
//网关连接类型(0:标准单连接cmpp方式,如思特奇,华为,标准东软,1:亚信双连接,2:清华声讯双端口)
//本地测试(由于众所周知的原因,下面真实网关的IP,用户名口令都被屏蔽了,用户可以根据自己的参数进行修改.)
nRetCode = cmpp.Start("127.0.0.1", 7890, "901234", "1234", 0x20, OnSmgMsg, 0);
//连接思特奇
// nRetCode = cmpp.Start("127.0.0.1", 8778, "901234", "password", 0x12, OnSmgMsg, 0);
//连接华为
// nRetCode = cmpp.Start("127.0.0.1", 7890, "901234", "password", 0x12, OnSmgMsg, 0);
//连接东软(标准)
// nRetCode = cmpp.Start("127.0.0.1", 7890, "901234", "password", 0x12, OnSmgMsg, 0);
//连接亚信
// nRetCode = cmpp.Start("127.0.0.1", 7890, "901234", "password", 0x12, OnSmgMsg, 1);
//连接清华声讯(需要在调用Start函数之前调用SetDoublePort函数设定MOMT端口号)
// cmpp.SetDoublePort(7910, 7890);
// nRetCode = cmpp.Start("127.0.0.1", 7890, "901234", "password", 0x20, OnSmgMsg, 2);
if (0 != nRetCode) {
printf("CmppClient Start Failed With Error: %d.\n", nRetCode);
system("pause");
return nRetCode;
}
else {
printf("CmppClient Module Start Success,Press Any To Test Submit Command.\n");
system("pause");
}
//2.测试SUBMIT命令.
for (int ix=0; ix<1; ix++) {
//submit的各参数与cmpp2.0中的submit包内容相对应.
//这里只负责把submit包发出去,不负责接收submitresp以及可能要求的状态报告,
//submitresp包和状态报告均须在OnSmgMsg函数中处理.
//得到submit包的流水号,通过与submitresp的流水号比较,得到submit包的MsgId.
//与状态报告的MsgId比较可以知道此条消息是否已经发到用户手上.
nSeq = cmpp.GetSeqId();
nRetCode = cmpp.Submit(0, 1, 1, \
1, 3, "2939", \
0, NULL, 0, \
0, 0, "901234", \
"02", "000020", NULL, \
NULL, "05550023", 1, \
"8613660617374", 132, "收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话收到给我电话");
printf("Submit result : %d, SeqId = %d\n", nRetCode, nSeq);
}
printf("Press Any To Test Query Command.\n");
system("pause");
system("pause");
//3.测试TERMINATE命令.
cmpp.Release();
printf("Press Any To Exit This Test Program.\n");
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -