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 + -
显示快捷键?