#include "stdafx.h" #include "SnmpProcess.h" #include "Global.h" #include "struct.h" #include "NoticeQueue.h" HANDLE g_SnmpRequestThread = NULL; DWORD g_dwSnmpVariantTick = 0; CRITICAL_SECTION g_csSnmpReadOneData; int SnmpCommandSend(); int SnmpResponseValue(); BOOL LoadSnmpDll(CString strpath) { g_hSnmpLibModule = NULL; CHAR strFile[MAX_LIST_LENGTH + 1] = ""; wsprintf(strFile, "%s\\Dll\\Snmp.dll", strpath); InitializeCriticalSection( &g_csSnmpReadOneData ); g_hSnmpLibModule = AfxLoadLibrary(strFile); if (NULL != g_hSnmpLibModule) { pSnmpDllGetValue = (SNMP_DLL_GetVale)::GetProcAddress(g_hSnmpLibModule, "SNMP_DLL_GetVale"); pSnmpDllSetValue = (SNMP_DLL_SetValue)::GetProcAddress(g_hSnmpLibModule, "SNMP_DLL_SetValue"); } return TRUE; } void UnInitSnmpDll() { DeleteCriticalSection( &g_csSnmpReadOneData ); if( NULL != g_hSnmpLibModule ) { AfxFreeLibrary( g_hSnmpLibModule ); g_hSnmpLibModule = NULL; } } int ParseSnmpData(char *pDevUid, int nVarID, char *pMsg) { int nDeviceIndex = -1, nVarIndex = -1; BOOL bFind = FindVar(pDevUid, nVarID, nDeviceIndex, nVarIndex); if( bFind == FALSE ) return -1; CDevice *pDev = g_pDevicesManager->m_Devices[nDeviceIndex]; CBaseVar *pBaseVar = pDev->m_Vars[nVarIndex]; EnterCriticalSection(&g_csSnmpReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csSnmpReadOneData); DWORD nValue = 0; double fCoef = pBaseVar->m_dbCoefficient; int nDataLen = pBaseVar->m_iDataLen; int nVarItemID = pBaseVar->m_nVarItemID; if( nVarItemID > 0 )//BIT位变量 { int nStartBit = pBaseVar->m_nStartBit; int nEndBit = pBaseVar->m_nEndBit; int nStartReg, nEndReg; if( nEndBit - nStartBit < 7 ) // 一般告警状态会这样子定义,Snmp码暂时没有碰到,没有经过调试,待测试 { if( nDataLen == 1 ) { char chBuffer[8] = {0}; memset(chBuffer, 0, sizeof(chBuffer)); nValue = atoi(pMsg); itoa(nValue, chBuffer, 2); CString strTemp; switch( nEndBit - nStartBit ) { case 0: strTemp.Format("%c", chBuffer[nStartBit]); break; case 1: strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]); break; case 2: strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]); break; case 3: strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit +3]); break; case 4: strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]); break; case 5: strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]); break; case 6: strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]); break; } nValue = atoi(strTemp); //strTemp.Format("%d", } else if( nDataLen == 2 ) { char chBuffer[16] = {0}; memset(chBuffer, 0, sizeof(chBuffer)); nValue = atoi(pMsg); itoa(nValue, chBuffer, 2); CString strTemp; switch( nEndBit - nStartBit ) { case 0: strTemp.Format("%c", chBuffer[nStartBit]); break; case 1: strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]); break; case 2: strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]); break; case 3: strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit +3]); break; case 4: strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]); break; case 5: strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]); break; case 6: strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]); break; } nValue = atoi(strTemp); } //itoa(ntohs(g_vtMGEEquipData[nEquipIndex].MGEStatus.Status1), buffer, 16); } // 特殊变量处理(例如,一个命令返回两个变量的情况) else if( nEndBit - nStartBit == 7 ) // 1个字节的情况 { nStartReg = (int)nStartBit / 8; nEndReg = (int)(nEndBit + 1) / 8; nValue = (pMsg[nStartReg] << 4) | ( pMsg[nStartReg + 1] & 0x00FF ); } else if( nEndBit - nStartBit == 15 ) // 2个字节的情况 { nStartReg = (int)nStartBit / 8; nEndReg = (int)(nEndBit + 1) / 8; nValue = ( ( (pMsg[nStartReg] << 4) | ( pMsg[nStartReg + 1] & 0x00FF ) ) << 8 ) | ( ( (pMsg[nStartReg + 2] << 4) | ( pMsg[nStartReg + 3] & 0x00FF ) ) & 0x0000FFFF ); } EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = (double)(nValue * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSnmpReadOneData ); //TRACE2("变量ID%d, 值=%d\r\n", iVarID, nValue); } else { // 联合类型变量,SNMP协议不做特殊处理 if( pBaseVar->m_nVarTypeID >= UNION_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= UNION_TYPE_MAX_ID ) { } else if( pBaseVar->m_nVarTypeID == TIME_TYPE_ID ) // 时间类型(例如 01:30:10.00 ) { CString strTime = pMsg, strTmp; int nFindIndex = strTime.Find(":"); int nHour = 0, nMinute = 0, nSecond = 0; if( nFindIndex != -1 ) // 读取小时 { strTmp = strTime.Mid(0, nFindIndex); nHour = atoi(strTmp); strTime = strTime.Mid(nFindIndex + 1, strTime.GetLength() - nFindIndex); nFindIndex = strTime.Find(":"); if( nFindIndex != -1 ) // 读取分钟 { strTmp = strTime.Mid(0, nFindIndex); nMinute = atoi(strTmp); strTime = strTime.Mid(nFindIndex + 1, strTime.GetLength() - nFindIndex); } } nValue = nHour * 60 + nMinute; EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = (double)(nValue * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSnmpReadOneData ); } else if( SNMP_STRING_ID == pBaseVar->m_nVarTypeID ) { CString strMsg = CString(pMsg); strMsg.MakeLower(); if( 0 == strMsg.Compare("on") ) { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = 1; LeaveCriticalSection( &g_csSnmpReadOneData ); } else if( 0 == strMsg.Compare("off") ) { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = 0; LeaveCriticalSection( &g_csSnmpReadOneData ); } //LOG4C((LOG_NOTICE, "%s, value = %d", pBaseVar->m_strDesc, (int)pBaseVar->m_dbData)); } else if( SNMP_NPM_TYPE == pBaseVar->m_nVarTypeID ) { CString strTemp = CString(pMsg); //LOG4C((LOG_NOTICE, "value = %s", strTemp)); strTemp = strTemp.Mid(51); strTemp.MakeLower(); //LOG4C((LOG_NOTICE, "value = %s", strTemp)); if( strTemp.Find("yes") != -1 ) { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = 1; LeaveCriticalSection( &g_csSnmpReadOneData ); } else if( strTemp.Find("no") != -1 ) { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = 0; LeaveCriticalSection( &g_csSnmpReadOneData ); } else { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = atof(strTemp); LeaveCriticalSection( &g_csSnmpReadOneData ); } CString strValue; strValue.Format("%.1f", pBaseVar->m_dbData); //LOG4C((LOG_NOTICE, "%s, value = %s", pBaseVar->m_strDesc, strValue)); } else { EnterCriticalSection( &g_csSnmpReadOneData ); pBaseVar->m_dbData = (double)(atof(pMsg) * fCoef); if( pBaseVar->m_nRearm != 0 ) { pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm; } LeaveCriticalSection( &g_csSnmpReadOneData ); } } EnterCriticalSection(&g_csSnmpReadOneData); pDev->m_dwOnlineTick = GetTickCount(); LeaveCriticalSection(&g_csSnmpReadOneData); return 0; }