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

📄 mtthread.cpp

📁 一个手机通信的源代码 一个手机通信的源代码一个手机通信的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		  else
		  {
	  		  m_ConnectStatus=2;
			  m_bBeginReadQueue=FALSE;
		  }
		  break;
	  }
 }//switch
 return TRUE;
}


/*发送Submit消息*/
BOOL CMtThread::SubmitShortMessage()
{	
	CString csTemp,csSrcnum;
	if(m_SendPackage.m_csChildNum!="no")
	  csSrcnum=m_csServicenumber+m_SendPackage.m_csChildNum ;
	else
      csSrcnum=m_csServicenumber;
	if(m_SendPackage.m_Contype==0)
	 {
		   if(!Send(m_SendPackage.m_csSendType,csSrcnum,m_SendPackage.m_csDestPhone,m_SendPackage.m_csFeePhone,
			       m_csICPID,m_SendPackage.m_csServiceType,m_SendPackage.m_csFeetype,m_SendPackage.m_csFeeCode,m_SendPackage.m_csContent,m_SendPackage.m_MsgFmt,m_SendPackage.m_LinkId,m_SendPackage.m_MoToMtFlag,m_SendPackage.m_RegistDeliver))
		   {
		    csTemp.Format("SendErr:%s:发送文本失败重发一次",m_SendPackage.m_csDestPhone);
		    ReportError(csTemp);
			m_ReSend=TRUE;
			return FALSE;
		   }
	}
    else if(m_SendPackage.m_Contype==3)//说明要发送SMC话单
	{
	  SubmitSMCMoney(m_SendPackage.m_csDestPhone,m_SendPackage.m_csContent,m_SendPackage.m_csFeePhone,m_SendPackage.m_csFeetype,
		  m_SendPackage.m_csFeeCode ,m_SendPackage.m_csServiceType);    
      CString csTemp;
	  csTemp.Format("Send SMC OK:%s:%s:%s",m_SendPackage.m_csDestPhone,m_SendPackage.m_csServiceType,m_SendPackage.m_csFeeCode);
	  m_MsgType="00";
	  m_ChildType="03";
	  m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csTemp,m_ProvinceIndex);	
	  m_EventNotReceiveSubmitRsp=SetThreadTimer(WAITSUBMITRSP); 
	}

    else //二进值数据
	{
		if(m_SendPackage.m_SendLength>140)
		{
           SubmitLongBinary();
		}
		else
		{
		   if(!SendBinary(csSrcnum,m_SendPackage.m_csDestPhone,m_SendPackage.m_csFeePhone,
			       m_csICPID,m_SendPackage.m_csServiceType,m_SendPackage.m_csFeetype,m_SendPackage.m_csFeeCode,
				   m_SendPackage.m_BinaryBuf,m_SendPackage.m_SendLength,m_SendPackage.m_MsgFmt,m_SendPackage.m_Tppid,m_SendPackage.m_Tpudhi,m_SendPackage.m_LinkId))
		   {	
		    csTemp.Format("SendErr:%s:发送二进值失败",m_SendPackage.m_csDestPhone);
		    ReportError(csTemp);
			m_ReSend=TRUE;
			return FALSE;
		   }
		}
	}
     csTemp.Format("Send OK:%s:%d:%d:%s",m_SendPackage.m_csDestPhone,m_SendPackage.m_SendLength,m_SendPackage.m_MsgFmt,m_SendPackage.m_csContent);
     m_MsgType="00";
     m_ChildType="02";
     m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csTemp,m_ProvinceIndex);

	 m_ReSend=FALSE;
	 return TRUE;
}

//关闭Socket
void CMtThread::DeleteSocket()
{
 if(m_pMtSocket!=NULL)
 {
	m_pMtSocket->Close();
	delete m_pMtSocket;
    m_pMtSocket=NULL;
 }
}

//得到已发送的消息总数
void CMtThread::GetSubmitMsgs(UINT &Msgs,UINT& ReconnectTimes)
{
	Msgs=m_SubmitMsgs;
    ReconnectTimes=m_ReconnectTimes;
}

// 开始发送
void CMtThread::BeginSubmit()
{
 	int i=0;
	m_bBeginReadQueue=FALSE;//停止读队列直到该条消息发出为止
	if(m_ConnectStatus!=1)
   {
   //Create connection with SMG
    if(!ConnectIsmg())
	{
	  Reconnect();
	}
   }
   else if(m_ConnectStatus==1)
   {
      KillThreadTimer(m_EventKeepActive);
	  KillThreadTimer(m_EventNotReceiveTerminalRsp);
      if(SubmitShortMessage())
	      m_EventNotReceiveSubmitRsp=SetThreadTimer(WAITSUBMITRSP);  
   }
}

//发送过程中等待回应时收到错包,此时该包发送失败,丢弃
void CMtThread::OnReceiveWrongMsg(CString csCommandID)
{
 KillThreadTimer(m_EventNotReceiveConnectRsp);
 KillThreadTimer(m_EventNotReceiveSubmitRsp);
 KillThreadTimer(m_EventNotReceiveTerminalRsp);
 KillThreadTimer(m_EventKeepActive);

 m_bBeginReadQueue=TRUE;  //自动重连
 CString csError;
 csError.Format("Receive Error Message:%s! Reconnect!",csCommandID);
 ReportError(csError);
 DisConnect();
}

//将带MSGID的消息保存到队列中去
void CMtThread::SaveReportToQueue(CString& csMsgID)
{
    CString  csTemp,cs_Mobile,cs_Content,cs_ServerID,cs_FeeType,cs_FeeCode,cs_FeeMobile;
	cs_Mobile=GetSubString(m_TempLabel,1);
	cs_ServerID=GetSubString(m_TempLabel,2);
	cs_FeeType=GetSubString(m_TempLabel,3);
	cs_FeeCode=GetSubString(m_TempLabel,4);
	cs_FeeMobile=GetSubString(m_TempLabel,5);//得到付费手机号
	if(cs_FeeMobile=="")
		cs_FeeMobile=cs_Mobile;
	cs_Mobile.TrimLeft();
	cs_Mobile.TrimRight();
	try
	{
	 if(m_TempBody.vt!=VT_BSTR)
		cs_Content="二进值数据";
	}
	catch(_com_error &e)
	{
	 CMsmqerr errtemp;
     CString ErrorInfo;
     ErrorInfo.Format("SaveReportToQueue:%s",errtemp.GetErrText(e));
     ReportError(ErrorInfo);
     return ;
	}
}

//连接网关
BOOL CMtThread::ConnectIsmg()
{
   CString MsgType="02";
   CString ChildType="02";
   CString csErrorInfo;

   m_pMtSocket=new CMtSocket;
   m_pMtSocket->m_pParentThread=this; 

   if(!Connect())
   {
	 ChildType="01";
	 csErrorInfo="Can't connect to Ismg! Auto Reconnect!";
     m_pParentAction->SaveStatusInfo(MsgType,ChildType,csErrorInfo,m_ProvinceIndex);
	 m_pMtSocket->Close();
	 delete m_pMtSocket;
	 m_pMtSocket=NULL;
	 m_ReconnectEvent=SetThreadTimer(RECONNECTTIME);//设置自动重连
	 return FALSE;
   }
  csErrorInfo.Format("Success to Connect to Ismg:%s,%d,%s,%s!",m_csRemoteIP,m_RemotePort,m_csICPID,m_csPassword);
  m_EventNotReceiveConnectRsp=SetThreadTimer(WAITCONNECTRSP);//等待ConnectRsp
  m_pParentAction->SaveStatusInfo(MsgType,ChildType,csErrorInfo,m_ProvinceIndex);	
  return TRUE;
}

//自动重连
void CMtThread::Reconnect()
{
	m_ConnectStatus=2;
    KillThreadTimer(m_EventNotReceiveSubmitRsp);
    KillThreadTimer(m_EventNotReceiveTerminalRsp);

    DisConnect();
 
    m_ReconnectEvent=SetThreadTimer(RECONNECTTIME);//设置自动重连
    m_bBeginReadQueue=FALSE;
}

//得到连接状态
void CMtThread::GetConnectStatus(CString &csConnectstatus)
{
 if(m_ConnectStatus==0)
    csConnectstatus="未连接";
 else if(m_ConnectStatus==1)
    csConnectstatus="连接正常";
 else if(m_ConnectStatus==2)
	csConnectstatus="自动重连";
 
}

//发送长二进值
BOOL CMtThread::SubmitLongBinary()
{
    if(m_pMtSocket==NULL)
      return FALSE;

    BOOL bSend=TRUE;
	CString csTrueValue="000000";
	CString csFeeValue=m_SendPackage.m_csFeeCode;
	int i,FeeLen=csFeeValue.GetLength();
	if(FeeLen<6)
	{
	 for(i=0;i<FeeLen;i++)
	 {
	   csTrueValue.SetAt(6-FeeLen+i,csFeeValue.GetAt(i));
	 }
	}
	else
     csTrueValue=csFeeValue.Left(6);

	 unsigned char *pBuffer=m_SendPackage.m_BinaryBuf;
     int SendLength;
	 pBuffer=pBuffer+140*(m_SendPackage.m_PkNumber-1);
	 if(m_SendPackage.m_PkNumber==m_SendPackage.m_PkTotal)
	   SendLength=m_SendPackage.m_SendLength-140*(m_SendPackage.m_PkNumber-1);
	 else
       SendLength=140; 
	 bSend=m_pMtSocket->SgipSendBinary(m_csServicenumber,m_SendPackage.m_csDestPhone,m_SendPackage.m_csFeePhone,
			       0,m_SendPackage.m_csFeetype,csFeeValue,pBuffer,SendLength,
				   m_SendPackage.m_csServiceType,m_csICPID,
                   m_SendPackage.m_MsgFmt,m_SendPackage.m_Tppid,m_SendPackage.m_Tpudhi,m_SendPackage.m_LinkId);
	if(bSend)
	{
		if(m_SendPackage.m_PkNumber>=2)
			m_WaitLongSubmitRsp=SetThreadTimer(WAITSUBMITRSP); //因为发第一条的时候在已经打开了计时器
		CString csTemp;
	    csTemp.Format("SendOK Long Binary:%s:%d:%d ContentLength:%d",m_SendPackage.m_csDestPhone,m_SendPackage.m_PkTotal,m_SendPackage.m_PkNumber,SendLength);
	    m_MsgType="00";
	    m_ChildType="02";
	    m_pParentAction ->SaveStatusInfo(m_MsgType,m_ChildType,csTemp,m_ProvinceIndex);
		m_SendPackage.m_PkNumber=m_SendPackage.m_PkNumber+1;
	}
	else
	{
		CString csError;
		csError="Submit Long binary error! Reconnect!";
		ReportError(csError);
		Reconnect();
	}
	return TRUE;
}

void CMtThread::SaveReport(BOOL bSavereport)
{
  m_bSavereport=bSavereport;
}

//得到流水号
int CMtThread::GetSequenceID()
{ 
  m_SequenceID++;

 if(m_SequenceID>=m_BeginSequence+200000)//一个线程流水号使用200000
   m_SequenceID=m_BeginSequence;
  return m_SequenceID;
}

//发送SMC包月话单
BOOL CMtThread::SubmitSMCMoney(CString &csDestMobile, CString &csContent, CString &csFeePhone, CString &csFeetype, CString &csFeeValue, CString &csServiceType)
{
  if(m_pMtSocket==NULL)
     return FALSE;
    CString csTrueValue="000000";
	int i,FeeLen=csFeeValue.GetLength();

	if(FeeLen<6)
	{
	 for(i=0;i<FeeLen;i++)
	 {
	   csTrueValue.SetAt(6-FeeLen+i,csFeeValue.GetAt(i));
	 }
	}
	else
     csTrueValue=csFeeValue.Left(6);

    int MsgFmt=0;
	return m_pMtSocket->SgipSubmitSMC(m_csServicenumber,csDestMobile,csFeePhone,
		                       csFeetype,csFeeValue,csContent,csServiceType,m_csICPID,MsgFmt);

}

//保存发送失败的包
void CMtThread::SaveWrongPackage()
{
	CTime CurTime=CTime::GetCurrentTime();
	CString csTime;
	CString csLabel=m_TempLabel;
	CString csContent;
	csContent.Format("%s %s  %s\r\n",CurTime.Format("%Y-%m-%d %H:%M:%S"),csLabel,m_SendPackage.m_csContent); 
	m_pParentAction->SaveWrongtoLog(csContent);
}

//发送赠送话单
BOOL CMtThread::SubmitGivenMoney(CString &csDestMobile, CString &csContent, CString &csFeePhone, CString &csFeetype, CString &csFeeValue, CString &csServiceType,CString& GivenValue)
{
   if(m_pMtSocket==NULL)
     return FALSE;
    CString csTrueValue="000000";
	int i,FeeLen=csFeeValue.GetLength();

	if(FeeLen<6)
	{
	 for(i=0;i<FeeLen;i++)
	 {
	   csTrueValue.SetAt(6-FeeLen+i,csFeeValue.GetAt(i));
	 }
	}
	else
     csTrueValue=csFeeValue.Left(6);

    int MsgFmt=15;
	return m_pMtSocket->SgipSubmitGivenMoney(m_csServicenumber,csDestMobile,csFeePhone,
		                       csFeetype,csFeeValue,csContent,csServiceType,m_csICPID,MsgFmt,GivenValue);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -