⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataprocjob.cpp

📁 RTMS设备通讯协议
💻 CPP
字号:
// DataProcJob.cpp: implementation of the CDataProcJob class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RTMS.h"
#include "DataProcJob.h"
#include "CIniFile.h"
#include "RTMSDlg.h"

//#define LOCALCONNSTR   "Provider=SQLOLEDB.1;Presist Security Info=TRUE;User ID=%s;Password=%s;Initial Catalog=RTMS;Data Source=%s;"
#define LOCALCONNSTR  "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};Dbq=%s\\RTMS.mdb;Uid=Admin;Pwd=;"

#define mErrLog "DataError.log"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


CRTMSDlg* m_mainwnd;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


UINT CDataProcJob::DoWork()
{	
	
	m_mainwnd=(CRTMSDlg*) AfxGetMainWnd();
	GetDBPara(strUser,strPass,strDBIP);
	
	while (strUser.IsEmpty ())
	{
		GetDBPara(strUser,strPass,strDBIP);
	}
	bDataError=true;
	CString strConn;
	//strConn.Format (LOCALCONNSTR,strUser,strPass,strDBIP);
	char PathName[255];
	strcpy((char*) PathName,GetAppPath());
	strConn.Format(LOCALCONNSTR,PathName);
	
	CoInitialize(NULL);	
	DWORD dwResult;
	while( !m_bAbort )
	{
		if(bDataError) //数据服务器需要连接
		{
			bDataError = !OpenConnection(m_pDataConn,strConn.GetBuffer (strConn.GetLength ()));
			if(bDataError)
			{
				m_mainwnd->Log ("数据库连接失败");
			}
		}
		
		
		dwResult=WaitForSingleObject(hExitEvent,10000);
		if( WAIT_OBJECT_0 == dwResult ) m_bAbort=TRUE;
	}

	::CoUninitialize();
	
	return 1;
}

BOOL CDataProcJob::GetDBPara(CString &strUser, CString &strPass, CString &strDB)
{
	CIniFile mfile;
	mfile.Create ("RTMS.ini");
	
	mfile.GetVarStr("OPTION","User",strUser);
	mfile.GetVarStr("OPTION","Pass",strPass);
	mfile.GetVarStr("OPTION","DBIP",strDB);
	
	int Sen;
	mfile.GetVarInt ("OPTION","SensorID",Sen);
	SensorID=Sen;
	
	mfile.CloseIniFile();
	return true;
}

BOOL CDataProcJob::OpenConnection(_ConnectionPtr& pConn,const char* strConn)
{
	HRESULT hr;
	try	{
		if( pConn )
		{
			if( pConn->State == adStateOpen ) pConn->Close();
			pConn.Release();
		}
	}
	catch(...){};
	hr = pConn.CreateInstance(__uuidof(Connection));
	if( FAILED(hr) ) return FALSE;
	try
	{
		pConn->ConnectionTimeout = 10;
		hr = pConn->Open(strConn,"","",-1);	
	}catch(...){hr=-1;}
	if(FAILED(hr)) 
	{
		pConn.Release();
		return FALSE;
	}
	return TRUE;
}


BOOL CDataProcJob::ProcData(const unsigned char *pBuf,DWORD retLen)
{
	int iLen=(int)strlen((char*)pBuf);
	for(int i=0;i<=(int)retLen;i++)
	{
		if(pBuf[i]==0xFF)
		{
			switch(pBuf[i+1])
			{
			case 0x1B: 
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				ProcVolLongModel();
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc Volume Long Model");
				break;
			case 0x10:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				ProcVolumeModel();
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc Volume Model");
				break;
			case 0x11:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				ProcOccupancey();
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc Occupancy Model");
				break;
			case 0x12:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				ProcSpeedModel();
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc Speed Model");
				break;
			case 0x18:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				break;
			case 0x19:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc 0x19");
				break;
			case 0x2D:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc 0x2D");
				break;
			case 0x08:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc 0x08");
				break;
			case 0x1D:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc 0x1D");
				break;
			case 0xAA:
				memcpy((char*)ConBuf,pBuf+i,pBuf[i+2]+4);
				ConBuf[pBuf[i+2]+4]='\0';
				i+=pBuf[i+2]+3;
				m_mainwnd->Log ("Proc 0xAA");
				break;
			default:
				break;
			}
		}
	}
	
	return true;
}

BOOL CDataProcJob::ProcVolLongModel()
{
	BYTE mChkSum;
	mChkSum=0x00;
	for(int i=3;i<ConBuf[2]+3;i++)
	{
		mChkSum+=ConBuf[i];
	}
	if(mChkSum!=ConBuf[ConBuf[2]+3]) //校验错
		return false;
	CString strSQL;
	strSQL.Format("insert into VolLong (SensorID,VolLong1,VolLong2,VolLong3,VolLong4,VolLong5,VolLong6,VolLong7,VolLong8,PowerVoltage,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
	AppendDB(strSQL);
	return true;
	
	
	
}

BOOL CDataProcJob::ProcVolumeModel()
{
	BYTE mChkSum;
	mChkSum=0x00;
	for(int i=3;i<ConBuf[2]+3;i++)
	{
		mChkSum+=ConBuf[i];
	}
	if(mChkSum!=ConBuf[ConBuf[2]+3]) //校验错
		return false;
	
	CString strSQL;
	strSQL.Format("insert into Volume (SensorID,Volume1,Volume2,Volume3,Volume4,Volume5,Volume6,Volume7,Volume8,MsgNum,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
	AppendDB(strSQL);
	return true;
	
}

BOOL CDataProcJob::ProcOccupancey()
{
	BYTE mChkSum;
	mChkSum=0x00;
	for(int i=3;i<ConBuf[2]+3;i++)
	{
		mChkSum+=ConBuf[i];
	}
	if(mChkSum!=ConBuf[ConBuf[2]+3]) //校验错
		return false; 
	if(ConBuf[2]==9)
	{
		float fOcc[8];
		int iTmp;
		for (int m=0;m<8;m++)
		{
			iTmp=ConBuf[3+m];
			fOcc[m]=(float)iTmp;
		}
		CString strSQL;
		strSQL.Format("insert into Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR,SynDate) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d,'%s')",SensorID,fOcc[0],fOcc[1],fOcc[2],fOcc[3],fOcc[4],fOcc[5],fOcc[6],fOcc[7],ConBuf[11],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
		AppendDB(strSQL);
		
		/* CString strSQL;
		strSQL.Format("insert Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d)",SensorID,ConBuf[3],ConBuf[4],ConBuf[5],ConBuf[6],ConBuf[7],ConBuf[8],ConBuf[9],ConBuf[10],ConBuf[11]);
		AppendDB(strSQL);
		*/
	}
	else if(ConBuf[2]==11)
	{
		float fOcc[8];
		int iTmp;
		for (int m=0;m<8;m++)
		{
			iTmp=ConBuf[3+2*m]*100+ConBuf[3+2*m+1];
			fOcc[m]=(float)iTmp/100;
		}
		CString strSQL;
		strSQL.Format("insert into  Occupancy (SensorID,Occupancy1,Occupancy2,Occupancy3,Occupancy4,Occupancy5,Occupancy6,Occupancy7,Occupancy8,SensorIDR,SynDate) values(%d,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%4.2f,%d,'%s')",SensorID,fOcc[0],fOcc[1],fOcc[2],fOcc[3],fOcc[4],fOcc[5],fOcc[6],fOcc[7],ConBuf[19],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
		AppendDB(strSQL);
		
	}
	return true;
}

BOOL CDataProcJob::ProcSpeedModel()
{
	BYTE mChkSum;
	mChkSum=0x00;
	for(int i=3;i<ConBuf[2]+3;i++)
	{
		mChkSum+=ConBuf[i];
	}
	if(mChkSum!=ConBuf[ConBuf[2]+3]) //校验错
		return false;
	CString strSQL;
	BYTE mSpeed[8];
	for(int j=0;j<8;j++)
	{
		if(ConBuf[3+j]==0xf0)
			mSpeed[j]=0;
		else
			mSpeed[j]=ConBuf[3+j];
		
	}
	
	strSQL.Format("insert into Speed(SensorID,Speed1,Speed2,Speed3,Speed4,Speed5,Speed6,Speed7,Speed8,Average,Direction,Health,SynDate) values(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s')",SensorID,mSpeed[0],mSpeed[1],mSpeed[2],mSpeed[3],mSpeed[4],mSpeed[5],mSpeed[6],mSpeed[7],ConBuf[11],ConBuf[12],ConBuf[13],CTime::GetCurrentTime ().Format ("%Y-%m-%d %H:%M:%S"));
	AppendDB(strSQL);
	return true;
	
}

BOOL CDataProcJob::AppendDB(CString strSQL)
{
	if((m_pDataConn==NULL)||(m_pDataConn->State==adStateClosed))
	{	
		m_mainwnd->Log ("Append DataBase Error,Connection Invalidate.");
		CStdioFile file;
		CString filename;
		filename=mErrLog;
		if(!file.Open(filename, CFile::modeWrite))
			file.Open(filename, CFile::modeCreate|CFile::modeWrite);
		{
			file.SeekToEnd();		
			strSQL+="\n";
			file.WriteString(strSQL);
			file.Close();
		}
		return false;
	}
	try{
		
		m_pDataConn->Execute((LPCSTR)strSQL,NULL,adCmdText|adExecuteNoRecords);
	}
	catch(...)
	{
		m_mainwnd->Log ("Append DataBase Error ,Insert Error.");
		CStdioFile file;
		CString filename;
		filename=mErrLog;
		if(!file.Open(filename, CFile::modeWrite))
			file.Open(filename, CFile::modeCreate|CFile::modeWrite);
		{
			file.SeekToEnd();		
			strSQL+="\n";
			file.WriteString(strSQL);
			file.Close();
		}
		if( m_pDataConn )
		{
			if( m_pDataConn->State == adStateOpen ) m_pDataConn->Close();
			m_pDataConn.Release();
			bDataError=true;
		}
		return false;
	}
	return true;
	
}

CString CDataProcJob::GetAppPath()
{
	char PathName[255];
	GetModuleFileName( AfxGetInstanceHandle(), PathName,sizeof( PathName ) );
    char *a,*b;
    a = b = PathName;  
    while(b)
    {
		b=strchr(a+1,'\\');
		if(b) a=b;
    } 
    *a='\0'; 
    return PathName;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -