//*================================================================================= //*原型: long OnLogin(....) //*功能: 监控器登录 //*参数: 略 //*返回: 见返回值表 //*说明: 无 //*================================================================================= long TSmartOutThread::OnLogin(SOCKET hClient, SOCKADDR_IN *psockAddr, TSmartPacket *pPacket, TSmartServer* pServer, TSmartOutThread *pThread) { char szUser[64]; char szPass[32]; int nPort; memset(szUser, 0, sizeof(szUser)); memset(szPass, 0, sizeof(szPass)); if( !pPacket->GetItem(0, nPort) || !pPacket->GetItem(1, szUser) ) return RET_NG; if( pPacket->GetItemCount() > 2 ) pPacket->GetItem(2, szPass); TSOUTUser *pUser = new TSOUTUser; pUser->nPort = nPort; pUser->dwLastTick = GetTickCount(); pUser->nSID = TSmartOutThread::GetKey(); time(&pUser->tmCreate); memcpy(&pUser->sockAddr, psockAddr, sizeof(SOCKADDR_IN)); pUser->sockAddr.sin_family = AF_INET ; pUser->sockAddr.sin_port = htons(nPort); strcpy(pUser->szHost, ""); strcpy(pUser->szMD5, TSmartOutThread::GetMD5()); strcpy(pUser->szHost, inet_ntoa(psockAddr->sin_addr)); TSmartPacket Packet; Packet.Create(PACKET_CMD_LOGIN, pUser->nSID); Packet.SetResult(RET_OK); Packet.AddItem(pUser->nSID); Packet.AddItem(pUser->szMD5,strlen(pUser->szMD5)); Packet.AddEnd(); char *pBuffer = Packet.GetBuffer(); long nLength = Packet.GetLength(); ReportLog("发送包, 长度%d: <%s>\n", nLength, pBuffer); if( pThread->SendBuffer(hClient, pBuffer, nLength, 1000) != nLength ) { delete pUser; ReportLog("发送登录回应包错!"); return RET_SYSERROR; } else { pThread->AddUser(pUser); pServer->SendInitData(pThread->m_hNotifySocket, &pUser->sockAddr); } return RET_OK; }
//处理服务器状态 // 返回false 代表不需要进一步处理 // 返回true 代表需要进一步处理 bool CCollectionData::LportState(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer,unsigned char *ucRawData) { CString strText = ""; int nTotalNo; bool bFlag1,bFlag2; bFlag1 = false; bFlag2 = false; nTotalNo = ucRawData[2]; //服务器有数据 if( ucRawData[1] != 0x0a ) bFlag1 = true; for(int i=0;i<nTotalNo; i++ ) { switch(ucRawData[3+i]) { case 0x0a://端口无数据 break; case 0x0b://终端注册号不符合 strText.Format("端口%d注册号不符合", i+1); printf("!!!!设备%s,端口号%d注册号不符\n",pDocEx->pChildDoc[0]->m_szDeviceID, i+1); bFlag2 = false; break; case 0x0c://终端设备无响应 break; case 0x0d://申请签到 { printf("-----设备%sPort=%d申请签到\n", pDocEx->pChildDoc[0]->m_szDeviceID, i+1); strText.Format("端口%d申请签到!", i+1); ReportLog(pDocEx->pChildDoc[0], pTask, RET_OK, "实时收数", strText.GetBuffer(0)); CSingInServer SingIn; SingIn.SignInProcess(pDocEx, pBuffer, i+1, pTask); bFlag2 = true; } break; case 0x0e://黑名单有效期过期 printf("!!!!黑名单有效期过期\n"); break; case 0xFF://未接终端 break; default://其他状态不考虑 strText.Format("端口%d状态未定义!", i+1); ReportLog(pDocEx->pChildDoc[0], pTask, RET_SYSERROR, "实时收数", strText.GetBuffer(0)); break; } } if(bFlag2 == true) return false; return bFlag1; }
void CSingInServer::OnPacketError(long nResult) { unsigned char BlackVersion[6]; unsigned char Hex[64]; memset(Hex, 0, sizeof(Hex)); memset(BlackVersion,0x00,sizeof BlackVersion); SVC_DSP_2_HEX((BYTE*)m_strBlackVer.GetBuffer(0), Hex, 6); for(int i=0; i<3; i++) { MakeBuf_GetBlackVersion(&m_pDocEx->pChildDoc[m_nIndex]->DeviceInfo, m_pBuffer); if(SendRequest(m_pDocEx->pChildDoc[m_nIndex], m_pBuffer) == RET_OK ) { if(UnMakeDeviceBuffer(m_pBuffer) == RET_OK) { memcpy(BlackVersion, m_pBuffer->pBuffer+4,6); if( !memcmp(Hex, BlackVersion, 6) ) { break; } else { ReportLog(m_pDoc, m_pTask, RET_SYSERROR, "终端机签到", "签到时黑名单版本不一致!"); break; } } } } }
long CUploadClock::ProcessData(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { TSResultData data; ZeroMemory(&data, sizeof(data)); long nResult = UnMakeDeviceBuffer(pBuffer); if( nResult == RET_OK ) { int nMark = pBuffer->pBuffer[2]; if( nMark != 0x00 ) nResult = nMark; } if( nResult == RET_OK ) { unsigned char *ucData = &pBuffer->pBuffer[4]; sprintf(data.sValue1, "%02d%02d%02d%02d%02d%02d", ucData[0], ucData[1], ucData[2], ucData[3], ucData[4], ucData[5]); } ReportLog(pDocEx, pTask, nResult, "»Ö¸´Õý³£ÔËÐÐ״̬", ""); GetResultMessage(nResult, data.sMsg); ReportTaskResult(pTask, nResult, &data); return nResult; }
//*================================================================================= //*原型: void TSmartOutThread::Broadcast(void *pData) //*功能: 分发数据 //*参数: pData -- 要分发的数据 //*返回: 无 //*说明: 利用UDP分发 //*================================================================================= void TSmartOutThread::BroadcastEx(char *pszCmd, TSSmartDoc *pDoc, void *pData, long nSize) { #ifdef __BROADCAST_OUT__ TSmartPacket Packet; long nLength; char *pBuffer; Packet.Create(pszCmd, SERVER_SID); Packet.SetResult(RET_OK); Packet.AddItem((char*)pData, nSize); Packet.AddEnd(); pBuffer = Packet.GetBuffer(); nLength = Packet.GetLength(); if( !strcmp(PACKET_CMD_1003, pszCmd) ) ReportLog("广播:<%d> [%s]\n", nLength, pBuffer); for(int i=0; i< m_ClientList.GetCount(); i++) { TSOUTUser *pUser = (TSOUTUser*)m_ClientList[i]; if( pUser != NULL ) { sendto(m_hNotifySocket, pBuffer, nLength, 0, (SOCKADDR*)&pUser->sockAddr, sizeof(pUser->sockAddr)); pUser->dwLastTick = GetTickCount(); } } #endif }
//确认数据数据流程 bool CCollectionData::ConfirmData(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer, unsigned char *ucFlowNo,int nPortNo,int nRetryNo) { DWORD dwTick = GetTickCount(); for(int i=0; i<nRetryNo; i++) { MakeBuf_ConfirmData(&pDocEx->pChildDoc[nPortNo]->DeviceInfo, pBuffer, ucFlowNo); if( SendRequest(pDocEx->pChildDoc[nPortNo], pBuffer) == RET_OK ) { if( UnMakeDeviceBuffer(pBuffer) == RET_OK ) { //if(pBuffer->pBuffer[1] == pDocEx->pChildDoc[nPortNo]->m_nMachineNo) { //做标记成功,退出 if(pBuffer->pBuffer[2]==0x00) { //接收成功统计 InterlockedExchangeAdd((LONG*)&gMark, (LONG)(GetTickCount()-dwTick)); InterlockedIncrement((LONG*)&gTryMark); return true; } } } else { printf("做交易数据标志不成功!\n"); } } Sleep(300); } ReportLog(pDocEx->pChildDoc[nPortNo], pTask, RET_SYSERROR, "实时收数", "做标记失败!"); return false; }
long CDownloadJZTime::ProcessData(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { int nMark = pBuffer->pBuffer[2]; if( nMark != 0X00 ) { CString strText; strText.Format("下传定时扎帐时间%s失败!", pTask->szMemo); ReportLog(pDocEx, pTask, nMark, "下传定时扎帐时间", strText.GetBuffer(0)); return nMark; } else { ReportLog(pDocEx, pTask, RET_OK, "下传定时扎帐时间", "下传定时扎帐时间成功"); return RET_OK; } }
//机号错误 void COperator::OnMachineNoError(TSSmartDoc *pDoc, int nNo) { ReportLog(pDoc, m_pTask, RET_SYSERROR, "实时收集", "返回机号不对!"); CString sSQL; sSQL.Format("UPDATE smart_machine SET smt_machineno=%d WHERE smt_authno=%ld", nNo, pDoc->m_nAuthID); return ; }
//*======================================================================================== //*函数: bool CSmartJZSRCTable::SvaeToDB(CString strSQL) //*功能: 保存到数据库 //*参数: 略 //*返回: 成功与否 //*说明: 虚基类程序 //*======================================================================================== bool CSmartJZSRCTable::SaveToDB(CString strSQL1, CString strSQL2) { long nDatabase = GetDBHandle(DATABASE_NORMAL); if( nDatabase <= 0 ) { ReportLog(RET_DBBUSY, "保存扎帐数据", "不能得到数据库句柄!"); return false; } // printf("%s\n", strSQL1.GetBuffer(0)); long nRec = ExecuteSQL(nDatabase, strSQL1.GetBuffer(0)); if( nRec != RET_OK ) { printf("%s\n", strSQL1.GetBuffer(0)); CString strText; strText = "create table " + m_strTableName ; strText += "(smt_rowid integer not null primary key,smt_authno number(10,0) not null,"; strText += "smt_data varchar(100) not null,smt_CRC number(2) , smt_datetime date ,"; strText += "smt_dealwith number(2),smt_dealwithdatetime date,smt_adjustcode varchar(4)) "; ExecuteSQL(nDatabase, strText.GetBuffer(0)); strText = "create sequence " + m_strTableName + "_rowid start with 1 increment by 1"; ExecuteSQL(nDatabase, strText.GetBuffer(0)); if( ExecuteSQL(nDatabase, strSQL1.GetBuffer(0)) != RET_OK ) { FreeDBHandle(nDatabase); return false; } } // printf("%s\n", strSQL2.GetBuffer(0)); nRec = ExecuteSQL(nDatabase, strSQL2.GetBuffer(0)); if( nRec != RET_OK ) { printf("%s\n", strSQL2.GetBuffer(0)); FreeDBHandle(nDatabase); return false; } if( m_bUpdate ) { nRec = ExecuteSQL(nDatabase, strUpdate.GetBuffer(0)); if( nRec != RET_OK ) { printf("%s\n", strUpdate.GetBuffer(0)); FreeDBHandle(nDatabase); return false; } } FreeDBHandle(nDatabase); return true; }
////生成签到任务 bool CSingInServer::InsertTask(TSSmartDoc *pDoc) { CSmartTask Task; Task.SetTask("终端机签到", "", 0, 1); Task.AddAuthID(pDoc->m_nAuthID, "12"); if( !Task.Write() ) { ReportLog(pDoc, m_pTask, RET_DBEXECERROR, "终端机签到", "新增签到任务失败!"); return false; } else { ReportLog(pDoc, m_pTask, RET_OK, "终端机签到", "新增签到任务成功!"); return true; } }
//新增加一条任务 long CCollectionData::InsertTask(TSSmartDoc *pDoc, long nTry, char *TaskCode) { CSmartTask Task; // Task.SetMemo(nNumber); Task.SetTask("收历史数", "", 0, nTry); Task.AddAuthID(pDoc->m_nAuthID, TaskCode); if( !Task.Write() ) { ReportLog(pDoc, m_pTask, RET_DBQUERYERROR, "实时收数", "新增收历史数任务失败!"); return RET_DBQUERYERROR; } else { printf("\n收数时, 新增收历史数任务成功!..............\n\n"); ReportLog(pDoc, m_pTask, RET_OK, "实时收数", "新增收历史数任务成功!"); TerminateTask(2); return RET_OK; } }
//MARK值错 bool CCollectionData::OnMarkValueError(TSSmartDoc *pDoc, TSSmartTask *pTask, TSCmdBuffer *pBuffer, int nMark) { CString strText; //add by dengjun 针对以太网计时宝20051208 if( pDoc->m_nParentID == 0 && !memcmp(pDoc->m_szMacCode,"0121",4) ) { switch(nMark) { case 0x00: case 0x0A: break; case 0x08: printf("(以太网计时宝,ID=%ld)无此命令/命令使用不当[可能是卡类型设置不正确或模式不正确]\n",pDoc->m_nAuthID); break; case 0x0B: printf("(以太网计时宝,ID=%ld)授权号错\n",pDoc->m_nAuthID); break; case 0x0D: printf("(以太网计时宝,ID=%ld)请先签到\n",pDoc->m_nAuthID); break; case 0x0E: printf("(以太网计时宝,ID=%ld)黑名单版本过期\n",pDoc->m_nAuthID); break; case 0x17: case 0x1B: case 0x79: break; default: printf("实时收集以太网计时宝(ID=%ld)数据时,返回的状态值不对[%ld]!!!!\n",pDoc->m_nAuthID,nMark); break; } return true; } switch(nMark) { case 0x0b: //授权号不对 strText.Format("实时收集时返回mark=注册号不对! 数据为:%s. 正在更改注册号!", pBuffer->pBuffer, pBuffer->pBuffer[3]+7); ReportLog(pDoc, pTask, RET_SYSERROR, "实时收数", strText.GetBuffer(0)); return ModifyRegister(pDoc, pBuffer); break; case 0x05: // break; case 0x0A: break; default: printf("1---实时收集LPORT数据时,返回的状态值不对[%ld]!!!!\n",nMark); ResetDevice(pDoc, pBuffer); break; } return true; }
//MARK值错 bool CHistoryData::OnMarkValueError(TSSmartDoc *pDoc, TSSmartTask *pTask, TSCmdBuffer *pBuffer, int nMark) { CString strString; switch(nMark) { case 0x0b: //授权号不对 strString.Format("历史收集时授权号不对! 数据为:%s", pBuffer->pBuffer[3]+7); ReportLog(pDoc, pTask, nMark, "历史任务", strString.GetBuffer(0)); ModifyRegister(pDoc, pBuffer); break; case 0x05: // strString.Format("历史收集时Mark不对! 流水号错:%s", pBuffer->pBuffer[3]+7); ReportLog(pDoc, pTask, nMark, "历史任务", strString.GetBuffer(0)); TerminateTask(); break; default: ReportLog(pDoc, pTask, nMark, "历史任务", "历史收集时Mark不对!"); printf("3---历史收集时Mark不对!\n"); ResetDevice(pDoc, pBuffer); break; } return true; }
long CDownloadJZTime::CreateBuffer(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { int No; //扎帐时间个数 unsigned char Hex[256]; //对应扎帐时间 长度No*2 时分 unsigned char Tmp[32]; //对应扎帐时间 长度No*2 时分 memset(Hex, 0, sizeof(Hex)); m_strAccTime = "" ; No = m_strAccTime.GetLength(); if( No <= 0 ) { ReadSmartSetup(); No = m_strAccTime.GetLength(); if( No <= 0 ) { ReportLog(pDocEx, pTask, RET_PARAMETER_ERROR1, "下传定时扎帐时间", "数据库中<无定时扎帐时间>的参数.表smart_setup!"); return RET_PARAMETER_ERROR1; } } CString strMid = "" ; int k=0; No = m_strAccTime.GetLength()/4; if( No > 10 ) No = 10 ; for(int i=0; i< m_strAccTime.GetLength()/4 && i<10; i++) { memset(Tmp, 0, 32); ////SVC_DSP_2_HEX((BYTE*)strMid.GetBuffer(0), Tmp, 2); strMid = m_strAccTime.Mid(i*4,2); Hex[k++] = atoi(strMid); strMid = m_strAccTime.Mid(i*4+2,2); Hex[k++] = atoi(strMid); } strncpy(pTask->szMemo, m_strAccTime.GetBuffer(0), 20); return MakeBuf_SetStateTimeTable(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer, No, Hex); }
//*================================================================================= //*原型: BOOL TSmartTask::GetSmartTaskPlan(TSmartTaskObj *pTaskPlan) //*功能: 得到一个任务 //*参数: 略 //*返回: 成功与否 //*说明: 任务处理 //*================================================================================= BOOL TSmartTask::GetSmartTaskPlan(TSmartTaskObj *pTaskPlan) { static long i= 0 ; long nResult; if( !i ) { ReportLog("第一次运行, 读入常驻任务信息!"); nResult = ReadTSRTask(pTaskPlan); } else { nResult = ReadTask(pTaskPlan); } if( i++ > 9999999 ) i = 1 ; return (nResult==RET_OK?TRUE:FALSE); }
//MARK值错 bool CCollectionData::OnMarkValueError(TSSmartDoc *pDoc, TSSmartTask *pTask, TSCmdBuffer *pBuffer, int nMark) { CString strText; switch(nMark) { case 0x0b: //授权号不对 strText.Format("实时收集时返回mark=注册号不对! 数据为:%s. 正在更改注册号!", pBuffer->pBuffer, pBuffer->pBuffer[3]+7); ReportLog(pDoc, pTask, RET_SYSERROR, "实时收数", strText.GetBuffer(0)); return ModifyRegister(pDoc, pBuffer); break; case 0x05: // break; default: printf("1---实时收集LPORT数据时,返回的状态值不对!!!!\n"); ResetDevice(pDoc, pBuffer); break; } return true; }
long CJZHistoryData::CreateBuffer(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { unsigned char buffer[32]; int i = 0 ; Trim(pTask->szMemo); if( !strcmp(pTask->szMemo, "") ) { i = pDocEx->pChildDoc[pDocEx->nPortNo]->m_wStateNo; } else { int iEnd = -2 ; GetNumberRange(pTask->szMemo, i, iEnd); if( i <= -2 || iEnd < 0 ) { CString strText; strText.Format("历史任务非法! MEMO字段为:%s", pTask->szMemo); ReportLog(pDocEx->pChildDoc[pDocEx->nPortNo], pTask, RET_SYSERROR, "历史任务", strText.GetBuffer(0)); return RET_SYSERROR; } } memset(buffer, 0, sizeof(buffer)); buffer[0] = i / 256; buffer[1] = i % 256; MakeBuf_CollectStateDataBySerial(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer, buffer); pBuffer->nTimeOut1 = 1500; pBuffer->nTimeOut2 = 1000; if( pDocEx->pChildDoc[pDocEx->nPortNo]->m_nParentID > 0 ) return RET_ERRORCALL; return RET_OK; }
//*================================================================================= //*原型: bool ReadRequestPacket(TSmartPacket& Packet) //*功能: 接求一个请求包 //*参数: 无 //*返回: 无 //*说明: 无 //*================================================================================= bool TSmartOutThread::ReadRequestPacket(SOCKET hSocket, TSmartPacket& Packet) { //读入包头数据 long nLength = sizeof(TSSmartPacket); long nRecvLen = RecvBuffer(hSocket, Packet.GetBuffer(), nLength, 1000); TSSmartPacket *pPacket = (TSSmartPacket*)Packet.GetBuffer(); if( nRecvLen != nLength ) { // ReportLog("包头长度不对! 读入的数据包不合法!"); return false; } nLength = Packet.GetDataLength() + 1 ; if( nLength > 0 ) { if( RecvBuffer(hSocket, Packet.GetDataBuffer(), nLength, 1000) != nLength ) { // printf("不能接收包内的数据!\n"); DebugPrint("不能接收包内的数据!"); return false; } nRecvLen+=nLength; } ReportLog("读入数据包:[%s]\n", Packet.m_Buffer); if( !Packet.IsValid(nRecvLen) ) { // printf("包头校验错!读入的数据包不合法!\n"); DebugPrint("读入的数据包不合法!"); return false; } return true; }
//*================================================================================= //*原型: void TSmartOutThread::Broadcast(void *pData) //*功能: 分发数据 //*参数: pData -- 要分发的数据 //*返回: 无 //*说明: 利用UDP分发 //*================================================================================= void TSmartOutThread::Broadcast(TSSmartDoc *pDoc, void *pData, long nSize) { for(int i=0; i< m_ClientList.GetCount(); i++) { TSOUTUser *pUser = (TSOUTUser*)m_ClientList[i]; if( pUser != NULL ) { sendto(m_hNotifySocket, (char*)pData, nSize, 0, (SOCKADDR*)&pUser->sockAddr, sizeof(pUser->sockAddr)); pUser->dwLastTick = GetTickCount(); } } #ifdef __BROADCAST_OUT__ TSmartPacket Packet; long nLength; char *pBuffer; Packet.CreateNotify(0, pDoc, pData, nSize); pBuffer = Packet.GetBuffer(); nLength = Packet.GetLength(); ReportLog("广播Data:<%d> [%s]\n", nLength, pBuffer); // m_ClientLock.Lock(); for(int i=0; i< m_ClientList.GetCount(); i++) { TSOUTUser *pUser = (TSOUTUser*)m_ClientList[i]; if( pUser != NULL ) { sendto(m_hNotifySocket, pBuffer, nLength, 0, (SOCKADDR*)&pUser->sockAddr, sizeof(pUser->sockAddr)); pUser->dwLastTick = GetTickCount(); } } // m_ClientLock.Unlock(); #endif }
void COperator::OnPacketError(long nResult) { char szString[128]; sprintf(szString, "CRC错! 错误代码%d", nResult); ReportLog(m_pDocEx->pChildDoc[m_pDocEx->nPortNo], m_pTask, RET_SYSERROR, "实时收集", szString); }
//修改注册号 bool COperator::ModifyRegisterEx(TSSmartDocEx *pDocEx, TSCmdBuffer *pBuffer, int nPort) { bool bRet = false; unsigned char Buffer[256]; switch(GetMachineType(pDocEx->pChildDoc[pDocEx->nPortNo]) ) { case MACHINE_TYPE_5301: { TSDeviceInfo Info; bool bFound = false; unsigned char sPortID[16]; memset(sPortID, 0, sizeof(sPortID)); for( int p=0; p<3; p++) { MakeBuf_SearchPort(&pDocEx->pChildDoc[0]->DeviceInfo, pBuffer, nPort); if( SendRequest(pDocEx->pChildDoc[0], pBuffer) == RET_OK ) { if( UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2] ) { bFound = true; break; } } } if( !bFound ) { printf("搜索端口%d失败! 不能修改端口注册号!\n", nPort); return false; } bFound = false ; for( p =0; p < 3; p++ ) { MakeBuf_GetPortPar(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer, nPort); if( SendRequest(pDocEx->pChildDoc[0], pBuffer) == RET_OK ) { if( UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2] ) { bFound = true; SVC_HEX_2_DSP(&pBuffer->pBuffer[4], sPortID, 4); break; } } } if( !bFound ) { printf("得到端口%d的设备失败! 不能修改端口注册号!\n", nPort); return false; } //匹配原来端口的硬件 int nIndex = GetPos(pDocEx, nPort); if( nIndex <= 0 ) { printf("端口%d有硬件变动! 设备档案表中没有此终端记录! 设备ID:%s\n", nPort, sPortID); /* MakeBuf_ClearPortData(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer, nPort); if( SendRequest(pDocEx->pChildDoc[0], pBuffer) == RET_OK ) { if( UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2] ) { return true; } }*/ return false; } //比较设备ID if( strcmp((char*)sPortID, pDocEx->pChildDoc[nIndex]->m_szDeviceID) ) { printf("端口%d的设备已更换, 查找端口%d上新的相关设备!\n", nPort, nPort); nIndex = GetPosEx(pDocEx, (char*)sPortID); if( nIndex <= 0 ) { printf("端口%d(设备ID:%s) 与终端设备%s的设备ID不同, 不能修改端口注册号!\n", nPort, sPortID, pDocEx->pChildDoc[nIndex]->m_szRegister); return false; } } /* if( pBuffer->pBuffer[8] != pDocEx->pChildDoc[nIndex]->DeviceInfo.nAddr ) { printf("端口%d(机号:%d) 与终端设备%s(机号:%d)的机号不同, 不能修改端口注册号!\n", nPort, pBuffer->pBuffer[8] , pDocEx->pChildDoc[nIndex]->m_szRegister, pDocEx->pChildDoc[nIndex]->DeviceInfo.nAddr); return false; } */ printf("端口:%d, 端口设备ID号:%s ,与终端设备ID相同, 准备修改端口注册号为:%s!\n", nPort, sPortID, pDocEx->pChildDoc[nIndex]->m_szRegister); memcpy(&Info, &pDocEx->pChildDoc[nIndex]->DeviceInfo, sizeof(Info)); //更改Lport服务器该端口注册号 for( int n=0; n<3; n++) { SVC_DSP_2_HEX((unsigned char *)pDocEx->pChildDoc[nIndex]->m_szRegister, Buffer, 4); MakeBuf_SetPortRegNoAndMacNo( pDocEx->pDeviceInfo, pBuffer, nPort, Buffer, pDocEx->pChildDoc[nIndex]->DeviceInfo.nAddr); if ( SendRequest(pDocEx->pChildDoc[0], pBuffer) == RET_OK ) { if( UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2] ) { CString strText; strText.Format("端口%d注册号与实际注册号不符! 修改端口%d注册号成功!", nPort, nPort); ReportLog(pDocEx, NULL, RET_OK, "实时收集", strText.GetBuffer(0)); printf("%s\n", strText.GetBuffer(0)); bRet = true; break; } } } } break; default: break; } return bRet; }
void CCollectionData::OnCRCError() { ReportLog(m_pDocEx, m_pTask, RET_SYSERROR, "实时收数", "实时收集时CRC错!"); ClearPortData(m_pDocEx->pChildDoc[m_pDocEx->nPortNo], m_pBuffer, m_pDocEx->nPortNo); }
long CSingInServer::ProcessSingIn(TSDeviceInfo *pDevInfo, TSSmartDoc *pDoc, TSCmdBuffer *pBuffer) { bool bResult = false; CTime tm; int E_number; unsigned char Clock[7]; unsigned char Plain[256],ID[4]; E_number = 1; //下传时钟 for(int i=0; i<3; i++) { tm=CTime::GetCurrentTime(); Clock[0] = tm.GetYear()-2000; Clock[1] = tm.GetMonth(); Clock[2] = tm.GetDay(); Clock[3] = tm.GetHour(); Clock[4] = tm.GetMinute(); Clock[5] = tm.GetSecond(); Clock[6] = tm.GetDayOfWeek(); MakeBuf_SetClock(pDevInfo, pBuffer, Clock); pBuffer->nTimeOut1 = 300;//1000 ; pBuffer->nTimeOut2 = 1000; if(SendRequest(pDoc, pBuffer) == RET_OK ) { if(UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2]) { bResult = true; break; } } Sleep(200); } if( !bResult ) { printf("终端机签到--校对时钟失败!.\n"); ReportLog(pDoc, m_pTask, RET_CLOCK_ERROR, "终端机签到", "终端机签到--校对时钟失败!"); return RET_CLOCK_ERROR; } char szKeyBuf[256]; memset(Plain, 0, sizeof(Plain)); memset(szKeyBuf, 0, sizeof(szKeyBuf)); GetAuthKey(szKeyBuf); SVC_DSP_2_HEX((unsigned char *)szKeyBuf, Plain, strlen(szKeyBuf)/2); Sleep(200); //设置授权信息 bResult = false; for(i=0; i<3; i++) { SVC_DSP_2_HEX((unsigned char *)pDoc->m_szDeviceID, ID, 4); //modified by lina 20050308 SmartEncrypt(E_number,ID,Plain); MakeBuf_SetWorkingKey(pDevInfo, pBuffer, Plain, E_number); pBuffer->nTimeOut1 = 300 ; pBuffer->nTimeOut2 = 1000; //bResult = true;//debug 20050311 if(SendRequest(pDoc, pBuffer) == RET_OK ) { if(UnMakeDeviceBuffer(pBuffer) == RET_OK && !pBuffer->pBuffer[2] ) { bResult = true; break; } } Sleep(200); } if( !bResult ) { printf("终端机签到--设置授权信息失败!.\n"); ReportLog(pDoc, m_pTask, RET_NOT_AUTH, "终端机签到", "终端机签到--设置授权信息失败!"); return RET_NOT_AUTH; } //设置消费开关 bResult = false; Sleep(200); for(i=0; i<3; i++) { MakeBuf_SetComsumeFlag(pDevInfo, pBuffer, 1); pBuffer->nTimeOut1 = 300;//1000 ; pBuffer->nTimeOut2 = 1000; if( SendRequest(pDoc, pBuffer) == RET_OK ) { //debug 20050311 // ReportLog(pDoc, m_pTask, RET_REQU_SIGNIN, "终端机签到", "RETOK!"); if( UnMakeDeviceBuffer(pBuffer) == RET_OK&& !pBuffer->pBuffer[2] ) { bResult = true; break; } } Sleep(200); } if( !bResult ) { printf("终端机签到失败!\n"); ReportLog(pDoc, m_pTask, RET_REQU_SIGNIN, "终端机签到", "终端机签到--设置消费开关失败!"); return RET_REQU_SIGNIN; } if( SignIn && pDoc->m_nSignIn != 1 ) { SignIn(pDoc); } pDoc->m_nSignIn = 1 ; GetCurDateTime(pDoc->m_szSignInTime); ReportLog(pDoc, m_pTask, RET_OK, "终端机签到", ""); return RET_OK; }
void ReportLog(TSSmartDocEx *pDocEx, TSSmartTask *pTask, long nRet, char *pszTask, char *pszString) { ReportLog(pDocEx->pChildDoc[pDocEx->nPortNo], pTask, nRet, pszTask, pszString); }
long CJZHistoryData::StateDataProcess(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer, unsigned char *ucRawData, int nPort) { CSmartJZSRCTable SRCTable; unsigned char ucFlowNo[2]; int nFlowNo; bool bBool = true; int iBegin=-2, iEnd = -2; GetNumberRange(pTask->szMemo, iBegin, iEnd); //终端无反应时的处理 if( pBuffer == NULL ) { TSSmartDoc *pDoc = pDocEx->pChildDoc[pDocEx->nPortNo]; CString strString; if( OutputRealData(pTask, pDoc, 0x09, (unsigned char*)pDoc->m_szDeviceID, iBegin) != RET_OK ) { ReportLog(pDoc, pTask, RET_TERME_NOANSWER, "历史扎帐任务", "金仕达中间传输层无反应!"); } char szTemp[18]; strString.Format("AuthNo=%d, 收%d的历史扎帐数据时, 终端无反应!!", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID, iBegin); printf("%s\n", strString); if( iBegin == iEnd ) { pDoc->m_nFlowFlag = 0 ; TerminateTask(); } else { if( iBegin == 65535 ) iBegin = 0 ; else iBegin++; sprintf(szTemp, "%d:%d", iBegin, iEnd); strcpy(pTask->szMemo, szTemp); } ReportLog(pDoc, pTask, RET_TERME_NOANSWER, "历史扎帐任务", "终端无反应或网络异常!"); return RET_OK; } memcpy(ucRawData,&pBuffer->pBuffer[4],pBuffer->pBuffer[3]); //没有数据 if( pBuffer->pBuffer[3] == 0x00 ) { TSSmartDoc *pDoc = pDocEx->pChildDoc[pDocEx->nPortNo]; CString strString; if( OutputRealData(pTask, pDoc, 0x08, (unsigned char*)pDoc->m_szDeviceID, iBegin) != RET_OK ) { ReportLog(pDoc, pTask, RET_TERME_NOANSWER, "历史扎帐任务", "金仕达中间传输层无反应!"); } strString.Format("AuthNo=%d, 无对应的序号为%d的历史扎帐数据!!", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID, iBegin); printf("%s\n", strString); if( iBegin == iEnd ) { pDoc->m_nFlowFlag = 0 ; TerminateTask(); } else { if( iBegin == 65535 ) iBegin = 0 ; else iBegin++; char szTemp[18]; sprintf(szTemp, "%d:%d", iBegin, iEnd); strcpy(pTask->szMemo, szTemp); } ReportLog(pDoc, pTask, RET_OK, "历史扎帐任务", ""); return RET_OK; } //CRC检测 if( !CRCValid(ucRawData, 36) ) { ReportLog(pDocEx, pTask, RET_DBQUERYERROR, "历史扎帐任务", "CRC校验错!"); } ucFlowNo[0] = ucRawData[8]; ucFlowNo[1] = ucRawData[9]; nFlowNo = ucRawData[6]*256+ucRawData[7]; //数据上传的流水与期望流水号相等 if( nFlowNo == iBegin ) { if( OutputRealData(pTask, pDocEx->pChildDoc[pDocEx->nPortNo], 0x23, (unsigned char*)ucRawData, 256) != RET_OK ) { ReportLog(pDocEx->pChildDoc[pDocEx->nPortNo], pTask, RET_TERME_NOANSWER, "历史扎帐任务", "金仕达中间传输层无反应!"); } printf("AuthNo=%d, 收扎帐历史数: 从%d收到%d, 期望值:%d, 实际收到:%d\n", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID, iBegin, iEnd, iBegin, nFlowNo); if( iBegin == iEnd ) { pDocEx->pChildDoc[pDocEx->nPortNo]->m_nFlowFlag = 0 ; TerminateTask(); } else { if( iBegin == 65535 ) iBegin = 0 ; else iBegin++; char szTemp[18]; sprintf(szTemp, "%d:%d", iBegin, iEnd); strcpy(pTask->szMemo, szTemp); } } //流水号与期望值不符合 else { if( OutputRealData(pTask, pDocEx->pChildDoc[pDocEx->nPortNo], 0x23, (unsigned char*)ucRawData, 256) != RET_OK ) { ReportLog(pDocEx->pChildDoc[pDocEx->nPortNo], pTask, RET_TERME_NOANSWER, "历史扎帐任务", "金仕达中间传输层无反应!"); } printf("AuthNo=%d, 收扎帐历史数: 从%d收到%d, 期望值:%d, 实际收到:%d\n", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID, iBegin, iEnd, iBegin, nFlowNo); if( iBegin == iEnd ) { pDocEx->pChildDoc[pDocEx->nPortNo]->m_nFlowFlag = 0 ; TerminateTask(); } else { if( iBegin == 65535 ) iBegin = 0 ; else iBegin++; char szTemp[18]; sprintf(szTemp, "%d:%d", iBegin, iEnd); strcpy(pTask->szMemo, szTemp); } } return RET_OK; }
void CJZHistoryData::OnCRCError() { ReportLog(m_pDocEx->pChildDoc[m_nIndex], m_pTask, RET_DATACRC_ERROR, "历史扎帐任务", "收集历史扎帐数据时CRC错"); ClearPortData(m_pDocEx->pChildDoc[m_nIndex], m_pBuffer, m_nIndex); }
int main(int argc, char **argv) { /* Get this now so we can use the event log. */ ReportInit(); serverOptions(argc, argv); if (0 < server_quit) { pid_t pid; int length; HANDLE signal_quit; char event_name[128]; pid = pidLoad(pid_file); length = snprintf(event_name, sizeof (event_name), "Global\\%ld-%s", (long) pid, server_quit == 1 ? "QUIT" : "TERM"); if (sizeof (event_name) <= length) { ReportLog(EVENTLOG_ERROR_TYPE, "service %s pid file name too long", _NAME); return EX_SOFTWARE; } signal_quit = OpenEvent(EVENT_MODIFY_STATE , 0, event_name); if (signal_quit == NULL) { ReportLog(EVENTLOG_ERROR_TYPE, "service %s quit error: %s (%d)", _NAME, strerror(errno), errno); return EX_OSERR; } SetEvent(signal_quit); CloseHandle(signal_quit); return EXIT_SUCCESS; } if (windows_service != NULL) { if (winServiceInstall(*windows_service == 'a', _NAME, NULL) < 0) { ReportLog(EVENTLOG_ERROR_TYPE, "service %s %s error: %s (%d)", _NAME, windows_service, strerror(errno), errno); return EX_OSERR; } return EXIT_SUCCESS; } openlog(_NAME, LOG_PID|LOG_NDELAY, log_facility); if (daemon_mode) { if (pidSave(pid_file)) { syslog(LOG_ERR, log_init, SERVER_FILE_LINENO, strerror(errno), errno); return EX_SOFTWARE; } if (pidLock(pid_file) < 0) { syslog(LOG_ERR, log_init, SERVER_FILE_LINENO, strerror(errno), errno); return EX_SOFTWARE; } winServiceSetSignals(&signals); if (winServiceStart(_NAME, argc, argv) < 0) { ReportLog(EVENTLOG_ERROR_TYPE, "service %s start error: %s (%d)", _NAME, strerror(errno), errno); return EX_OSERR; } return EXIT_SUCCESS; } #ifdef NOT_USED { long length; char *cwd, *backslash, *server_root, default_root[256]; /* Get the absolute path of this executable and set the working * directory to correspond to it so that we can find the options * configuration file along side the executable, when running as * a service. (I hate using the registry.) */ if ((length = GetModuleFileName(NULL, default_root, sizeof default_root)) == 0 || length == sizeof default_root) { ReportLog(EVENTLOG_ERROR_TYPE, "failed to find default server root"); return EXIT_FAILURE; } /* Strip off the executable filename, leaving its parent directory. */ for (backslash = default_root+length; default_root < backslash && *backslash != '\\'; backslash--) ; server_root = default_root; *backslash = '\0'; /* Remember where we are in case we are running in application mode. */ cwd = getcwd(NULL, 0); /* Change to the executable's directory for default configuration file. */ if (chdir(server_root)) { ReportLog(EVENTLOG_ERROR_TYPE, "failed to change directory to '%s': %s (%d)\n", server_root, strerror(errno), errno); exit(EX_OSERR); } if (cwd != NULL) { (void) chdir(cwd); free(cwd); } } #endif return serverMain(); }
//*---------------------------------------------------------------------------- //*函数: long ProcessRequest() //*功能: 处理具体的业务请求 //*参数: 无 //*返回: 见系统返回值说明 //*说明: //*---------------------------------------------------------------------------- long CCollectionData::ProcessData(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { int nIndex = m_pDocEx->nPortNo ; long nRet = RET_NG; //接收成功统计 InterlockedExchangeAdd((LONG*)&gSendRecv, (LONG)(GetTickCount()- pDocEx->pChildDoc[pDocEx->nPortNo]->m_dwLastTick)); InterlockedIncrement((LONG*)&gTrySendRecv); switch(GetMachineType(m_pDocEx->pChildDoc[nIndex])) { case MACHINE_TYPE_5301://服务器 nRet = LPort_Process(pDocEx,pTask,pBuffer); break; case MACHINE_TYPE_0201://增值机 case MACHINE_TYPE_0226://收费机 case MACHINE_TYPE_0228://车载机 case MACHINE_TYPE_0230://管理机 case MACHINE_TYPE_0232://上机上网机 case MACHINE_TYPE_0234://淋浴管理机 case MACHINE_TYPE_0240://售票机 case MACHINE_TYPE_0130://身份识别机 case MACHINE_TYPE_0140://检票机 case MACHINE_TYPE_0248://上海淋浴转帐机 { unsigned char ucRawData[256]; #ifdef __DEBUG_OUTPUT__ /*for(int i=0; i< 256; i++) { printf("%02X ", pBuffer->pBuffer[i]); } printf("\n");*/ #endif memset(ucRawData, 0, sizeof(ucRawData)); switch(pBuffer->pBuffer[2]) { case 0x17: if( ReadJZRecord(pDocEx, pTask, pBuffer) ) { memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); nRet = Process_StateData(pDocEx,pTask,pBuffer,&ucRawData[0], 0); } else nRet = RET_NG; break; case 0x0D: { CString strText; strText.Format("机器%d申请签到!", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID); ReportLog(pDocEx->pChildDoc[0], pTask, RET_OK, "实时收数", strText.GetBuffer(0)); CSingInServer SingIn; SingIn.SignInProcess(pDocEx, pBuffer, 0, pTask); break; } case 0x00: memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); nRet = Process_DealTypeData(pDocEx,pTask,pBuffer,&ucRawData[0], 0); break; default: nRet = RET_NG; break; } } break; case MACHINE_TYPE_0121://计时宝 { unsigned char ucRawData[256]; #ifdef __DEBUG_OUTPUT__ for(int i=0; i< 256; i++) { printf("%02X ", pBuffer->pBuffer[i]); } printf("\n"); #endif memset(ucRawData, 0, sizeof(ucRawData)); switch(pBuffer->pBuffer[2]) { case 0x17: if( ReadJZRecord(pDocEx, pTask, pBuffer) ) { memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); nRet = Process_StateData(pDocEx,pTask,pBuffer,&ucRawData[0], 0); } else nRet = RET_NG; break; case 0x0D: { CString strText; strText.Format("机器%d申请签到!", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID); ReportLog(pDocEx->pChildDoc[0], pTask, RET_OK, "实时收数", strText.GetBuffer(0)); CSingInServer SingIn; SingIn.SignInProcess(pDocEx, pBuffer, 0, pTask); break; } case 0x00: memcpy(ucRawData, pBuffer->pBuffer+4, pBuffer->pBuffer[3]); nRet = Process_IdentifyData(pDocEx,pTask,pBuffer,ucRawData, 0); break; default: nRet = RET_NG; break; } } break; case MACHINE_TYPE_0224://挂失机 { unsigned char ucRawData[256]; #ifdef __DEBUG_OUTPUT__ for(int i=0; i< 256; i++) { printf("%02X ", pBuffer->pBuffer[i]); } printf("\n"); #endif memset(ucRawData, 0, sizeof(ucRawData)); switch(pBuffer->pBuffer[2]) { case 0x17: if( ReadJZRecord(pDocEx, pTask, pBuffer) ) { memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); nRet = Process_StateData(pDocEx,pTask,pBuffer,&ucRawData[0], 0); } else nRet = RET_NG; break; case 0x0D: { CString strText; strText.Format("机器%d申请签到!", pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID); ReportLog(pDocEx->pChildDoc[0], pTask, RET_OK, "实时收数", strText.GetBuffer(0)); CSingInServer SingIn; SingIn.SignInProcess(pDocEx, pBuffer, 0, pTask); break; } case 0x00: memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); nRet = Process_GSJData(pDocEx,pTask,pBuffer,&ucRawData[0], 0); break; default: nRet = RET_NG; break; } } break; default: break; } return nRet; }
//*---------------------------------------------------------------------------- //*函数: long LPort_DataProcess(TSSmartDocEx *pDocEx,TSSmartTask *pTask,TSCmdBuffer *pBuffer) //*功能: 处理具体的业务请求 //*参数: 无 //*返回: 见系统返回值说明 //*说明: //*---------------------------------------------------------------------------- long CCollectionData::LPort_Process(TSSmartDocEx *pDocEx,TSSmartTask *pTask,TSCmdBuffer *pBuffer) { unsigned char ucRawData[256]; int nTotalPortNo, nPortNo; memset(ucRawData, 0, sizeof(ucRawData)); memcpy(ucRawData, &pBuffer->pBuffer[4], pBuffer->pBuffer[3]); #ifdef __DEBUG_OUTPUT__ for(int i=0; i< 256; i++) { printf("%02X ", pBuffer->pBuffer[i]); } printf("\n"); #endif int nTempLen = pBuffer->nCmdSize ; unsigned char sTempData[256]; memcpy(sTempData, pBuffer->pBuffer, 256); //不等于端口总数 if( ucRawData[2] != pDocEx->pChildDoc[pDocEx->nPortNo]->m_nPortCount ) { CString strString; strString.Format("收集LPort数据时, 返回的端口总数与数据库端口总数不相等. 返回的端口数为:%d, 档案表为:%d! 您的LPort参数设置不正确, 请重新校对LPort的参数", ucRawData[2], pDocEx->pChildDoc[0]->m_nPortCount); ReportLog(pDocEx, pTask, RET_SYSERROR, "实时收数", strString.GetBuffer(0) ); if( !ResetDevice(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer) ) { printf("1---实时收集LPORT数据时,返回的端口总数不等于参数内的端口总数\n"); ReportLog(pDocEx, pTask, RET_SYSERROR, "实时收数", "收集LPort数据时, 由于返回的端口总数不相等, 复位时出错!"); } return RET_SYSERROR; } /* LportState(pDocEx,pTask,pBuffer,ucRawData); if( !LportState(pDocEx,pTask,pBuffer,ucRawData) ) { InterlockedIncrement((LONG*)&gNotFound); //Sleep(50); return RET_NG; }*/ nTotalPortNo = ucRawData[2]; nPortNo = ucRawData[3+nTotalPortNo]; //端口数不对, 复位 if( nPortNo > nTotalPortNo ) { printf("1---实时收集LPORT数据时,返回的端口总数不等于参数内的端口总数\n"); ResetDevice(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer); return RET_SYSERROR; } nPortNo = GetPos(pDocEx, nPortNo); pBuffer->nCmdSize = nTempLen; memset(pBuffer->pBuffer, 0, pBuffer->nBufferSize); memcpy(pBuffer->pBuffer, sTempData, 256); long nRet = RET_NG ; switch(GetMacDataType(pBuffer)) { case MACDATA_TYPE_JY://为交易类型数据 { int nType = MACHINE_TYPE_5301 ; if( nPortNo < 0 ) { char szDataReg[32]; sprintf(szDataReg, "%.2X%.2X%.2X%.2X", ucRawData[5+nTotalPortNo],ucRawData[6+nTotalPortNo],ucRawData[7+nTotalPortNo],ucRawData[8+nTotalPortNo]); if( nPortNo < 0 ) { //是否在本服务器内 int iPos = GetPos(pDocEx, szDataReg); if( iPos > 0 ) { nPortNo = iPos; } else { TSSmartDoc doc; //档案表中有数据 if( FindMachine(szDataReg, &doc) ) nType = GetMachineType(&doc); } } } nType = GetMachineType(pDocEx->pChildDoc[nPortNo]); switch( nType) { case MACHINE_TYPE_5301://服务器 case MACHINE_TYPE_0201://增值机 case MACHINE_TYPE_0226://收费机 case MACHINE_TYPE_0228://车载机 case MACHINE_TYPE_0230://管理机 case MACHINE_TYPE_0232://上机上网机 case MACHINE_TYPE_0234://淋浴管理机 case MACHINE_TYPE_0240://售票机 case MACHINE_TYPE_0130://身份识别机 case MACHINE_TYPE_0140://检票机 case MACHINE_TYPE_0248://上海理工转帐机 nRet = Process_DealTypeData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; case MACHINE_TYPE_0121://计时宝 nRet = Process_IdentifyData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; case MACHINE_TYPE_0224://挂失机 nRet = Process_GSJData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; default: break; } } break; case MACDATA_TYPE_ZZ://为扎帐数据 nRet = Process_StateData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],pDocEx->nPortNo); break; case MACDATA_TYPE_BZ://为补助数据 nRet = Process_AssisData(pDocEx,pTask,pBuffer,&ucRawData[5+nTotalPortNo],nPortNo); break; default: break; } LportState(pDocEx,pTask,pBuffer,ucRawData); /*if( !LportState(pDocEx,pTask,pBuffer,ucRawData) ) { InterlockedIncrement((LONG*)&gNotFound); Sleep(50); //printf("处理LPORT%.8X状态返回\n",pDocEx->pChildDoc[0]->m_nAuthID); return RET_NG; }*/ Sleep(100); return nRet; }
long CSingInServer::ProcessData(TSSmartDocEx *pDocEx, TSSmartTask *pTask, TSCmdBuffer *pBuffer) { bool bResult = false; CTime tm; int len=0,i=0; int E_number=0; unsigned char Clock[16]; unsigned char Plain[256],ID[16]; char ErrMsg[256]; memset(ID, 0x00,sizeof ID); memset(Clock, 0x00,sizeof Clock); memset(Plain, 0x00,sizeof Plain); memset(ErrMsg,0x00,sizeof ErrMsg); sprintf(ErrMsg,"处理终端%.8X签到任务\n",pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID); printf(ErrMsg); WriteLog(ErrMsg); m_nIndex = pDocEx->nPortNo; memset(ErrMsg,0x00,sizeof ErrMsg); //由于需要金仕达确认是否可以签到,故将签到任务提前到前面 int ret = 0; E_number = 1; for(i=0; i<3; i++) { tm=CTime::GetCurrentTime(); Clock[0] = tm.GetYear()-2000; Clock[1] = tm.GetMonth(); Clock[2] = tm.GetDay(); Clock[3] = tm.GetHour(); Clock[4] = tm.GetMinute(); Clock[5] = tm.GetSecond(); Clock[6] = tm.GetDayOfWeek(); MakeBuf_SetClock(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer,Clock); pBuffer->nTimeOut1 = 1000; pBuffer->nTimeOut2 = 1000; //Modified by hhd at 2006-01-20,added return code ret=SendRequest(pDocEx->pChildDoc[m_nIndex], pBuffer); if(ret==RET_OK) { ret=UnMakeDeviceBuffer(pBuffer); if(ret==RET_OK) { sprintf(ErrMsg,"下传终端%.8X时钟成功!\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID); printf(ErrMsg); WriteLog(ErrMsg); bResult = true; break; } else { sprintf(ErrMsg,"-----!!!!校验%.8X返回包失败-时钟!错误码=[%d]\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID,ret); printf(ErrMsg); Sleep(1000); } } else { sprintf(ErrMsg,"-----!!!!下传终端%.8X时钟失败!错误码=[%d]\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID,ret); printf(ErrMsg); Sleep(1000); } } if( !bResult ) { printf("-----!!!!下传终端%.8X时钟失败!\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID); ReportLog(pDocEx->pChildDoc[m_nIndex], pTask, RET_CLOCK_ERROR, "终端机签到", "终端机签到 ---校对时钟失败!"); pDocEx->pChildDoc[pDocEx->nPortNo]->m_nSignIn = RET_CLOCK_ERROR ; return RET_CLOCK_ERROR; } char szKeyBuf[256]; memset(Plain, 0x00, sizeof(Plain)); memset(szKeyBuf, 0x00, sizeof(szKeyBuf)); GetAuthKey(szKeyBuf); if( !strlen(szKeyBuf) ) //向金仕达取授权密钥失败 add by dengjun 20060616 { strcpy(ErrMsg,"向金仕达取授权密钥失败"); printf("%s\n",ErrMsg); WriteLog(ErrMsg); } len = strlen(szKeyBuf)/2; SVC_DSP_2_HEX((BYTE*)szKeyBuf, Plain, len); //设置授权信息 bResult = false; Sleep(5000); //Modified by dengjun 20060616 update Sleep(250) to Sleep(5000) memset(ErrMsg,0x00,sizeof ErrMsg); //Modified by hhd at 2006-01-20,added return code for(i=0; i<3; i++) { SVC_DSP_2_HEX((unsigned char *)pDocEx->pChildDoc[pDocEx->nPortNo]->m_szDeviceID, ID, 4); //modified by lina 20050308 SmartEncrypt(E_number,ID,Plain); MakeBuf_SetWorkingKey(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo,pBuffer,Plain,E_number); pBuffer->nTimeOut1 = 1000 ; pBuffer->nTimeOut2 = 1000; ret=SendRequest(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer); if(ret==RET_OK) { ret=UnMakeDeviceBuffer(pBuffer); if(ret==RET_OK) { sprintf(ErrMsg,"-----设置终端%.8X授权信息成功!\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID); printf(ErrMsg); WriteLog(ErrMsg); bResult = true; break; } else { sprintf(ErrMsg,"-----!!!!校验%.8X返回包失败-授权!错误码=[%d]\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID,ret); printf(ErrMsg); Sleep(2500); } } Sleep(1000); } if( !bResult ) { printf("-----!!!!设置终端%.8X授权信息失败!\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID); ReportLog(pDocEx->pChildDoc[m_nIndex], pTask, RET_NOT_AUTH, "终端机签到", "终端机签到 ---设置授权信息失败!"); pDocEx->pChildDoc[pDocEx->nPortNo]->m_nSignIn = RET_NOT_AUTH ; return RET_NOT_AUTH; } if((ret=SignIn(pDocEx->pChildDoc[pDocEx->nPortNo])) != RET_OK) { sprintf(ErrMsg,"后台不允许签到[ErrCode=%ld]!!!!!!!!!!!!!!!\n",ret); printf(ErrMsg); WriteLog(ErrMsg); return RET_ERROR_AUTH;//25:后台不允许签到; } Sleep(3000); //设置消费开关 bResult = false; for(i=0; i<3; i++) { MakeBuf_SetComsumeFlag(&pDocEx->pChildDoc[pDocEx->nPortNo]->DeviceInfo, pBuffer, 1); pBuffer->nTimeOut1 = 1000 ; pBuffer->nTimeOut2 = 1000; ret=SendRequest(pDocEx->pChildDoc[pDocEx->nPortNo], pBuffer); if(ret==RET_OK) { ret=UnMakeDeviceBuffer(pBuffer); if(ret==RET_OK) { bResult = true; break; } else { sprintf(ErrMsg,"-----!!!!校验%.8X返回包失败-消费开关!错误码=[%d]\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID,ret); printf(ErrMsg); WriteLog(ErrMsg); Sleep(1500); } } else { Sleep(200); } } if( !bResult ) { printf(ErrMsg,"----!!!!设备%.8X签到失败!\n",pDocEx->pChildDoc[m_nIndex]->m_nAuthID); ReportLog(pDocEx->pChildDoc[m_nIndex], pTask, RET_REQU_SIGNIN, "终端机签到", "终端机签到--设置消费开关失败!"); pDocEx->pChildDoc[pDocEx->nPortNo]->m_nSignIn = RET_REQU_SIGNIN ; WriteLog(ErrMsg); return RET_REQU_SIGNIN; } pDocEx->pChildDoc[pDocEx->nPortNo]->m_nSignIn = 1 ; GetCurDateTime(pDocEx->pChildDoc[pDocEx->nPortNo]->m_szSignInTime); printf(ErrMsg,"-----%.8X签到成功!\n",pDocEx->pChildDoc[pDocEx->nPortNo]->m_nAuthID); ReportLog(pDocEx->pChildDoc[m_nIndex], pTask, RET_OK, "终端机签到", "终端机签到成功!"); WriteLog(ErrMsg); return RET_OK; }