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

📄 sgipapp.cpp

📁 联通的短信网关平台。 sp 使用。 如果想自己用vc 开发短信业务
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -