123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- #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;
- default:
- LOG4C((LOG_NOTICE, "起始位与终止位不对",pDev->m_strDeviceName, pBaseVar->m_strDesc));
- }
- 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;
- default:
- LOG4C((LOG_NOTICE, "起始位与终止位不对",pDev->m_strDeviceName, pBaseVar->m_strDesc));
- }
- 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;
- }
|