devbas.cpp

来自「国家环保总局污染源在线通讯协议的简化版」· C++ 代码 · 共 793 行 · 第 1/2 页

CPP
793
字号
	{
		return FALSE;		
	}	
	*/
	return TRUE;
}

///	函数功能:	此函数读命令功能。
///	函数返回:	TRUE,正确。FALSE,错误。
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针。
///				strCmd			设备命令字符串中去掉命令符后剩下的字符串。
///	备	  注:	
///	
BOOL CDevBas::mfDevIOReadOrder(MCGS_DATA& data, CString& strCmd)
{

	return TRUE;
}

///	函数功能:	此函数设置命令功能。
///	函数返回:	TRUE,正确。FALSE,错误。
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针。
///				strCmd			设备命令字符串中去掉命令符后剩下的字符串。
///	备	  注:	
///	
BOOL CDevBas::mfDevIOSetiniOrder(MCGS_DATA& data, CString& strCmd)
{
	CString strCmdOrder = _T(""), strCmdData = _T(""), strDivision = _T("=");	
	if (!CDevServer::SvrGetCmdStr(strCmd, strDivision, strCmdOrder, strCmdData))
	{
		return -300;
	}	
	
	CString strOrder, strData;
	if (!CDevServer::SvrGetParaValue(strCmdOrder, strOrder)) {
		return -300;
	}
	
	
	
	if (strOrder.CompareNoCase(_T("MN")) == 0) {
		
		if (!CDevServer::SvrGetParaValue(strCmdData, strData)) {
			return -300;
		}
		
		if (strData.GetLength() < 2) {
			return -300;
		}

		if (strData.GetLength() != DEV_LONG_MNLENGTH) {
			return -1;
		}
		((DEV_DATA*)data.m_pDevData)->strMN = _T("MN=") + strData;
	}	
	else if (strOrder.CompareNoCase(_T("ST")) == 0) {

		if (!CDevServer::SvrGetParaValue(strCmdData, strData)) {
			return -300;
		}
		
		if (strData.GetLength() < 2) {
			return -300;
		}

		((DEV_DATA*)data.m_pDevData)->strST = strData;
	
	}
	else if (strOrder.CompareNoCase(_T("PW")) == 0) {

		if (!CDevServer::SvrGetParaValue(strCmdData, strData)) {
			return -300;
		}
		
		if (strData.GetLength() < 2) {
			return -300;
		}

		((DEV_DATA*)data.m_pDevData)->strPW = _T("PW=") + strData;
	
	}
	else if (strOrder.CompareNoCase(_T("LogTime")) == 0) {
		float fValue = 0;
		if (!CDevServer::SvrGetParaValue(strCmdData, fValue)) {
			return -300;
		}
		int nValue = (int)fValue;
		if (nValue <= 0) {
			return -300;
		}

		((DEV_DATA*)data.m_pDevData)->nRtdInterval = nValue;	
	}
	else{
		return -300;
	}

	return TRUE;
}

int CDevBas::mfWriteAndRead(MCGS_DATA &data, CString &strProtocol, 
							const CString& strQN, DWORD dwReadLen)
{
	mfAddSum(strProtocol, DEV_CHECK_OUT);
	DWORD dwDelayTime = ((DEV_DATA*)data.m_pDevData)->nArProperty[DEV_PRO_DELAYTIME];
	CString strData, strSend;
	CByteArray bytArData, bytArTemp, bytArSend;
	bytArData.SetSize(0);
	bytArTemp.SetSize(0);
	bytArSend.SetSize(0);

	int nReturn =0;
	int nCount = 0;

	bytArData.SetSize(0);
	CDevServer::SvrStr2Byte(strProtocol, bytArSend);
	strSend = strProtocol;
	
	if(((DEV_DATA*)data.m_pDevData)->bLog){
		mfWriteLog(data, ((DEV_DATA*)data.m_pDevData)->dwLogN, _T("SendData:"),
			strSend,DEV_PROTOCOL_ASII);
		((DEV_DATA*)data.m_pDevData)->dwLogN ++;
	}
	strProtocol = _T("");

	{// 清空接受缓冲区
		CByteArray byteReadTrash;
		CDevServer::SvrReadTcpip(data, byteReadTrash);
	}

	nReturn = CDevServer::SvrWriteTcpip(data, bytArSend);

	if (nReturn <= 0) {
		return -1;
	}	
	else if (nReturn < bytArSend.GetSize()) {
		return -2;
	}

	DWORD dwBeginTime = GetTickCount();

	while (TRUE) {
		if (CDevServer::SvrReadTcpip(data, bytArData) > 0) {
			CDevServer::SvrByte2Str(bytArData, strData);
			strProtocol += strData;
			bytArTemp.RemoveAll();
			Sleep(5);
			continue;
		}

//		if (GetTickCount() - dwBeginTime > dwDelayTime) {
		if (CDevServer::mfTimeOut(dwBeginTime, dwDelayTime)){
			break;
		}
		else if (strProtocol.GetLength() >= (int)dwReadLen) {
			break;
		}
		Sleep(5);
	}
	
	nReturn = strProtocol.GetLength();
	if(((DEV_DATA*)data.m_pDevData)->bLog){
		mfWriteLog(data, ((DEV_DATA*)data.m_pDevData)->dwLogN, _T("ResvData:"),
			strProtocol,DEV_PROTOCOL_ASII);
	}
	if (nReturn<= 0) {
		return -1;
	}
	else if (nReturn < (int)dwReadLen) {
		return -2;		
	}
	
	CString strTemp = _T("STX");
	if (strProtocol.CompareNoCase(strTemp) != 0) {
		return -3;
	}
	
	return nReturn;
}


///	函数功能:	加包头
///	函数返回:	无返回值
///	参数意义:	strProtocol 传入需要加包头的字符串,返回加包头字符串
///	备	  注:
void CDevBas::mfAddHead(CString &strProtocol)
{
	CString strTemp;
	strTemp.Format(DEV_STR_HEADFORMAT, strProtocol.GetLength());
	strProtocol = strTemp + strProtocol;
}

///	函数功能:	获取系统系统时间
///	函数返回:	无返回值
///	参数意义:	strTime 返回得到的时间格式字符串,YYYYMMDDHHMMSSMMM
///	备	  注:	
void CDevBas::mfGetSysTime(CString &strTime, CStringArray& strValueArray)
{
	/*
	SYSTEMTIME sysTime;
	GetLocalTime(&sysTime);
	strTime.Format(_T("%.4d%.2d%.2d%.2d%.2d%.2d%.3d"),
					sysTime.wYear, sysTime.wMonth, sysTime.wDay,
					sysTime.wHour, sysTime.wMinute,sysTime.wSecond, sysTime.wMilliseconds);
					*/
	///2009-04-07 和 08:57:00
	CString str1 = strValueArray[2], str2 = strValueArray[3];
	
	strTime = str1.Left(4) + str1.Mid(5, 2) + str1.Right(2)	
		+ str2.Left(2) + str2.Mid(3, 2) + str2.Right(2) + _T("000");
	
}

///	函数功能:	设置系统时间
///	函数返回:	无返回值
///	参数意义:	strTime 传过来的时间格式字符串,YYYYMMDDHHMMSS
///	备	  注:	
void CDevBas::mfSetSysTime(CString &strTime)
{
	SYSTEMTIME sysTime;
	DWORD dwValue;
	_stscanf(strTime.Left(4), _T("%d"), &dwValue);
	sysTime.wYear = dwValue;
	_stscanf(strTime.Mid(4, 2), _T("%d"), &dwValue);
	sysTime.wMonth = dwValue;
	_stscanf(strTime.Mid(6, 2), _T("%d"), &dwValue);
	sysTime.wDay = dwValue;
	_stscanf(strTime.Mid(8, 2), _T("%d"), &dwValue);
	sysTime.wHour = dwValue;
	_stscanf(strTime.Mid(10, 2), _T("%d"), &dwValue);
	sysTime.wMinute = dwValue;
	_stscanf(strTime.Mid(12, 2), _T("%d"), &dwValue);
	sysTime.wSecond = dwValue;
	SetLocalTime(&sysTime);
}

///	函数功能:写日志文件
///	函数返回:TRUE 成功,FALSE失败
///			  
///	参数意义:nLineNum		行序号
///			  strTile		数据标题说明
///			  strProtocol	收发数据字符串
///			  nStrType		数据类型
///			  dwTimeSp		通讯花费时间(为0则日志中无此项)
///	备	  注: 
BOOL CDevBas::mfWriteLog(MCGS_DATA& data, int nLineNum, CString strTile, 
						 CString strProtocol, int nStrType, DWORD dwTimeSp)
{	


	int nStrLen = 0;
	CString strLog = _T("");
	DEV_DATA *pDevData = (DEV_DATA*)data.m_pDevData;
	int nDevAdr = ((DEV_DATA*)data.m_pDevData)->nArProperty[DEV_PRO_NUM];
	DWORD dwCurrentTime = GetTickCount();
	if (nLineNum >= 0)
	{
		CTime ntime = CTime::GetCurrentTime();
		nStrLen = strProtocol.GetLength();
		if (nStrType == DEV_PROTOCOL_HEX)
		{
			nStrLen /= 2;
		}
		
		if (dwTimeSp > 0)
		{
			strLog.Format(_T("Address:%.2d Line%.3d (%4d-%.2d-%.2d %.2d:%.2d:%.2d)[%d] %s[%d Byte][%dms]: "),
				nDevAdr,nLineNum,ntime.GetYear(),ntime.GetMonth(),ntime.GetDay(),ntime.GetHour(),
				ntime.GetMinute(),ntime.GetSecond(),dwCurrentTime,strTile,nStrLen,dwTimeSp);
		}
		else
		{
			strLog.Format(_T("Address:%.2d Line%.3d (%4d-%.2d-%.2d %.2d:%.2d:%.2d)[%d] %s[%d Byte]: "),
				nDevAdr,nLineNum,ntime.GetYear(),ntime.GetMonth(),ntime.GetDay(),ntime.GetHour(),
				ntime.GetMinute(),ntime.GetSecond(),dwCurrentTime,strTile,nStrLen);
		}
	}
	else	//小于0的通讯状态值
	{
		strLog.Format(_T("[%d] %s ErrorCode[%d]"), dwCurrentTime, strTile, nLineNum);
	}
	strLog = strLog + strProtocol + _T("\r\n");	
	pDevData->strLog += strLog;

	nStrLen = pDevData->strLog.GetLength();
	if ( pDevData->bLog == TRUE /*&& nStrLen > 1024*/)//防止频繁写磁盘
	{
		CString strPath = _T("C:\\");//Windows目录,默认为"C:\"
#ifdef _UNICODE
		strPath = _T("\\harddisk\\");//CE目录,默认为"\HardDisk"
#endif
		strPath = strPath + DEV_STR_HELPFILENAME + _T(".log");//文件名(绝对路径)
		
		//判断文件是否存在
		WIN32_FIND_DATA fd;  
		HANDLE hFind = FindFirstFile(strPath, &fd);
		if ((hFind != INVALID_HANDLE_VALUE) 
			&& !(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) 
		{
			FindClose(hFind);
			CFileStatus fileStat;
			memset(&fileStat,0,sizeof(CFileStatus));
			CFile::GetStatus(strPath,fileStat);
			if(fileStat.m_size >= 1024 * 1024 * 6 )	//文件长度大于6M时清空
			{	
				CFile::Remove(strPath);
			}
		}
		
		CFile f;
		if(!f.Open(strPath,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite))
		{	
			ASSERT(FALSE);
			TRACE(_T("Create Log File Error!\n"));
			return FALSE;
		}
		
		f.SeekToEnd();
		CByteArray ArBt;
		CDevServer::SvrStr2Byte(((DEV_DATA*)data.m_pDevData)->strLog,ArBt);
		f.Write(ArBt.GetData(),ArBt.GetSize());
		((DEV_DATA*)data.m_pDevData)->strLog.Empty();//写完成,将字符清空

		f.Flush();
		f.Close();
	}

	return TRUE;
}


//隐含命令,开启或关闭日志功能
int CDevBas::mfSetHidePro(MCGS_DATA& data, CString& strCmd)
{	
	CString strIndex = _T(""), strValue = _T("");
	CString strDivision = _T(",");
	if (!CDevServer::SvrGetCmdStr(strCmd, strDivision, strIndex, strValue))
	{
		return FALSE;
	}
	
	float fIndex = 0, fValue = 0;
	CDevServer::SvrGetParaValue(strIndex, fIndex);
	CDevServer::SvrGetParaValue(strValue, fValue);
	int nIndex = (int)fIndex;
	switch(nIndex) 
	{
	case 1:		//设置是否开日志
		{	
			if (fValue <= 0)
			{
				((DEV_DATA*)data.m_pDevData)->bLog = FALSE;
			}
			else	////设置开启错误日志
			{
				((DEV_DATA*)data.m_pDevData)->bLog = TRUE;
			}
		}break;
	default:
		{
			ASSERT(FALSE);
		}break;
	}
	
	return TRUE;
}

//隐含命令,获取日志功能状态,0为关闭,1为开启
int CDevBas::mfGetHidePro(MCGS_DATA& data, CString& strCmd)
{	
	CString strIndex = _T(""), strValue = _T("");
	CString strDivision = _T(",");
	if (!CDevServer::SvrGetCmdStr(strCmd, strDivision, strIndex, strValue))
	{
		return FALSE;
	}
	
	float fIndex = 0, fValue = 0;
	CDevServer::SvrGetParaValue(strIndex, fIndex);
	int nIndex = (int)fIndex;
	switch(nIndex) 
	{
	case 1:		//获得日志开关信息
		{		
			((DEV_DATA*)data.m_pDevData)->bLog ? fValue = 1 : fValue = 0;
			
		}break;
	default:
		{	
			ASSERT(FALSE);
		}break;
	}	
	CDevServer::SvrSetParaValue(strValue,fValue);
	
	return TRUE;
}

⌨️ 快捷键说明

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