?? sgip_api_test.cpp
字號:
/**
* 說明:中國聯通SGIP1.2接口庫示例程序
* 作者:PrinceToad
* Email:princetoad@zealware.com
* Http://www.zealware.com
* 版本: 1.0 2003/09/09
* 1.1 2003/11/08
* 1.11 2003/11/25 針對1.23版本作了更新.
* 1.12 2003/12/04 針對1.24版本作了更新.
* 1.2 2004/02/26 針對sgipapi 1.28版進行修改.
* 1.3 2004/03/07 針對sgipapi 1.3版進行修改(用戶可以自定義網關連接數).
* 1.31 2004/03/12 1.3沒能正確讀出配置文件的nodeid.
* 1.4 2004/07.19
* 示例程序介紹:
* 1. 程序會首先從配置文件中讀取相關的配置參數,如網關地址端口,本地監聽端口,用戶名口令,企業代碼,接入號等,
* 因此在啟動以前需要首先配置好這些參數,有關參數的說明在配置文件中有。
* 2. 程序在調用sgip.Start()函數后啟動,然后在后臺進行消息的收發。這時你可以調用sgip.Submit()
* 函數發送消息;系統在收到消息后會調用PDeliver()函數,PDeliver函數作為Deliver消息的處理函數在調用
* Start函數是作為參數傳入。
* 3. 程序還演示了UCS2編碼的轉換,演示了在收到UCS2格式的MO消息是如何轉換成可以正常顯示的MultiByte編碼.
*/
#include "stdafx.h"
#include "sgip.h"
#pragma comment(lib, "sgip")
char g_sSmgIp[20]; // 網關地址
int g_nSmgPort; // 網關端口號
char g_sLocalIp[20]; // 本機地址
int g_nLocalPort; // 本地監聽端口
char g_sUsername[20]; // 登錄名
char g_sPwd[20]; // 登錄口令
char g_sCorpId[20]; // 企業代碼
char g_sNodeId[20]; // 源節點編號
char g_sSpId[20]; // 接入號(特服號)
char g_sServiceType[20]; // 業務代碼
char g_sMsisdn[30]; // 測試用目的手機號
char g_sMsgContent[160]; // 測試用消息內容
int g_nConnCount; // 網關連接數
CString g_szSettingPath; //保存設置的文件路徑
CString g_szCurPath; //保存當前路徑
/**
* 從配置文件獲取配置參數(配置文件setting.ini,在當前目錄下)
*
*/
void GetConfigValue()
{
DWORD dwSize = 20;
ZeroMemory(g_sSmgIp, 20);
g_nSmgPort = 0;
ZeroMemory(g_sLocalIp, 20);
g_nLocalPort = 0;
ZeroMemory(g_sUsername, 20);
ZeroMemory(g_sPwd, 20);
ZeroMemory(g_sCorpId, 20);
ZeroMemory(g_sNodeId, 20);
ZeroMemory(g_sSpId, 20);
ZeroMemory(g_sMsisdn, 30);
ZeroMemory(g_sMsgContent, 160);
ZeroMemory(g_sServiceType, 20);
g_nConnCount = 0;
//獲取當前路徑
CString szCurPath("");
GetModuleFileName(NULL,szCurPath.GetBuffer(MAX_PATH),MAX_PATH);
szCurPath.ReleaseBuffer();
g_szCurPath = szCurPath.Left(szCurPath.ReverseFind('\\') + 1);
//設置文件在當前路徑下
g_szSettingPath = g_szCurPath + "setting.ini";
// 讀取配置
GetPrivateProfileString("setting", "smgip", "Not found",
g_sSmgIp, dwSize, g_szSettingPath);
g_nSmgPort = GetPrivateProfileInt("setting", "smgport", 0, g_szSettingPath);
GetPrivateProfileString("setting", "localip", "Not found",
g_sLocalIp, dwSize, g_szSettingPath);
g_nLocalPort = GetPrivateProfileInt("setting", "localport", 0, g_szSettingPath);
GetPrivateProfileString("setting", "username", "Not found",
g_sUsername, dwSize, g_szSettingPath);
GetPrivateProfileString("setting", "pwd", "Not found",
g_sPwd, dwSize, g_szSettingPath);
GetPrivateProfileString("setting", "corpid", "Not found",
g_sCorpId, dwSize, g_szSettingPath);
GetPrivateProfileString("setting", "nodeid", "Not found",
g_sNodeId, dwSize, g_szSettingPath);
GetPrivateProfileString("setting", "spid", "Not found",
g_sSpId, dwSize, g_szSettingPath);
GetPrivateProfileString("setting", "destid", "Not found",
g_sMsisdn, 30, g_szSettingPath);
GetPrivateProfileString("setting", "msgcontent", "Not found",
g_sMsgContent, 160, g_szSettingPath);
GetPrivateProfileString("setting", "servicetype", "Not found",
g_sServiceType, dwSize, g_szSettingPath);
g_nConnCount = GetPrivateProfileInt("setting", "smgconn", 3, g_szSettingPath);
}
// 輸出程序的描述信息
void OutProgramInfo()
{
printf("\n*****************************************************************************\n");
printf("**軟件名稱 - <<中國聯通SGIP1.2短消息網關開發接口庫>> V1.4例程.\n");
printf("**作者主頁 - http://www.zealware.com\n");
printf("**電子郵件 - Email:princetoad@zealware.com\n");
printf("**MSN - princetoad2003@hotmail.com\n");
printf("**OICQ - 50506711\n");
printf("**聯系電話 - 010-13901168061\n");
printf("**授權方式 - Used Free,SourceCode On Sale.\n");
printf("**********************Published By PrinceToad Jun.19.04.*********************\n\n");
}
// 構造一條主動下發的免費消息包(相關字段從配置文件中獲取,例如企業代碼,接入號,目的手機號,和測試消息內容).
void SetSubmit(sgipg_submit *ss)
{
//SPNumber(SP接入號-21)
strcpy(ss->sSpNumber, g_sSpId);
//ChargeNumber(付費號碼-21,全零表示由SP付費)
strcpy(ss->sChargeNumber, "000000000000000000000");
//UserCount(1)
ss->cUserCount = 1;
//UserNumber(接收消息的電話號碼-21)
strcpy(ss->sUserNumber, g_sMsisdn);
//企業代碼(0-99999 5)
strcpy(ss->sCorpId, g_sCorpId);
//業務代碼(10)
strcpy(ss->sServiceType, g_sServiceType);
//付費類型(1,"1"表示免費)
ss->cFeeType = 1;
//Feevalue(6,10表示2分,可以填空)
//strncpy(ss->sFeeValue, "10");
//Givenvalue(6,一般填空)
//AgentFlag(1,一般為0)
ss->cAgentFlag = 0;
//Mtflag(1,一般填2,表示是由非MO消息引起的MT消息)
ss->cMorelatetoMTFlag = 2;
//priority(1,0-9.0默認)
//Expiretime,scheduleTime(16,16,可以為空)
//Reportflag(1)
ss->cReportFlag = 1;
//tppid,tpudhi(1,1 "0", "0")
//MsgCoding(1,"15")
ss->cMessageCoding = 15; // 能夠顯示中英文.
//msgtype(1,"0")
//024A3A694DA5B99D099585D5D1E404000CA8C2CC2EC49B4000
//content1[0]=0x06; content1[1]=0x05; content1[2]=0x04; content1[3]=0x15; content1[4]=0x81; content1[5]=0x15; content1[6]=0x81
char pchRingContent[] = "0x02 0x4A 0x3A 0x69 0x4D 0xA5 0xB9 0x9D 0x09 0x95 0x85 0xD5 0xD1 0xE4 0x04 0x00 0x0C 0xA8 0xC2 0xCC 0x2E 0xC4 0x9B 0x40 0x00";
// strcpy((char*)ss->sMsgContent, g_sMsgContent);
// 轉換整數(長度)為網絡字節序
// ss->nMsgLen = ntohl(strlen(g_sMsgContent));
ss->sMsgContent[0] = 0x06;
ss->sMsgContent[1] = 0x05;
ss->sMsgContent[2] = 0x04;
ss->sMsgContent[3] = 0x15;
ss->sMsgContent[4] = 0x81;
ss->sMsgContent[5] = 0x15;
ss->sMsgContent[6] = 0x81;
char* pchMsgContent = (char*)ss->sMsgContent;
memcpy(pchMsgContent + 7, pchRingContent, sizeof(pchRingContent));
ss->nMsgLen = htonl(7 + sizeof(pchRingContent));
return;
}
void PDeliver(DeliverStr deliver);
void PReport(ReportStr report);
void PResponse(MTRespStr response);
void PMTError(MTErrorStr mterror);
/**
* 處理Deliver消息的函數
*/
void PDeliver(DeliverStr deliver) {
// Edit with V1.28(打印出MO上行消息的LinkId,這里的LinkId可以不作修改的賦值給對應的MT消息)
// 打印出MO消息的相關字段,包括MO消息的內容.
char sMultiByte[141];
ZeroMemory(&sMultiByte, 141);
unsigned char uchTmp = 0;
unsigned char pchTmp[1024];
ZeroMemory(pchTmp, 1024);
// 如果是UCS2編碼的話,首先需要轉換成MultiByte格式,才能正常顯示。
if (deliver.cMsgCoding == 8) {
memcpy(pchTmp, deliver.sMsgContent, deliver.nMsgLen);
// 高低字節轉換
for (int ix=0; ix<deliver.nMsgLen/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, 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);
}
printf("Deliver, SeqId = <%u>, MsgLen = <%u>, MsgFmt = <%s>, MsgContent = <%s>, LinkId = <%s>.\n", \
deliver.nSeq, deliver.nMsgLen, str, deliver.sMsgContent, deliver.sLinkId);
return;
}
/**
* 處理Report消息的函數
*/
void PReport(ReportStr report){
printf("Report, SubmitSeqId = <%u>, SubmitDateTime = <%u>, sUserNumber = <%s>, State = <%d>, ErrorCode = <%d>.\n", \
report.nSubmitSeq, report.nSubmitDateTime, report.sUserNumber, report.cState, report.cErrcode);
return;
}
/**
* 處理SubmitResponse消息的函數
* (V1.23版本及以后可以返回完整的SUBMIT消息內容,通過MTResponse中的sgipg_submit ss字段)
*/
void PResponse(MTRespStr response){
printf("MTResponse, SeqId = <%u>, ChargeNumber = <%s>, Result = <%d>.\n", \
response.nSeq, response.ss.sChargeNumber, response.cResult);
return;
}
/**
* 處理MT失敗的函數
* (V1.23版本及以后可以返回完整的SUBMIT消息內容,通過MTResponse中的sgipg_submit ss字段)
*/
void PMTError(MTErrorStr mterror){
printf("MTError.Errcode = <%d>\n", mterror.nErrorType);
return;
}
// 演示sgip.dll用法的main函數.
int main(int argc, char* argv[])
{
OutProgramInfo();
CSgip sgip; //定義一個Csgip對象
sgipg_submit ss; //定義一個Submit數據包
GetConfigValue(); // 取得配置參數
//啟動系統(sgip.dll V1.3 使用戶可以自定義同網關的連接數)
if (0 != sgip.Start(g_sLocalIp, g_nLocalPort, g_sSmgIp, \
g_nSmgPort, g_sUsername, g_sPwd, \
1, g_sNodeId, PDeliver, \
PReport, PResponse, PMTError, g_nConnCount, true) ) {
MessageBox(NULL, "初始化失敗.", "提示", MB_ICONERROR);
goto finished;
}
SetSubmit(&ss); // 用于構造submit消息包的函數
//通過調用函數AddUserNumber增加群發功能.(要測試群發的話把下面這句注釋去掉就行)
// sgip.AddUserNumber(&ss, "8613023456789,8613312345670-8613312345699,8613012345678");
// 向網關提交submit消息包(在這里連續發送三次,只是測試用)
// nSeq,nDateTime都是輸出參數。
int ix;
unsigned int nSeq, nDateTime;
for (ix=0; ix<200000; ix++) {
TRACE("%d\n", sgip.GetSubmitSeqId());
//**GetSubmitSeqId()函數的作用是提前獲得下一條Submit消息的序列號,有些用戶有這樣的需求.(一般用不著.)
// printf("提前獲得Submit消息的序列號:%d.\n", sgip.GetSubmitSeqId());
//********************************************************************************************
//**
//**需要注意的是:sgip.Submit函數只是把submit消息提交給后臺,由后臺程序提交給網關,
//**因此在這里沒法判斷消息是否發送成功,需要通過PResponse或PMTError,和PReport來判斷,
//**提交失敗的話,會觸發PMTError函數;提交成功的話,會觸發PResponse函數;成功到達用戶手機的話,
//**會觸發PReport函數(當請求需要狀態報告時.)其中,PMTError和PResponse函數均會返回完整的submit
//**消息包的內容(通過其輸入參數mterror或response中的sgipg_submit ss字段,有些開發者可能用得到).
//**(V1.23 及以后版本支持.)
//********************************************************************************************
sgip.Submit(ss, nSeq, nDateTime);
printf("Submit sequence:<%u>, datetime:<%u>\n", nSeq, nDateTime);
// Sleep(1);
}
//主程序暫停,系統自動在后臺運行,進行短消息的收發處理操作。
system("pause");
finished:
//退出系統前進行系統清理工作
sgip.Release();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -