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

📄 sgipsmg.cpp

📁 短信开发源码
💻 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 + -