大放送
tomew 2003-09-22 10:46:00 UINT ReceiveThread( LPVOID pParam )
{
CCMPPDlg* pDlg=(CCMPPDlg*)pParam;
UINT index;//线程序号
index=0;
CString sOut,sTitle;
//本来为多个接收连接所做,因为移动只开放了一个接收连接,所以没有实际的应用,只用于界面
sTitle.Format("接收连接 %d: ",index+1);
dpl_status_t stat;
conn_desc conn;
cmppe_login cl;
cmppe_packet cp;
int status;
int type;
int result;
int seq;
UINT count1=0,count2=0,count3=0;
//连接远程服务器
REC_LINK:
pDlg->AddListStatus(sTitle+"请求连接移动短信网关!");
memset(&conn,0,sizeof(conn));
stat = cmpp_connect_to_ismg(host,port,&conn);
if(stat != DPL_SUCCESS)
{
CString sout;
sout.Format("<ICP-TEST> connect error[stat=%d]\n",stat);
pDlg->AddListStatus(sout);
if(count1++<5)
{
CString sOut;
sOut.Format("%s:重新连接移动短信网关!",sTitle);
pDlg->AddListStatus(sOut);
goto REC_LINK;
}
return 0;
}
//登录
count1=0;
pDlg->AddListStatus(sTitle+"连接移动短信网关成功,正在进行登录!");
memset(&cl,0,sizeof(cmppe_login));
Login_value_set(&cl);
//设置为接收型连接
cl.icp_bind_type=1;
stat = cmpp_login(&conn,&cl);
if(stat != DPL_SUCCESS)
{
CString sout;
sout.Format("%s<ICP-TEST> send login request error[stat=%d]\n",sTitle,stat);
pDlg->AddListStatus(sout);
goto finished;
}
//短信息内容或者状态报告在cp中
memset(&cp,0,sizeof(cmppe_packet));
#ifdef UPGRADE
stat = cmpp_recv(&conn,&cp,0,(unsigned int*)&seq);
#else
stat = cmpp_recv(&conn,&cp,0);
#endif
if(stat != DPL_SUCCESS)
{
pDlg->AddListStatus(sTitle+"接收数据时发生错误!");
goto finished;
}
type = cp.pk_head.pk_cmd;//决定是什么类型的包
status = cp.pk_head.pk_stat;//包的状态,为0是正常,不为0是出错
result = cp.result;
seq = cp.pk_head.pk_seq;
sOut.Format("%s<ICP-TEST1>[type=%08x][status=%08x][seq=%08x][result=%02x]\n",\
sTitle,type,status,seq,result);
pDlg->AddListStatus(sOut);
//if(type != 0x80000001)
if(type != CMPPE_LOGIN_RESP)
{
CString sout;
sout.Format("%sLOGIN Recv a Unknown packet![COMMAND_ID=%08x]\n", sTitle,type);
pDlg->AddListStatus(sout);
goto finished;
}
if(status!=0)
{
pDlg->AddListStatus(sTitle+"登录移动短信网关失败!");
goto finished;
}
while (LOOP)//WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT)
{
pDlg->AddListStatus((CString)"等待用户上传短信......\n");
memset(&cp,0,sizeof(cmppe_packet));
stat = cmpp_recv(&conn,&cp,0,(unsigned int*)&seq);
type = cp.pk_head.pk_cmd;
status = cp.pk_head.pk_stat;
result = cp.result;
seq = cp.pk_head.pk_seq;
//if(type != 0x00000005)
if(type != CMPPE_DELIVER)
{
CString sout;
sout.Format("Status Report Recv a Unkown packet![type=%08x][status=%08x][seq=%08x][result=%02x]\n", type,status,seq,result);
pDlg->AddListStatus(sout);
cmpp_logout(&conn);
pDlg->AddListStatus(sTitle+"注销本次登录!");
cmpp_disconnect_from_ismg(&conn);
pDlg->AddListStatus(sTitle+"断开和移动短信网关的连接!");
Sleep(100);
goto REC_LINK;//重新连接
}
CString sout;
sout.Format("<ICP-TEST3>[type=%08x][status=%08x][seq=%08x][result=%02x]\n",type,status,seq,result);
pDlg->AddListStatus(sout);
//cp.pk_data.pk_deliver.status_rpt==1是状态报告
//cp.pk_data.pk_deliver.status_rpt==0是短消息数据
if(cp.pk_data.pk_deliver.status_rpt)//判断是否为状态报告
{
//m_bStatus=true;
CTimeSpan span=CTime::GetCurrentTime()-g_tm;
sout.Format("状态报告延时为 = %d 秒",span.GetSeconds());
pDlg->AddListStatus(sout);
sout.Format("接收到状态报告:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);
//add by wangyi 2003.9.12
//CString strTel=cp.pk_data.pk_deliver.src_addr;
CString strTel=cp.pk_data.pk_deliver.dst_addr;
strTel.TrimLeft();
strTel.TrimRight();
if (pDlg->m_strTestCarSim == strTel)
{
pDlg->KillTimer(TIMER_TESTSEND);
}
//if (m_strTestTel1 == strTel)
// pDlg->KillTimer(TIMER_TESTSEND);
}
else
{
if( cp.pk_data.pk_deliver.data_coding == 8)//ucs2中文
{
Convert(cp.pk_data.pk_deliver.pk_sm.short_msg,cp.pk_data.pk_deliver.sm_len);//编码转换
sout.Format("cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding );
pDlg->AddListStatus(sout);
sout.Format("接收到短信:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);
SMS_INFO* pInfo=new SMS_INFO;
//结合第一个listctrl的列名看
pInfo->bStatus=1;//状态-接收
pInfo->sService=(CString)cp.pk_data.pk_deliver.svc_type;//服务名:GPS...
pInfo->Num_Send=(CString)cp.pk_data.pk_deliver.src_addr;//发送短信的手机号
pInfo->Num_Receive=(CString)cp.pk_data.pk_deliver.dst_addr;//接收短信的手机号
pInfo->RecvTime=CTime::GetCurrentTime();//短信接收时间
pInfo->SMS_Content=(CString)cp.pk_data.pk_deliver.pk_sm.short_msg;//短信的内容
pDlg->DealWithSMSInfo(pInfo);
delete pInfo;
}
else
{
if( cp.pk_data.pk_deliver.data_coding == 0 )//ascii
{
sout.Format("cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding );
pDlg->AddListStatus(sout);
sout.Format("接收到短信:(%s),(%s),(%s)",cp.pk_data.pk_deliver.src_addr,cp.pk_data.pk_deliver.dst_addr,cp.pk_data.pk_deliver.pk_sm.short_msg);
pDlg->AddListStatus(sout);
SMS_INFO* pInfo=new SMS_INFO;
pInfo->bStatus=1;//状态-接收
pInfo->sService=(CString)cp.pk_data.pk_deliver.svc_type;
pInfo->Num_Send=(CString)cp.pk_data.pk_deliver.src_addr;
pInfo->Num_Receive=(CString)cp.pk_data.pk_deliver.dst_addr;
pInfo->RecvTime=CTime::GetCurrentTime();
pInfo->SMS_Content=(CString)cp.pk_data.pk_deliver.pk_sm.short_msg;
pDlg->DealWithSMSInfo(pInfo);
delete pInfo;
}
else
{
sout.Format("收到采用不能识别的格式打包的数据:cp.pk_data.pk_deliver.data_coding = %d",cp.pk_data.pk_deliver.data_coding);
pDlg->AddListStatus(sout);
}
}
}
cmpp_deliver_resp(&conn,cp.pk_head.pk_seq, cp.result);
Sleep(100);
}
cmpp_logout(&conn);
pDlg->AddListStatus(sTitle+"注销本次登录!");
finished:
cmpp_disconnect_from_ismg(&conn);
pDlg->AddListStatus(sTitle+"断开和移动短信网关的连接!");
return 0;
}