?? sgipapp.cpp
字號:
#ifdef __DEBUG_API__
printf("recv a ==BIND== package!\n");
printf("\tiMsgLen=%d\n"
"\tiMsgType=%02x\n"
"\tiMsgid=%u%010d%d\n"
"\tcLoginType=%d\n"
"\tcLUserName=%s\n"
"\tcLUserPwd=%s\n",
ntohl(pMsg->Head.iMsgLen),
ntohl(pMsg->Head.iCmdID),
ntohl(pMsg->Head.sSeqNo.iSrcID),
ntohl(pMsg->Head.sSeqNo.iDate),
ntohl(pMsg->Head.sSeqNo.iSeqno),
pMsg->Body.cLoginType,
pMsg->Body.cLoginName,
pMsg->Body.cLoginPwd);
#endif
SEQUENCE_NUM sSequence;
memset(&sSequence, 0, sizeof(sSequence));
memcpy(&sSequence, &pMsg->Head.sSeqNo, sizeof(sSequence));
memset(cSendBuf, 0, sizeof(cSendBuf));
SGIP_BINDRESP_BODY stResp;
int nBufLen = 0;
mPackage.DeComposePackage(SGIP_BIND_RESP, (SGIP_MSG_BODY &)stResp, (char *)cSendBuf, &nBufLen);
SGIP_BINDRESP_MSG *pMsgResp = (SGIP_BINDRESP_MSG *)cSendBuf;
*(cSendBuf + sizeof(SGIP_HEAD)) = SGIP_LOGIN_RE;
memcpy(&pMsgResp->Head.sSeqNo, &sSequence, sizeof(sSequence));
if (!pSGIPApp->SendToSMC(nSockfd, cSendBuf, nBufLen))
printf("Send Bind Response Error!\n");
break;
}
case SGIP_UNBIND:
{
//SGIP_UNBIND_MSG *pMsg = (SGIP_UNBIND_MSG *)cBuf;
SGIP_UNBIND_MSG sUBindMsg;
memset(&sUBindMsg, 0, sizeof(sUBindMsg));
mPackage.ComposePackage(nMsgType,\
(SGIP_MSG &)sUBindMsg, (const char *)cBuf);
SGIP_UNBIND_MSG *pMsg = &sUBindMsg;
#ifdef __DEBUG_API__
printf("recv a ==UNBIND== package!\n");
#endif
SEQUENCE_NUM sSequence;
memset(&sSequence, 0, sizeof(sSequence));
memcpy(&sSequence, &pMsg->Head.sSeqNo, sizeof(sSequence));
memset(cSendBuf, 0, sizeof(cSendBuf));
SGIP_MSG_BODY stResp;
int nBufLen = 0;
mPackage.DeComposePackage(SGIP_UNBIND_RESP, (SGIP_MSG_BODY &)stResp, (char *)cSendBuf, &nBufLen);
SGIP_UNBINDRESP_MSG *pMsgResp = (SGIP_UNBINDRESP_MSG *)cSendBuf;
memcpy(&pMsgResp->Head.sSeqNo, &sSequence, sizeof(sSequence));
if (!pSGIPApp->SendToSMC(nSockfd, cSendBuf, nBufLen))
printf("Send Unbind Response Error!\n");
close(nSockfd);
printf("Recv thread id:%ld exit!\n", pthread_self());
return NULL;
}
default:
{
printf("Get Error package!\n");
break;
}
}
}
else //recv error
{
//close(nSockfd);
pSGIPApp->DisConnect(nSockfd);
nSockfd = -1;
break;
}
}
if (nSockfd > 0)
{
pSGIPApp->DisConnect(nSockfd);
nSockfd = -1;
//close(nSockfd);
}
printf("Recv thread id:%ld exit!\n", pthread_self());
return NULL;
}
#ifdef __DEBUG_API__
void CSGIPApp::CreateSubmit(SGIP_SUBMIT_BODY &sSubmit)
{
memset(&sSubmit, 0, sizeof(sSubmit));
strcpy(sSubmit.cSPNumber, "9868");
//付費號碼,手機號碼前加"86"國別標志;當且僅當群發且對用戶收費時為空;
//如果為空,則該條短消息產生的費用由UserNumber代表的用戶支付;
//如果為全零字符串"000000000000000000000",表示該條短消息產生的費用由SP支付。
strcpy(sSubmit.cChargeNumber, "000000000000000000000");
//接收短消息的手機數量,取值范圍1至100
sSubmit.cUserCount = 1;
//接收該短消息的手機號,該字段重復UserCount指定的次數,手機號碼前加"86"國別標志
strcpy(sSubmit.cUserNumber, "8613021161729");
//企業代碼,取值范圍0-99999
strcpy(sSubmit.cCorpId, "90009");
//業務代碼,由SP定義
strcpy(sSubmit.cServiceType, "");
//計費類型
sSubmit.cFeeType = 1;
//取值范圍0-99999,該條短消息的收費值,單位為分,由SP定義
//對于包月制收費的用戶,該值為月租費的值
strcpy(sSubmit.cFeeValue, "000000");
//取值范圍0-99999,贈送用戶的話費,單位為分,由SP定義,
//特指由SP向用戶發送廣告時的贈送話費
strcpy(sSubmit.cGivenValue, "000000");
//代收費標志,0:應收;1:實收
sSubmit.cAgentFlag = 1;
//引起MT消息的原因
// 0-MO點播引起的第一條MT消息;
// 1-MO點播引起的非第一條MT消息;
// 2-非MO點播引起的MT消息;
// 3-系統反饋引起的MT消息。
sSubmit.cMorelatetoMTFlag = 2;
//優先級0-9從低到高,默認為0
sSubmit.cPriority = 0;
//短消息壽命的終止時間,如果為空,表示使用短消息中心的缺省值。
//時間內容為16個字符,格式為"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",
//即默認系統為北京時間
strcpy(sSubmit.cExpireTime, "");
//短消息定時發送的時間,如果為空,表示立刻發送該短消息。
//時間內容為16個字符,格式為"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",
//即默認系統為北京時間
strcpy(sSubmit.cScheduleTime, "");
/*狀態報告標記
0-該條消息只有最后出錯時要返回狀態報告
1-該條消息無論最后是否成功都要返回狀態報告
2-該條消息不需要返回狀態報告
3-該條消息僅攜帶包月計費信息,不下發給用戶,要返回狀態報告
其它-保留
缺省設置為0
*/
sSubmit.cReportFlag = 1;
//GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.9
sSubmit.cTP_pid = 0;
//GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
sSubmit.cTP_udhi = 0;
/*短消息的編碼格式。
0:純ASCII字符串
3:寫卡操作
4:二進制編碼
8:UCS2編碼
15: GBK編碼
其它參見GSM3.38第4節:SMS Data Coding Scheme*/
sSubmit.cMessageCoding = 15;
/*信息類型:
0-短消息信息
其它:待定*/
sSubmit.cMessageType = 0;
//短消息的內容
strcpy(sSubmit.cMessageContent, "只供下發的MT短信,僅測試用");
//短消息的長度
int nLen = MAX_CONTENT_LEN;
for (int i=MAX_CONTENT_LEN-1; i>=0; i--)
{
if (*(sSubmit.cMessageContent+i) == '\0')
nLen--;
else
break;
}
sSubmit.iMessageLength = htonl(nLen);
//保留,擴展用
strcpy(sSubmit.cReserve, "");
}
int CSGIPApp::SGIPSingleSendDeliver(SGIP_DELIVER_BODY &sDeliver)
{
char cBuf[5120] = "";
int nSockfd = -1;
if ((nSockfd = DoConnect((char *)g_cServerIP, g_iSrvPort)) == END_FAILED)
{
return END_FAILED;
}
else
printf("SingleSend DoConnect succeed!\n");
//發送
nSubmitTimes = 0;//同一個Submit已發送的次數
while (nSubmitTimes < 3)//nSubmitRetry)
{
nSubmitTimes++;
memset(&cBuf, 0, sizeof(cBuf));
int nBufLen = 0;
m_pkg->DeComposePackage(SGIP_DELIVER, (SGIP_MSG_BODY &)sDeliver, (char *)cBuf, &nBufLen);
while (nSockfd < 0)
{
nSockfd = DoConnect((char *)g_cServerIP, g_iSrvPort);
usleep(10);
}
int nRecvLen = 0;
#ifdef __DEBUG_API__
SGIP_DELIVER_MSG *pDMSG = (SGIP_DELIVER_MSG *)cBuf;
printf("===========DELIVER=============\n"
"\tcSrcID=%d\n"
"\tcDate=%d\n"
"\tcSeqNo=%d\n"
"===========END DELIVER=============\n",
ntohl(pDMSG->Head.sSeqNo.iSrcID),
ntohl(pDMSG->Head.sSeqNo.iDate),
ntohl(pDMSG->Head.sSeqNo.iSeqno));
#endif
if ( !SendToSMC(nSockfd, (const char *)&cBuf, (nBufLen)) )
{
//send err,
close(nSockfd);
nSockfd = -1;
usleep(10);
continue;
}
else
{
//end
printf("Deliver send succeed! start to recv response... ...\n");
while (true)
{
nRecvLen = sizeof(cBuf);
if ((RecvFromSMC(nSockfd, (char *)cBuf, &nRecvLen, 60)) != END_FAILED)
{
unsigned int iMsgType = 0;
if ((iMsgType = m_pkg->GetPackageType((const char *)cBuf)) == SGIP_DELIVER_RESP)
//
{
//recv the deliver resp:
int iRespType = -1;
SGIP_RESP_MSG *pMsg = (SGIP_RESP_MSG *)cBuf;
#ifdef __DEBUG_API__
printf("===========DELIVER RESP=============\n"
"\tcSrcID=%d\n"
"\tcDate=%d\n"
"\tcSeqNo=%d\n"
"\tcResult=%d\n"
"===========END DELIVER RESP=============\n",
ntohl(pMsg->Head.sSeqNo.iSrcID),
ntohl(pMsg->Head.sSeqNo.iDate),
ntohl(pMsg->Head.sSeqNo.iSeqno),
pMsg->Body.cResult);
#endif
iRespType = pMsg->Body.cResult;
//if ((iRespType = m_pkg->GetPackageResult((const char *)cBuf)) == 0)
if (iRespType == 0)
{
DisConnect(nSockfd);
return END_SUCCEED;
}
else
{
printf("deliver package error:%d\n", iRespType);
break;
}
}
else if (iMsgType == SGIP_REPORT)
{
printf("recv a report package!\n");
break;
}
else
{
printf("recv a msg, but no deliver resp! %02x\n", iMsgType);
break;
}
}
else//recv error---break;
break;
}
}
}
DisConnect(nSockfd);
return END_FAILED;
}
int CSGIPApp::SGIPSingleSendReport(SGIP_REPORT_BODY &sReport)
{
char cBuf[5120] = "";
int nSockfd = -1;
if ((nSockfd = DoConnect((char *)g_cServerIP, g_iSrvPort)) == END_FAILED)
{
return END_FAILED;
}
else
printf("SingleSend DoConnect succeed!\n");
//發送
nSubmitTimes = 0;//同一個Submit已發送的次數
while (nSubmitTimes < 3)//nSubmitRetry)
{
nSubmitTimes++;
memset(&cBuf, 0, sizeof(cBuf));
int nBufLen = 0;
m_pkg->DeComposePackage(SGIP_REPORT, (SGIP_MSG_BODY &)sReport, (char *)cBuf, &nBufLen);
while (nSockfd < 0)
{
nSockfd = DoConnect((char *)g_cServerIP, g_iSrvPort);
usleep(10);
}
#ifdef __DEBUG_API__
SGIP_REPORT_MSG *pDMSG = (SGIP_REPORT_MSG *)cBuf;
printf("===========REPORT=============\n"
"\tcSrcID=%d\n"
"\tcDate=%d\n"
"\tcSeqNo=%d\n"
"===========END REPORT=============\n",
ntohl(pDMSG->Head.sSeqNo.iSrcID),
ntohl(pDMSG->Head.sSeqNo.iDate),
ntohl(pDMSG->Head.sSeqNo.iSeqno));
#endif
int nRecvLen = 0;
if ( !SendToSMC(nSockfd, (const char *)&cBuf, nBufLen) )
{
//send err,
close(nSockfd);
nSockfd = -1;
usleep(10);
continue;
}
else
{
//end
printf("Report send succeed! start to recv response... ...\n");
while (true)
{
nRecvLen = sizeof(cBuf);
if ((RecvFromSMC(nSockfd, (char *)cBuf, &nRecvLen, 60)) != END_FAILED)
{
unsigned int iMsgType = 0;
if ((iMsgType = m_pkg->GetPackageType((const char *)cBuf)) == SGIP_REPORT_RESP)
//
{
//recv the deliver resp:
int iRespType = -1;
SGIP_RESP_MSG *pMsg = (SGIP_RESP_MSG *)cBuf;
iRespType = pMsg->Body.cResult;
#ifdef __DEBUG_API__
printf("===========REPORT RESP=============\n"
"\tcSrcID=%d\n"
"\tcDate=%d\n"
"\tcSeqNo=%d\n"
"\tcResult=%d\n"
"===========END REPORT RESP=============\n",
ntohl(pMsg->Head.sSeqNo.iSrcID),
ntohl(pMsg->Head.sSeqNo.iDate),
ntohl(pMsg->Head.sSeqNo.iSeqno),
pMsg->Body.cResult);
#endif
if (iRespType == 0)
{
DisConnect(nSockfd);
return END_SUCCEED;
}
else
{
printf("deliver package error:%d\n", iRespType);
break;
}
}
else if (iMsgType == SGIP_REPORT)
{
printf("recv a report package!\n");
break;
}
else
{
printf("recv a msg, but no report resp! %02x\n", iMsgType);
break;
}
}
else//recv error---break;
break;
}
}
}
DisConnect(nSockfd);
return END_FAILED;
}
void CSGIPApp::CreateDeliver(SGIP_DELIVER_BODY &sDeliver)
{
sDeliver.cMessageCoding = 15;
strcpy(sDeliver.cMessageContent, "只供上行的MO短信,僅測試用");
strcpy(sDeliver.cReserve, "");
strcpy(sDeliver.cSPNumber, "986803");
sDeliver.cTP_pid = 0;
sDeliver.cTP_udhi = 0;
strcpy(sDeliver.cUserNumber, "13021161729");
int nLen = MAX_CONTENT_LEN;
for (int i=MAX_CONTENT_LEN-1; i>=0; i--)
{
if (*(sDeliver.cMessageContent+i) == '\0')
nLen--;
else
break;
}
sDeliver.iMessageLength = htonl(nLen);
return;
}
void CSGIPApp::CreateReport(SGIP_REPORT_BODY &sReport)
{
time_t tt = time(NULL);
tm *pTime = localtime(&tt);
char cTime[11] = "";
memset(cTime, 0, sizeof(cTime));
sprintf(cTime, "%02d%02d%02d%02d%02d",
pTime->tm_mon+1, pTime->tm_mday, pTime->tm_hour,
pTime->tm_min, pTime->tm_sec);
sReport.sSubmitSeqNum.iDate = ntohl(atoi(cTime));
sReport.sSubmitSeqNum.iSeqno = ntohl(g_nSeqNo);
sReport.sSubmitSeqNum.iSrcID = ntohl((u_long)atof(g_cSrcID));
strcpy(sReport.cReserve, "");
sReport.cState = 2;
strcpy(sReport.cUserNumber, "8613021161729");
sReport.ErrorCode = 1;
sReport.cReportType = 1;
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -