📄 sgipsmg.cpp
字号:
// SGIPSMG.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "SGIPSMG.h"
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
///
/// 处理Deliver消息的函数
/// Edit with V1.28(打印出MO上行消息的LinkId,这里的LinkId可以不作修改的赋值给对应的MT消息)
/// 打印出MO消息的相关字段,包括MO消息的内容.
/// 如果消息编码是UCS2编码的话,首先需要转换成MultiByte格式,才能正常显示。
/// 如果UCS2经过转换仍然显示乱码,则可能是用户手机的问题。
///
int CMySgip::OnDeliver(DeliverStr & deliver) {
char sMultiByte[141];
ZeroMemory(&sMultiByte, 141);
unsigned char uchTmp = 0;
unsigned char pchTmp[1024];
ZeroMemory(pchTmp, 1024);
if (deliver.cMsgCoding == 8) {
memcpy(pchTmp, deliver.sMsgContent, deliver.nMsgLen);
for (unsigned ix=0; ix<deliver.nMsgLen/2; ix++) {
uchTmp = pchTmp[ix*2];
pchTmp[ix*2] = pchTmp[ix*2 + 1];
pchTmp[ix*2 + 1] = uchTmp;
}
int nRet = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (LPCWSTR)pchTmp, deliver.nMsgLen/2, sMultiByte, 140, NULL, NULL);
deliver.nMsgLen = nRet;
ZeroMemory(deliver.sMsgContent, 160);
memcpy(deliver.sMsgContent, sMultiByte, nRet);
}
CString str = _T("");
switch( (int)deliver.cMsgCoding ) {
case 0:
str = "ASCII编码";
break;
case 4:
str = "二进制编码";
break;
case 8:
str = "UCS2编码";
break;
case 15:
str = "GBK编码";
break;
default:
str.Format("未知-<%d>", deliver.cMsgCoding);
}
OnLogWrite("Deliver, SeqId = <%u>, MsgLen = <%u>, MsgFmt = <%s>, MsgContent = <%s>, LinkId = <%s>.\n", \
deliver.nSeq, deliver.nMsgLen, str, deliver.sMsgContent, deliver.sLinkId);
return 0;
}
///
/// 处理Report消息的函数
///
int CMySgip::OnReport(ReportStr & report){
OnLogWrite("Report, SubmitSeqId = <%u>, SubmitDateTime = <%u>, sUserNumber = <%s>, State = <%d>, ErrorCode = <%d>.\n", \
report.nSubmitSeq, report.nSubmitDateTime, report.sUserNumber, report.cState, report.cErrcode);
return 0;
}
///
/// 处理SubmitResponse消息的函数
/// (V1.23版本及以后可以返回完整的SUBMIT消息内容,通过MTResponse中的sgipg_submit ss字段)
///
int CMySgip::OnResponse(MTRespStr & response){
OnLogWrite("MTResponse, SeqId = <%u>, UserNumber = <%s>, Msg = <%s>, Result = <%d>.\n", \
response.nSeq, response.ss.sUserNumber, response.ss.sMsgContent, response.cResult);
return 0;
}
///
/// 处理MT失败的函数
/// (V1.23版本及以后可以返回完整的SUBMIT消息内容,通过MTResponse中的sgipg_submit ss字段)
///
int CMySgip::OnMTError(MTErrorStr & mterror){
OnLogWrite("MTError.Errcode = <%d>\n", mterror.nErrorType);
return 0;
}
int CMySgip::OnLogWrite(const char* pchFmt, ...)
{
char buffer[1024] = "";
va_list arglist;
va_start( arglist, pchFmt );
_vsnprintf( buffer, 1024, pchFmt, arglist );
va_end(arglist);
printf(buffer);
return 0;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 定义一个Csgip对象
CMySgip sgip;
// 定义一个Submit数据包
sgipg_submit ss;
ZeroMemory(&ss, sizeof(sgipg_submit));
// 启动系统
int nStat =
sgip.Start(
"127.0.0.1", ///< 本地监听地址
8802, ///< 本地监听端口
"127.0.0.1", ///< 网关地址
8801, ///< 网关端口
"username", ///< SP登录网关的用户名
"password", ///< SP登录网关的口令
1, ///< 连接类型(SP登录网关)
"3010090020", ///< SP的节点编号
3, ///< 向网关建立的连接数
"opennet", ///< 网关登录SP的用户名
"opennet", ///< 网关登录SP的口令
16, ///< 允许的网关向SP建立的最大连接数
4, ///< 线程池初始线程数
10 ///< 线程池允许的最大线程数
);
if (0 != nStat) {
printf("启动失败,错误码:%d\n", nStat);
system("pause");
return -1;
}
// 给sgipg_submit消息包赋值
///
/// 构造一条主动下发的免费消息包
///
strcpy(ss.sSpNumber, "9655"); ///< 接入号
strcpy(ss.sChargeNumber, "8613012345678"); ///< 计费号码
ss.cUserCount = 1; ///< 接收消息的用户手机数量
strcpy(ss.sUserNumber, "8613012345678"); ///< 用户手机号
strcpy(ss.sCorpId, "90020"); ///< SP得企业代码
strcpy(ss.sServiceType, "test"); ///< 业务代码
ss.cFeeType = 1;
ss.cAgentFlag = 0;
ss.cMorelatetoMTFlag = 2;
ss.cReportFlag = 1;
ss.cMessageCoding = 15;
ss.nMsgLen = htonl(strlen("test消息"));
strcpy((char*)ss.sMsgContent, "test消息");
// 通过调用函数AddUserNumber增加群发功能.(要测试群发的话把下面这句注释去掉就行)
// sgip.AddUserNumber(&ss, "8613023456789,8613312345670-8613312345699,8613012345678");
// 向网关提交submit消息包
// nSeq,nDateTime都是输出参数。
int ix = 0;
unsigned nSeq, nDateTime;
sgip.Submit(ss, nSeq, nDateTime);
printf("Submit sequence:<%u>, datetime:<%u>\n", nSeq, nDateTime);
///< 程序暂停,此时可以等待接收上行消息
system("pause");
// 退出系统前进行系统清理工作
sgip.Release();
system("pause");
return nRetCode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -