📄 mtthread.cpp
字号:
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 + -