📄 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 + -