SnmpProcess.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. #include "stdafx.h"
  2. #include "SnmpProcess.h"
  3. #include "Global.h"
  4. #include "struct.h"
  5. #include "NoticeQueue.h"
  6. HANDLE g_SnmpRequestThread = NULL;
  7. DWORD g_dwSnmpVariantTick = 0;
  8. CRITICAL_SECTION g_csSnmpReadOneData;
  9. int SnmpCommandSend();
  10. int SnmpResponseValue();
  11. BOOL LoadSnmpDll(CString strpath)
  12. {
  13. g_hSnmpLibModule = NULL;
  14. CHAR strFile[MAX_LIST_LENGTH + 1] = "";
  15. wsprintf(strFile, "%s\\Dll\\Snmp.dll", strpath);
  16. InitializeCriticalSection( &g_csSnmpReadOneData );
  17. g_hSnmpLibModule = AfxLoadLibrary(strFile);
  18. if (NULL != g_hSnmpLibModule)
  19. {
  20. pSnmpDllGetValue = (SNMP_DLL_GetVale)::GetProcAddress(g_hSnmpLibModule, "SNMP_DLL_GetVale");
  21. pSnmpDllSetValue = (SNMP_DLL_SetValue)::GetProcAddress(g_hSnmpLibModule, "SNMP_DLL_SetValue");
  22. }
  23. return TRUE;
  24. }
  25. void UnInitSnmpDll()
  26. {
  27. DeleteCriticalSection( &g_csSnmpReadOneData );
  28. if( NULL != g_hSnmpLibModule )
  29. {
  30. AfxFreeLibrary( g_hSnmpLibModule );
  31. g_hSnmpLibModule = NULL;
  32. }
  33. }
  34. int ParseSnmpData(char *pDevUid, int nVarID, char *pMsg)
  35. {
  36. int nDeviceIndex = -1, nVarIndex = -1;
  37. BOOL bFind = FindVar(pDevUid, nVarID, nDeviceIndex, nVarIndex);
  38. if( bFind == FALSE ) return -1;
  39. CDevice *pDev = g_pDevicesManager->m_Devices[nDeviceIndex];
  40. CBaseVar *pBaseVar = pDev->m_Vars[nVarIndex];
  41. EnterCriticalSection(&g_csSnmpReadOneData);
  42. pDev->m_dwOnlineTick = GetTickCount();
  43. LeaveCriticalSection(&g_csSnmpReadOneData);
  44. DWORD nValue = 0;
  45. double fCoef = pBaseVar->m_dbCoefficient;
  46. int nDataLen = pBaseVar->m_iDataLen;
  47. int nVarItemID = pBaseVar->m_nVarItemID;
  48. if( nVarItemID > 0 )//BIT位变量
  49. {
  50. int nStartBit = pBaseVar->m_nStartBit;
  51. int nEndBit = pBaseVar->m_nEndBit;
  52. int nStartReg, nEndReg;
  53. if( nEndBit - nStartBit < 7 ) // 一般告警状态会这样子定义,Snmp码暂时没有碰到,没有经过调试,待测试
  54. {
  55. if( nDataLen == 1 )
  56. {
  57. char chBuffer[8] = {0};
  58. memset(chBuffer, 0, sizeof(chBuffer));
  59. nValue = atoi(pMsg);
  60. itoa(nValue, chBuffer, 2);
  61. CString strTemp;
  62. switch( nEndBit - nStartBit )
  63. {
  64. case 0:
  65. strTemp.Format("%c", chBuffer[nStartBit]);
  66. break;
  67. case 1:
  68. strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]);
  69. break;
  70. case 2:
  71. strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]);
  72. break;
  73. case 3:
  74. strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1],
  75. chBuffer[nStartBit + 2], chBuffer[nStartBit +3]);
  76. break;
  77. case 4:
  78. strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1],
  79. chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]);
  80. break;
  81. case 5:
  82. strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2],
  83. chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]);
  84. break;
  85. case 6:
  86. strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2],
  87. chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]);
  88. break;
  89. default:
  90. LOG4C((LOG_NOTICE, "起始位与终止位不对",pDev->m_strDeviceName, pBaseVar->m_strDesc));
  91. }
  92. nValue = atoi(strTemp);
  93. //strTemp.Format("%d",
  94. }
  95. else if( nDataLen == 2 )
  96. {
  97. char chBuffer[16] = {0};
  98. memset(chBuffer, 0, sizeof(chBuffer));
  99. nValue = atoi(pMsg);
  100. itoa(nValue, chBuffer, 2);
  101. CString strTemp;
  102. switch( nEndBit - nStartBit )
  103. {
  104. case 0:
  105. strTemp.Format("%c", chBuffer[nStartBit]);
  106. break;
  107. case 1:
  108. strTemp.Format("%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1]);
  109. break;
  110. case 2:
  111. strTemp.Format("%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2]);
  112. break;
  113. case 3:
  114. strTemp.Format("%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1],
  115. chBuffer[nStartBit + 2], chBuffer[nStartBit +3]);
  116. break;
  117. case 4:
  118. strTemp.Format("%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1],
  119. chBuffer[nStartBit + 2], chBuffer[nStartBit + 3], chBuffer[nStartBit + 4]);
  120. break;
  121. case 5:
  122. strTemp.Format("%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2],
  123. chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5]);
  124. break;
  125. case 6:
  126. strTemp.Format("%c%c%c%c%c%c%c", chBuffer[nStartBit], chBuffer[nStartBit + 1], chBuffer[nStartBit + 2],
  127. chBuffer[nStartBit + 3], chBuffer[nStartBit + 4], chBuffer[nStartBit + 5], chBuffer[nStartBit + 6]);
  128. break;
  129. default:
  130. LOG4C((LOG_NOTICE, "起始位与终止位不对",pDev->m_strDeviceName, pBaseVar->m_strDesc));
  131. }
  132. nValue = atoi(strTemp);
  133. }
  134. //itoa(ntohs(g_vtMGEEquipData[nEquipIndex].MGEStatus.Status1), buffer, 16);
  135. }
  136. // 特殊变量处理(例如,一个命令返回两个变量的情况)
  137. else if( nEndBit - nStartBit == 7 ) // 1个字节的情况
  138. {
  139. nStartReg = (int)nStartBit / 8;
  140. nEndReg = (int)(nEndBit + 1) / 8;
  141. nValue = (pMsg[nStartReg] << 4) | ( pMsg[nStartReg + 1] & 0x00FF );
  142. }
  143. else if( nEndBit - nStartBit == 15 ) // 2个字节的情况
  144. {
  145. nStartReg = (int)nStartBit / 8;
  146. nEndReg = (int)(nEndBit + 1) / 8;
  147. nValue = ( ( (pMsg[nStartReg] << 4) | ( pMsg[nStartReg + 1] & 0x00FF ) ) << 8 ) |
  148. ( ( (pMsg[nStartReg + 2] << 4) | ( pMsg[nStartReg + 3] & 0x00FF ) ) & 0x0000FFFF );
  149. }
  150. EnterCriticalSection( &g_csSnmpReadOneData );
  151. pBaseVar->m_dbData = (double)(nValue * fCoef);
  152. if( pBaseVar->m_nRearm != 0 )
  153. {
  154. pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm;
  155. }
  156. LeaveCriticalSection( &g_csSnmpReadOneData );
  157. //TRACE2("变量ID%d, 值=%d\r\n", iVarID, nValue);
  158. }
  159. else
  160. {
  161. // 联合类型变量,SNMP协议不做特殊处理
  162. if( pBaseVar->m_nVarTypeID >= UNION_TYPE_MIN_ID && pBaseVar->m_nVarTypeID <= UNION_TYPE_MAX_ID )
  163. {
  164. }
  165. else if( pBaseVar->m_nVarTypeID == TIME_TYPE_ID ) // 时间类型(例如 01:30:10.00 )
  166. {
  167. CString strTime = pMsg, strTmp;
  168. int nFindIndex = strTime.Find(":");
  169. int nHour = 0, nMinute = 0, nSecond = 0;
  170. if( nFindIndex != -1 ) // 读取小时
  171. {
  172. strTmp = strTime.Mid(0, nFindIndex);
  173. nHour = atoi(strTmp);
  174. strTime = strTime.Mid(nFindIndex + 1, strTime.GetLength() - nFindIndex);
  175. nFindIndex = strTime.Find(":");
  176. if( nFindIndex != -1 ) // 读取分钟
  177. {
  178. strTmp = strTime.Mid(0, nFindIndex);
  179. nMinute = atoi(strTmp);
  180. strTime = strTime.Mid(nFindIndex + 1, strTime.GetLength() - nFindIndex);
  181. }
  182. }
  183. nValue = nHour * 60 + nMinute;
  184. EnterCriticalSection( &g_csSnmpReadOneData );
  185. pBaseVar->m_dbData = (double)(nValue * fCoef);
  186. if( pBaseVar->m_nRearm != 0 )
  187. {
  188. pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm;
  189. }
  190. LeaveCriticalSection( &g_csSnmpReadOneData );
  191. }
  192. else if( SNMP_STRING_ID == pBaseVar->m_nVarTypeID )
  193. {
  194. CString strMsg = CString(pMsg);
  195. strMsg.MakeLower();
  196. if( 0 == strMsg.Compare("on") )
  197. {
  198. EnterCriticalSection( &g_csSnmpReadOneData );
  199. pBaseVar->m_dbData = 1;
  200. LeaveCriticalSection( &g_csSnmpReadOneData );
  201. }
  202. else if( 0 == strMsg.Compare("off") )
  203. {
  204. EnterCriticalSection( &g_csSnmpReadOneData );
  205. pBaseVar->m_dbData = 0;
  206. LeaveCriticalSection( &g_csSnmpReadOneData );
  207. }
  208. //LOG4C((LOG_NOTICE, "%s, value = %d", pBaseVar->m_strDesc, (int)pBaseVar->m_dbData));
  209. }
  210. else if( SNMP_NPM_TYPE == pBaseVar->m_nVarTypeID )
  211. {
  212. CString strTemp = CString(pMsg);
  213. //LOG4C((LOG_NOTICE, "value = %s", strTemp));
  214. strTemp = strTemp.Mid(51);
  215. strTemp.MakeLower();
  216. //LOG4C((LOG_NOTICE, "value = %s", strTemp));
  217. if( strTemp.Find("yes") != -1 )
  218. {
  219. EnterCriticalSection( &g_csSnmpReadOneData );
  220. pBaseVar->m_dbData = 1;
  221. LeaveCriticalSection( &g_csSnmpReadOneData );
  222. }
  223. else if( strTemp.Find("no") != -1 )
  224. {
  225. EnterCriticalSection( &g_csSnmpReadOneData );
  226. pBaseVar->m_dbData = 0;
  227. LeaveCriticalSection( &g_csSnmpReadOneData );
  228. }
  229. else
  230. {
  231. EnterCriticalSection( &g_csSnmpReadOneData );
  232. pBaseVar->m_dbData = atof(strTemp);
  233. LeaveCriticalSection( &g_csSnmpReadOneData );
  234. }
  235. CString strValue;
  236. strValue.Format("%.1f", pBaseVar->m_dbData);
  237. //LOG4C((LOG_NOTICE, "%s, value = %s", pBaseVar->m_strDesc, strValue));
  238. }
  239. else
  240. {
  241. EnterCriticalSection( &g_csSnmpReadOneData );
  242. pBaseVar->m_dbData = (double)(atof(pMsg) * fCoef);
  243. if( pBaseVar->m_nRearm != 0 )
  244. {
  245. pBaseVar->m_dbData = pBaseVar->m_dbData + pBaseVar->m_nRearm;
  246. }
  247. LeaveCriticalSection( &g_csSnmpReadOneData );
  248. }
  249. }
  250. EnterCriticalSection(&g_csSnmpReadOneData);
  251. pDev->m_dwOnlineTick = GetTickCount();
  252. LeaveCriticalSection(&g_csSnmpReadOneData);
  253. return 0;
  254. }