//---------------------------------------------------------------------------- // // Function: SendTick // // Synopsis: 发心跳包 // // Arguments: none // // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall SendTick() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ST_CPACK rpack; unsigned char szBuffer[10960]; int nLen = sizeof(szBuffer); memset(&rpack, 0, sizeof(rpack)); memset(szBuffer, 0, sizeof(szBuffer)); rpack.head.RequestType = 930099; rpack.head.firstflag = 1; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 0; /* 是否后续包请求*/ rpack.head.recCount = 1; /* 本包的记录数*/ rpack.head.retCode = 0; /* 返回代码*/ rpack.head.userdata = 0; SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey)); SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey); char omsg[256]; if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) ) { if( SendDataPro(iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE) == RET_OK ) { WriteTickLog("发心跳包成功! 服务号:%d, 子功能号:%d\n", iServerNo, iFunc); return RET_OK; } } WriteTickLog("发送心跳包失败! 请检查金仕达中间层!! 服务号:%d, 子功能号:%d", iServerNo, iFunc); return RET_SYSERROR; }
int CSvrLink::PushDataEx(TPUSHDEST *pushdests, int pdcount, ST_CPACK *ppack, char pushmode, int acktime) { int i; unsigned char sbuf[MAXMSG]; RP_PUSHDATAH *ph; TPUSHDESTN *pd; unsigned short len; char szmsg[256]; ASSERT(pdcount>0); ph = (RP_PUSHDATAH *)sbuf; ph->pushmode = pushmode; ph->acktime = htonl(acktime); ph->dcount = htons(pdcount); len = sizeof(RP_PUSHDATAH); pd = (TPUSHDESTN *)(sbuf+len); for (i=0;i<pdcount;i++) { pd[i].SourceNo = htons(pushdests[i].SourceNo); pd[i].DestNo = htons(pushdests[i].DestNo); pd[i].FuncNo = htons(pushdests[i].FuncNo); pd[i].BatchNo = htonl(pushdests[i].BatchNo); len += sizeof(TPUSHDESTN); } if (ppack->head.recCount>1) { ppack->head.recCount = 1; } EncodeBuf(ppack,sbuf+len,&i,szmsg); len += i; return(SendMsg(MT_PUSHDATA,len,sbuf)); }
int CSvrLink::IntCall(char *szBUGroupID, int waittime, ST_CPACK *rpack, ST_CPACK *apack, ST_PACK *pArrays) { int rtn; unsigned short len; unsigned char sbuf[MAXMSG]; char szmsg[256]={0}; RP_INTCALLH *pic = (RP_INTCALLH *)sbuf; pic->waittime = htonl(waittime); strncpy(pic->szBUGroupID,szBUGroupID,MAXBUGRPID); if (rpack->head.recCount>1) { rpack->head.recCount = 1; } EncodeBuf(rpack,sbuf+sizeof(RP_INTCALLH),&rtn,szmsg); len = rtn+sizeof(RP_INTCALLH); rtn=SendMsg(MT_INTCALL,len,sbuf); while (rtn==0) { rtn = RecvMsg(waittime*1000+1000); if (rtn>0) { MSGBUF *pmb = GetRecvMsg(); if (pmb->head.msgtype==MT_PUSHDATA) { // 有应答数据返回: rtn = 0; DecodeBufWithArray((unsigned char *)pmb->data,pmb->head.len,apack,pArrays,&rtn,szmsg); //memset(&xcdata,0,sizeof(xcdata)); // 清空 memcpy(&(xcdata.ahead),&(apack->head),sizeof(ST_PACKHEAD)); if (pmb->head.len>=rtn+sizeof(TPUSHDESTN)) { TPUSHDESTN *pd = (TPUSHDESTN *)(pmb->data+rtn); xcdata.sno = ntohs(pd->SourceNo); xcdata.dno = ntohs(pd->DestNo); xcdata.fno = ntohs(pd->FuncNo); } return(rtn); } else { DEBUG_RUNTIME_MSGOUT("IntCall中间收到了非MT_INTCALL应答包,属于程序错误!"); rtn = 0; // 继续读取数据,以便接收到正确的MT_INTCALL应答包 } } else if (rtn==0) { return(-2); // 等待应答数据超时,即自从向外发送了请求后,在waittime+1秒内没有接收到应答数据 } } return(-1); // 其他各种通讯方面的错误 }
int kcc_des_drtp_send_cpack(int handle,ST_CPACK * rpack) { char buf[8182] = ""; int buflen; int ret; ret = EncodeBuf(rpack,(unsigned char*)buf,&buflen,kcc_drtp_err_msg); if( !ret ) { kcc_write_log(LOG_ERR,"encode buffer error .handle[%d]",handle); return -1; } kcc_write_log(LOG_DEBUG,"cpack request type[%d]handle[%d]", rpack->head.RequestType,handle); ret = kcc_drtp_send(handle,buf,buflen,g_des_drtp_func_no); // kcc_drtp_set_main_func(g_des_drtp_func_no); return ret; }
//发设备心跳 (不用!!!! 20050305) long __stdcall SendDocTick(TSSmartDoc *pDoc) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ST_CPACK rpack; unsigned char szBuffer[8192]; int nLen = sizeof(szBuffer); memset(&rpack, 0, sizeof(rpack)); memset(szBuffer, 0, sizeof(szBuffer)); rpack.head.RequestType = 930099; rpack.head.firstflag = 1; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 0; /* 是否后续包请求*/ rpack.head.recCount = 1; /* 本包的记录数*/ rpack.head.retCode = 0; /* 返回代码*/ rpack.head.userdata = 0; char szDateTime[24]; SYSTEMTIME SysTime; GetLocalTime(&SysTime); sprintf(szDateTime, "%02d%02d%02d%02d%02d%02d", SysTime.wYear, SysTime.wMonth, SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond); SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey)); SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey); SetValue(&rpack.head,&rpack.pack, F_SDATE0, pDoc->m_szDeviceID); SetValue(&rpack.head,&rpack.pack, F_SHOLDER_AC_NO, szDateTime); SetValue(&rpack.head,&rpack.pack, F_SSERIAL0, pDoc->m_sDownBlackTime); SetValue(&rpack.head,&rpack.pack, F_DAMT0, "0"); SetValue(&rpack.head,&rpack.pack, F_DAMT1, "0"); SetValue(&rpack.head,&rpack.pack, F_DAMT2, "0"); char omsg[256]; if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) ) { WriteTickLog("发送设备心跳包! 设备ID=%s", pDoc->m_szDeviceID); return SendDataPro(iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE); } return RET_SYSERROR; }
int CSvrLink::AnswerDataEx(TRUSERID *ruserid, ST_CPACK *apack, ST_PACK *pArrays, int retcode, char *szmsg) { unsigned char sbuf[MAXMSG]; RP_ANSDATAEXH *pad; unsigned char *buf; int len; char szMsg[256]; pad = (RP_ANSDATAEXH *)sbuf; buf = sbuf+sizeof(RP_ANSDATAEXH); /* ****** Updated by CHENYH at 2004-3-11 20:43:59 ****** if (szmsg!=NULL && szmsg[0]!='\0') { SetParmBit(&(apack->head),F_VSMESS); strcpy(apack->pack.vsmess,szmsg); } */ apack->head.retCode = retcode; if (ruserid==NULL) { pad->SourceNo = htons(0xFFFF); } else { pad->SourceNo = htons(ruserid->SourceNo); memcpy(&(pad->syshead),&(ruserid->syshead),sizeof(pad->syshead)); } if (apack->head.recCount<1) { len = sizeof(ST_PACKHEAD); ModifyHead(&(apack->head),buf); } else if (apack->head.recCount==1||pArrays==NULL) { apack->head.recCount = 1; EncodeBuf(apack,buf,&len,szMsg); } else { EncodeBufArray(apack,pArrays,buf,&len,szMsg); } len += sizeof(RP_ANSDATAEXH); return(SendMsg(MT_ANSDATAEX,(unsigned int)len,sbuf)); }
static char *PackRead(PackFile *pack, char *name, int *size, FILE *fp) { int i; if (!pack) { EngineError("not open pack file\n"); } for (i = 0; i < pack->num; i++) { struct Data *file = &pack->file[i]; if (!StrCmp(file->name, name)) { char *data; data = (char *)Malloc(sizeof(char) * file->size); fseek(fp, file->ptr, SEEK_SET); fread(data, sizeof(char), file->size, fp); EncodeBuf(data, file->size, 0); *size = file->size; WriteLog("read from pack file %s\n", name); return data; } } EngineError("not find %s\n", name); return NULL; }
int CDRTPHelper::SendRequest(int timeout /*=0*/) { m_errcode = 0; memset(&m_errmsg,0,sizeof m_errmsg); int len = sizeof m_drtpBuf; int retries = 3; BOOL bRet = FALSE; m_currRecord = NULL; m_currIndex = 0; m_currRecordCount = 0; m_timeout = timeout; m_requestPack.head.recCount = m_rec_cnt; m_requestPack.head.retCode = 0; memset(m_drtpBuf,0,sizeof m_drtpBuf); if(!EncodeBuf(&m_requestPack, m_drtpBuf,&len, m_errmsg)) return -3; /* bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&m_tag, 0,-1,0,-1,2); */ bRet = DrtpPostMessage(5,m_drtpNo,m_funcNo,(char*)m_drtpBuf,len,&m_errcode,m_errmsg,m_drtpHandle,0,1); if(bRet == FALSE) { GetErrMsg(); testDrtpHandle(); return -1; } retries = 3; int readLen = 0; bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen, m_drtpHandle,&m_tag,&m_errcode,m_errmsg,m_timeout); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); testDrtpHandle(); return -1; } memset(&m_responsePack,0,sizeof(m_responsePack)); memset(m_dataArray, 0, sizeof(m_dataArray)); // 把接收缓冲区中的内容解码到Pack和DataArray中 len = sizeof m_drtpBuf; int nCount = 0; bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack ,m_dataArray, &nCount, 0); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } // 记录返回结果集数 m_currRecordCount = m_responsePack.head.recCount; return 0; }
//---------------------------------------------------------------------------- // // Function: OutputRealData // // Synopsis: 将硬件数据流转换为接口数据并发给金仕达传输层 // // Arguments: nType -- 数据类型 // ucRawData -- 收上的数据 // nDataLen -- 收上的数据长度 // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall OutputRealData(TSSmartTask *pTask, TSSmartDoc *pDoc, int nType, unsigned char *ucRawData, int nDataLen) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); long iResult = RET_OK; ST_CPACK rpack; switch(nType) { case 0x01: //收费机 iResult = theApp.ConvertDealData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); TestData.AddSFCount(1); break; case 0x21: //收费机(历史) iResult = theApp.ConvertDealData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); rpack.head.RequestType = 930098; //应答码 break; case 0x02: //计时宝 iResult = theApp.ConvertIdentifyData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); rpack.head.RequestType = 930101; break; case 0x22: //计时宝(历史) iResult = theApp.ConvertIdentifyData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); break; case 0x03: //扎帐 case 0x23: //扎帐(历史) iResult = theApp.ConvertStateData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); TestData.AddJZCount(1); break; case 0x04: //补助 iResult = theApp.ConvertAssisData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); TestData.AddBZCount(1); break; case 0x24: //补助(历史) iResult = theApp.ConvertAssisData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); rpack.head.RequestType = 930098; //应答码 break; case 0x05: //挂失 break; case 0x06: //增值机 iResult = theApp.ConvertDealData1(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); TestData.AddCZCount(1); break; case 0x26: //增值机(历史) iResult = theApp.ConvertDealData1(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); rpack.head.RequestType = 930098; //应答码 break; case 0x07: //增值机管理费 case 0x27: //增值机管理费(历史) iResult = theApp.ConvertDealData2(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); TestData.AddCZCount(1); break; case 0x08: //终端无反应 case 0x09: //无对应序号的数 iResult = theApp.ConvertError(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); break; case 0x81: //挂失 case 0x82: //解挂 case 0x83: //修改密码 iResult = theApp.ConvertGSJData(nType, pTask, pDoc, &rpack, ucRawData, nDataLen); break; default: printf("未知的数据类型!.............\n"); break; } //经过很运行,发现系统经常被送上来异常数据,都是无效数据, if( iResult == RET_DATACRC_ERROR ) { return RET_OK; } if( iResult != RET_OK ) { WriteLog("将硬件数据流转换为接口数据并发给金仕达传输层....失败!.......\n"); return RET_SYSERROR; } if( !pDoc->m_nStartuse && strcmp(pDoc->m_szMacType, "5301") && ( nType == 0x01 || nType == 0x02 || nType == 0x03 || nType == 0x04 || nType == 0x06 ) ) { //theApp.SignIn(pDoc); //pDoc->m_nStartuse = 1 ; } char buffer[8192]; int nLen = sizeof(buffer); char omsg[256]; HANDLE& hHandle = ConnectPool.Alloc(); //hNewHandle; DWORD nTick1 = GetTickCount(); memset(buffer, 0x00, sizeof buffer ); if( EncodeBuf(&rpack, (unsigned char*)buffer, &nLen, omsg) ) { if( SendData(hHandle, iServerNo, iFunc, (char*)buffer, nLen, 1, FALSE) == RET_OK ) { nLen = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); int nlen = RecvData(hHandle, buffer, nLen, 10000); if( nlen > 0 ) { ST_CPACK apack; memset(&apack, 0, sizeof(apack)); if( DecodeBuf((unsigned char*)buffer,nlen,&apack,omsg) ) { //if(apack.head.RequestType == 930057) printf("apack.head.retCode=%d\n",apack.head.retCode); printf("发送RequestType = %d 接收RequestType=%d",rpack.head.RequestType,apack.head.RequestType); //if( !apack.head.retCode && apack.head.RequestType == rpack.head.RequestType ) if(!apack.head.retCode) { ConnectPool.Free(hHandle); WriteLog("功能号=%d, 保存数据到金仕达成功!消息=%s 耗费时间(毫秒)%d...\n", apack.head.RequestType,apack.pack.vsmess, GetTickCount()-nTick1 ); return RET_OK; } else { WriteLog("保存数据到金仕达失败! 金仕达返回错误:功能号=%d, 返回码=%d, 消息=%s! 耗费时间(毫秒)%d...\n", apack.head.RequestType, apack.head.retCode, apack.pack.vsmess, GetTickCount() - nTick1 ); } } } } } ConnectPool.Free(hHandle); return RET_SYSERROR; }
//---------------------------------------------------------------------------- // // Function: ReadSmartDocList // // Synopsis: 读入设备档案表 // // Arguments: pSmartDoc -- 设备档案表 // nRecCount -- 记录数 // // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall ReadSmartDocList(TSSmartDoc *pSmartDoc, long *nRecCount) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ST_CPACK rpack; ST_CPACK apack; ST_PACK apackarray[60]; char buffer[20960]; WriteLog("三九前置向金仕达调用功能号%d, 申请获取全部设备档案表\n", 930037); long k = 0 ; bool bEnd = false; int nlen = 0 ; int nRow = 0 ; int nfirst = 1 ; int nLen = sizeof(buffer); char omsg[256]; ST_PACK *pPacket = NULL; HANDLE& hHandle = ConnectPool.Alloc(); #if __DEBUG_INTERFACE__ //#if 0 while( !bEnd ) { if( k >= MAX_SMART_DOC ) { ConnectPool.Free(hHandle); WriteLog("设备档案数量大于%d, 请检查设备档案参数表!!!!\n", MAX_SMART_DOC); break; } memset(&rpack, 0, sizeof(rpack)); rpack.head.RequestType = 930037; rpack.head.recCount = 1; /* 本包的记录数*/ rpack.head.retCode = 0; /* 返回代码*/ rpack.head.userdata = 0; if( nfirst ) { rpack.head.firstflag = 1; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 0; /* 是否后续包请求*/ nfirst = 0 ; } else { rpack.head.firstflag = 0; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 1; /* 是否后续包请求*/ memcpy(&rpack.head.hook,&apack.head.hook,sizeof(rpack.head.hook)); rpack.head.hook.queuetype=apack.head.hook.queuetype; } SetValue(&rpack.head,&rpack.pack, F_SDATE1, "00000000"); SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey)); //前置机注册号 SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey); //动态密钥 nLen = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); if( !EncodeBuf(&rpack, (unsigned char*)buffer, &nLen, omsg) ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行EncodeBuf失败\n"); return RET_SYSERROR; } printf("执行功能号930037读入设备档案表\n"); if( SendData(hHandle, iServerNo, iFunc, (char*)buffer, nLen, 1, FALSE) != RET_OK ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行SendData失败\n"); return RET_SYSERROR; } memset(buffer, 0, sizeof(buffer)); nLen = sizeof(buffer); nlen = RecvData(hHandle, buffer, nLen, 10000); if( nlen <= 0 ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行RecvData失败\n"); return RET_SYSERROR; } BOOL bRet=DecodeBufWithArray((unsigned char*)buffer,nlen,&apack,apackarray,&nRow,omsg); if( !bRet || apack.head.retCode ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行DecodeBufWithArray,返回无数据,失败!\n"); return RET_SYSERROR; } WriteLog("执行功能号930037读入设备档案表时,得到设备数量为:%d,设备参数为:\n",nRow); for(int i=0; i< nRow; i++) { if( i == 0 ) pPacket = &apack.pack; else pPacket = &apackarray[i-1]; strcpy(pSmartDoc[k].m_szMacCode, pPacket->semp); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, pPacket->sholder_type);//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, pPacket->semp); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, pPacket->semp); //机型名称 strcpy(pSmartDoc[k].m_szDeviceID, pPacket->sdate1); //设备ID strcpy(pSmartDoc[k].m_szRegister, pPacket->sdate2); //注册号 pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=pPacket->lvol4; //机号 strcpy(pSmartDoc[k].m_szVersion, pPacket->sdate3); //设备版本号 strcpy(pSmartDoc[k].m_szPassword, "000000"); //系统员密码 strcpy(pSmartDoc[k].m_szOprPasswd, "000000"); //管理员密码 pSmartDoc[k].m_nPwdswitch=-1; //密码开关 strcpy(pSmartDoc[k].m_sClockVer, pPacket->stime0); //父设备 strcpy(pSmartDoc[k].m_szOrgid, "001"); //所属的组织代码 pSmartDoc[k].m_nPortCount=pPacket->lvol5; //服务器端口总数 pSmartDoc[k].m_nSMTPort=pPacket->lvol6; //服务器端口号 strcpy(pSmartDoc[k].m_szPort, pPacket->sbank_code); //通讯端口 pSmartDoc[k].m_nBaudRate=pPacket->lvol9; //波特率 pSmartDoc[k].m_nCommMode=pPacket->lvol8; //链路模式 strcpy(pSmartDoc[k].m_szAddr, pPacket->sstation0); //通讯地址 pSmartDoc[k].m_nStatus=pPacket->lvol7; //设备状态, 下面定义为: pSmartDoc[k].m_nConnType = pPacket->lvol10; //通讯方式 strcpy(pSmartDoc[k].m_szClass, pPacket->snote2); //卡类 // pSmartDoc[k].m_wFlowNo=pPacket->lvol11+1; //期望流水号 modified pSmartDoc[k].m_wLastInvoiceNo=pPacket->lvol11; //终端交易流水号期末值 pSmartDoc[k].m_wStateNo=pPacket->lvol12; pSmartDoc[k].m_nFlow=1; //序号 pSmartDoc[k].m_nBeginInvoice=0; //扎帐的开始流水 pSmartDoc[k].m_wSettleinvoice=0; //扎帐流水号期末值 pSmartDoc[k].m_wEndInvoice=0; //扎帐的结束流水号 strcpy(pSmartDoc[k].m_sBlackExpire, pPacket->sserial0); //黑名单的有效期 strcpy(pSmartDoc[k].m_sDownBlackTime, pPacket->sserial1); //黑名单下传时间期末值 pSmartDoc[k].m_nStartuse=0; //签到结果 pSmartDoc[k].m_nCardID = 12; pSmartDoc[k].m_nDealCount = 10; pSmartDoc[k].m_nInMoney = 100000; pSmartDoc[k].m_nOutMoney = pSmartDoc[k].m_nInMoney; pSmartDoc[k].m_nBeginInvoice = 0 ; pSmartDoc[k].m_wFlowNo = 0 ; pSmartDoc[k].m_wStateNo = 0 ; WriteLog("终端机型号代码=%s,可用IC卡卡型=%s, 终端机型号=%s, 机型名称=%s\n " "设备ID=%s, 注册号=%s, 机号=%d, 设备版本号=%s, 系统员密码=%s, 管理员密码=%s\n" "密码开关=%d, 服务器端口总数=%d, 服务器端口号=%d, 通讯端口=%s, 波特率=%d\n" "链路模式=%d,通讯地址=%s, 设备状态=%d, 交易流水号期末值=%d, 黑名单的有效期=%s, 黑名单版本=%s, 通讯方式=%d,卡类=%s, 父设备:%s\n", pPacket->semp, pPacket->sholder_type, pPacket->semp, pPacket->semp, pPacket->sdate1, pPacket->sdate2, pPacket->lvol4, pPacket->sdate3, "000000", "000000", pSmartDoc[k].m_nPwdswitch, pPacket->lvol5, pPacket->lvol6, pPacket->sbank_code, pPacket->lvol9, pPacket->lvol8, pPacket->sstation0, pPacket->lvol7, pPacket->lvol11, pPacket->sserial0, pPacket->sserial1, pPacket->lvol10, pPacket->snote2, pPacket->stime0); if( !theApp.CheckSmartDocValid(&pSmartDoc[k]) ) { WriteLog("无效设备!!!\n"); ZeroMemory(&pSmartDoc[k], sizeof(TSSmartDoc)); } else { WriteLog("有效设备!ID号=%s, 注册号=%s, 机号=%d, 网络类型:%d..父设备代码=%s\n", pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer); k++; } } if( apack.head.nextflag == 0 ) bEnd = true ; } #else k = 0 ; /***********************************************************************************************************************************************************/ // 以下为加入调试信息 /***********************************************************************************************************************************************************/ int iTick = 0 ; char sTempNo[32]; char sIP[32]; char szParent[32] = "" ; int iMacNo = 1; int nPort = 10001; strcpy(sIP, "10.83.28.40"); for(int j=k; j<2; j++) { sprintf(sTempNo, "0000%04d", j+100); //模拟LPort if( iTick == 0 || iTick == 15 ) { strcpy(pSmartDoc[k].m_szMacCode, "5301"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacModle, "5301"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "5301"); //机型名称 strcpy(pSmartDoc[k].m_szDeviceID, "0000918F"); //设备ID strcpy(pSmartDoc[k].m_szRegister, "0000918F"); //注册号 pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=1; //机号 strcpy(pSmartDoc[k].m_szAddr, sIP); //通讯地址 pSmartDoc[k].m_nPortCount=16; //服务器端口总数 sprintf(pSmartDoc[k].m_szPort, "%d", nPort); //nPort++); //通讯端口 strcpy(pSmartDoc[k].m_sClockVer, ""); //父设备 iMacNo=1; strcpy(szParent, pSmartDoc[k].m_szDeviceID); pSmartDoc[k].m_nSMTPort=0; //服务器端口号 } else { //if( iTick == 0 || iTick == 6 || iTick == 8 || iTick == 10 ) //{ strcpy(pSmartDoc[k].m_szMacCode, "0226"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, "0226"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "0226"); //机型名称 //} /*else { strcpy(pSmartDoc[k].m_szMacCode, "0201"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, "0201"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "0201"); //机型名称 }*/ strcpy(pSmartDoc[k].m_szDeviceID, "00008B1a"); //设备ID strcpy(pSmartDoc[k].m_szRegister, "00008B1a"); //注册号 pSmartDoc[k].m_nAuthID=0x00008B1a;//ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=1;//++iMacNo; //机号 pSmartDoc[k].m_nPortCount=16; //服务器端口总数 strcpy(pSmartDoc[k].m_szAddr, sIP); //通讯地址 strcpy(pSmartDoc[k].m_sClockVer, szParent); //父设备 pSmartDoc[k].m_nSMTPort=2; //iMacNo; //服务器端口号 } if( iTick >= 15 ) iTick = 0 ; else iTick++; strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szVersion, ""); //设备版本号 strcpy(pSmartDoc[k].m_szPassword, "000000"); //系统员密码 strcpy(pSmartDoc[k].m_szOprPasswd, "000000"); //管理员密码 pSmartDoc[k].m_nPwdswitch=-1; //密码开关 strcpy(pSmartDoc[k].m_szOrgid, "001"); //所属的组织代码 pSmartDoc[k].m_nBaudRate=19200; //波特率 pSmartDoc[k].m_nCommMode=3; //链路模式 pSmartDoc[k].m_nStatus=0; //设备状态, 下面定义为: pSmartDoc[k].m_nConnType = 1; //通讯方式 strcpy(pSmartDoc[k].m_szClass, "FFFFFFFFFF"); //卡类 // pSmartDoc[k].m_wFlowNo=0; //期望流水号 modified pSmartDoc[k].m_wLastInvoiceNo=0; //终端交易流水号期末值 pSmartDoc[k].m_wStateNo=0; pSmartDoc[k].m_nFlow=1; //序号 pSmartDoc[k].m_nBeginInvoice=0; //扎帐的开始流水 pSmartDoc[k].m_wSettleinvoice=0; //扎帐流水号期末值 pSmartDoc[k].m_wEndInvoice=0; //扎帐的结束流水号 strcpy(pSmartDoc[k].m_sBlackExpire, "991231010101"); //黑名单的有效期 strcpy(pSmartDoc[k].m_sDownBlackTime, "991231010101"); //黑名单下传时间期末值 pSmartDoc[k].m_nStartuse=0; //签到结果 printf("有设备(ID=%s, 注册号:%s, 机号=%d, 网络类型:%d..父设备:%s...\n", pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer); k++; } #endif gnDocCount = k; gpSmartDoc = new TSSmartDoc[gnDocCount]; if( gpSmartDoc == NULL ) { printf("内存不足.....\n"); gnDocCount = 0 ; ConnectPool.Free(hHandle); return RET_SYSERROR; } long iCount = 0 ; memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); memset(pSmartDoc, 0, sizeof(TSSmartDoc)*k); for(int i=0; i< k; i++) { if( theApp.CheckSmartDocValid(gpSmartDoc, k, i) ) { memcpy(&pSmartDoc[iCount++], &gpSmartDoc[i], sizeof(TSSmartDoc)); } } memset(gpSmartDoc, 0, sizeof(TSSmartDoc)*k); gnDocCount = 0 ; k = iCount; ConnectPool.Free(hHandle); WriteLog("有效设备总数量:%d...........\n", k); *nRecCount = k; long nKCount = 0 ; for(i=0; i<k; i++) { if( strcmp(pSmartDoc[i].m_sClockVer, "") ) { for(int j=0; j<k; j++) { if( !strcmp(pSmartDoc[j].m_szDeviceID, pSmartDoc[i].m_sClockVer) && i != j ) { pSmartDoc[i].m_nParentID = pSmartDoc[j].m_nAuthID ; pSmartDoc[i].m_nLevel = 1; pSmartDoc[i].m_szLevelArray[0] = (char)pSmartDoc[j].m_nMachineNo; pSmartDoc[i].m_szLevelArray[1] = (char)pSmartDoc[i].m_nSMTPort; printf("父设备%s\n",pSmartDoc[j].m_szDeviceID); printf("------pSmartDoc[i].m_szDeviceID = %s \n",pSmartDoc[i].m_szDeviceID); printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[j].m_nMachineNo); printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[i].m_nSMTPort); break; } } } else { pSmartDoc[i].m_nLevel=0; } } gnDocCount = k; memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); return RET_OK; }
//---------------------------------------------------------------------------- // // Function: SendDeviceTick // // Synopsis: 发设备心跳 // // Arguments: none // // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall SendDeviceTick(TSSmartDoc *pDoc) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); //WriteLog("设备:%s,时钟:%s::版本%s",pDoc->m_szDeviceID,pDoc->m_sDownBlackTime,pDoc->m_szTableName); pDoc->m_dwDBTick = GetTickCount(); ST_CPACK rpack; unsigned char szBuffer[8192]; int nLen = sizeof(szBuffer); memset(&rpack, 0, sizeof(rpack)); memset(szBuffer, 0, sizeof(szBuffer)); rpack.head.RequestType = 930057; rpack.head.firstflag = 1; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 0; /* 是否后续包请求*/ rpack.head.recCount = 1; /* 本包的记录数*/ rpack.head.retCode = 0; /* 返回代码*/ rpack.head.userdata = 0; char szDateTime[24]; SYSTEMTIME SysTime; CSystemInfo info; memset(szDateTime,0x00,sizeof szDateTime); GetLocalTime(&SysTime); sprintf(szDateTime, "%04d%02d%02d%02d%02d%02d", SysTime.wYear, SysTime.wMonth, SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond); SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey)); //前置注册ID SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey); SetValue(&rpack.head,&rpack.pack, F_SDATE1, pDoc->m_szDeviceID); //设备ID SetValue(&rpack.head,&rpack.pack, F_SPHONE3, szDateTime); //心跳时间 SetValue(&rpack.head,&rpack.pack, F_DAMT0, GetValue(info.nDiskFreeSpace/info.nDiskTotalSpace*100) );//硬盘利用百分比 SetValue(&rpack.head,&rpack.pack, F_DAMT1, GetValue(info.nUserMemory/info.nMemoryTotal*100)); //内存利用百分比 SetValue(&rpack.head,&rpack.pack, F_DAMT2, GetValue(100-info.nCPU));//CPU利用百分比 SetValue(&rpack.head,&rpack.pack, F_LVOL2, GetValue(pDoc->m_nStatus)); //设备状态 SetValue(&rpack.head,&rpack.pack, F_SSERIAL4, pDoc->m_szTableName); //黑名单版本 SetValue(&rpack.head,&rpack.pack, F_SHOLDER_AC_NO2, pDoc->m_sDownBlackTime);//设备当前时间 SetValue(&rpack.head,&rpack.pack, F_DAMT3, GetValue(1)); //1未上传流水数量 WriteLog("设备:%s,时钟:%s::版本%s::终端状态:%ld\n",pDoc->m_szDeviceID,pDoc->m_sDownBlackTime,pDoc->m_szTableName,pDoc->m_nStatus); HANDLE& hHandle = ConnectPool.Alloc(); if (hHandle== NULL) return RET_OK; char omsg[256]; if( EncodeBuf(&rpack, szBuffer, &nLen, omsg) ) { WriteLog("-----发送设备监控心跳包ID[ %s ]---------------\n",pDoc->m_szDeviceID); if( SendData(hHandle, iServerNo, iFunc, (char*)szBuffer, nLen, 1, FALSE) == RET_OK ) { nLen = sizeof(szBuffer); memset(szBuffer, 0, sizeof(szBuffer)); int nlen = RecvData(hHandle, (char*)szBuffer, nLen, 10000); if( nlen > 0 ) { ST_CPACK apack; memset(&apack, 0, sizeof(apack)); if( DecodeBuf((unsigned char*)szBuffer,nlen,&apack,omsg) ) { if( !apack.head.retCode ) { ConnectPool.Free(hHandle); WriteTickLog("发送设备监控心跳包成功! 服务号:%d, 子功能号:%d, , 设备ID=%s", iServerNo, iFunc, pDoc->m_szDeviceID); return RET_OK; } else { WriteTickLog("发送设备监控心跳包失败! 设备ID=%s, 发送设备监控心跳包时返回:%s\n", pDoc->m_szDeviceID, apack.pack.vsmess); } } else printf("DecodeBuf error"); } else printf("debug 接收数据失败\n"); } } ConnectPool.Free(hHandle); WriteLog("发送设备监控心跳包失败! 服务号:%d, 子功能号:%d, 设备ID=%s", iServerNo, iFunc, pDoc->m_szDeviceID); return RET_OK; }
int CDRTPHelper::SendRequest(int timeout /*=0*/) { m_errcode = 0; memset(&m_errmsg,0,sizeof m_errmsg); int len = sizeof m_drtpBuf; int retries = 3; BOOL bRet = FALSE; m_currRecord = NULL; m_currIndex = 0; m_currRecordCount = 0; m_timeout = timeout; m_requestPack.head.recCount = m_rec_cnt; TAG_DRTPHANDLE tag; memset(&tag,0,sizeof(tag)); memset(m_drtpBuf,0,sizeof m_drtpBuf); if(!DrtpAttachServer(m_drtpNo,m_funcNo,m_drtpHandle,&tag,&m_errcode,m_errmsg)) { try { testDrtpHandle(); return -1; } catch (DrtpConnectException&) { return -2; } } EncodeBuf(&m_requestPack, m_drtpBuf,&len, NULL); bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&tag, 0,-1,0,-1,2); if(bRet == FALSE) { GetErrMsg(); testDrtpHandle(); return -1; } retries = 3; int readLen = 0; bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen, m_drtpHandle,&tag,&m_errcode,m_errmsg,m_timeout); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } memset(&m_responsePack,0,sizeof(m_responsePack)); memset(m_dataArray, 0, sizeof(m_dataArray)); // 把接收缓冲区中的内容解码到Pack和DataArray中 len = sizeof m_drtpBuf; int nCount = 0; bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack ,m_dataArray, &nCount, 0); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } // 记录返回结果集数 m_currRecordCount = m_responsePack.head.recCount; return 0; }