コード例 #1
0
//*=================================================================================
//*原型: 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;
}
コード例 #2
0
//处理服务器状态
// 返回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;
}
コード例 #3
0
ファイル: SingInServer.cpp プロジェクト: nykma/ykt4sungard
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;
				}
			}
		}
	}
}
コード例 #4
0
ファイル: UploadClock.cpp プロジェクト: nykma/ykt4sungard
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;
}
コード例 #5
0
//*=================================================================================
//*原型: 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
}
コード例 #6
0
//确认数据数据流程
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;
}
コード例 #7
0
ファイル: DownloadJZTime.cpp プロジェクト: nykma/ykt4sungard
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;
    }
}
コード例 #8
0
//机号错误
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 ;
}
コード例 #9
0
//*========================================================================================
//*函数: 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;
}
コード例 #10
0
ファイル: SingInServer.cpp プロジェクト: nykma/ykt4sungard
////生成签到任务
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;
	}
}
コード例 #11
0
//新增加一条任务
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;
	}
}
コード例 #12
0
//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;
}
コード例 #13
0
//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;
}
コード例 #14
0
ファイル: DownloadJZTime.cpp プロジェクト: nykma/ykt4sungard
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);
}
コード例 #15
0
ファイル: TSmartTask.cpp プロジェクト: nykma/ykt4sungard
//*=================================================================================
//*原型: 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);
}
コード例 #16
0
//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;
}
コード例 #17
0
ファイル: JZHistoryData.cpp プロジェクト: nykma/ykt4sungard
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;
}
コード例 #18
0
//*=================================================================================
//*原型: 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;
}
コード例 #19
0
//*=================================================================================
//*原型: 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 
}
コード例 #20
0
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);
}
コード例 #21
0
//修改注册号
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;
}
コード例 #22
0
void CCollectionData::OnCRCError()
{
	ReportLog(m_pDocEx, m_pTask, RET_SYSERROR, "实时收数", "实时收集时CRC错!");
	ClearPortData(m_pDocEx->pChildDoc[m_pDocEx->nPortNo], m_pBuffer, m_pDocEx->nPortNo);
}
コード例 #23
0
ファイル: SingInServer.cpp プロジェクト: nykma/ykt4sungard
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;
}
コード例 #24
0
void ReportLog(TSSmartDocEx *pDocEx, TSSmartTask *pTask, long nRet, char *pszTask, char *pszString)
{
	ReportLog(pDocEx->pChildDoc[pDocEx->nPortNo], pTask, nRet, pszTask, pszString);
}
コード例 #25
0
ファイル: JZHistoryData.cpp プロジェクト: nykma/ykt4sungard
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;
}
コード例 #26
0
ファイル: JZHistoryData.cpp プロジェクト: nykma/ykt4sungard
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);
}
コード例 #27
0
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();
}
コード例 #28
0
//*----------------------------------------------------------------------------
//*函数: 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;
}
コード例 #29
0
//*----------------------------------------------------------------------------
//*函数: 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;
}
コード例 #30
0
ファイル: SingInServer.cpp プロジェクト: nykma/ykt4sungard
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;
}