浏览代码

1、增加SNMP TRAP陷阱功能,包括传感器及电源超限报警;
2、修改SNMP 配置无效错误

liyuezong 2 年之前
父节点
当前提交
e117649c7c
共有 5 个文件被更改,包括 151 次插入 和 87 次删除
  1. 36 6
      pro/src/app.c
  2. 36 26
      pro/src/appweb_handle.c
  3. 36 46
      pro/src/pduMIB_trap.c
  4. 8 2
      pro/src/pduMIB_trap.h
  5. 35 7
      pro/src/sqlite_handle.c

+ 36 - 6
pro/src/app.c

@@ -27,7 +27,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
-
+#include "pduMIB_trap.h"
 
 static void get_time(char *ts)
 {
@@ -1227,7 +1227,22 @@ void AlarmCtrlChn(int nChID, int nCtrl)
             }
 
             sprintf(buff, "Over limit protection |$关闭$|$通道$|%d", _globalPowerMangerTemp->product_ch_id);
-            dev_insert_alarm_ctrl(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, ALARM_TYPE_SENSOR, buff);
+            int nAlarmID=dev_insert_alarm_ctrl(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, ALARM_TYPE_SENSOR, buff);
+
+            struct tm *t;
+            time_t now;
+            time(&now);
+            t = localtime(&now);
+            char buffer[80];
+            strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
+            AlarmTrapinfo pAlarmTrapinfo; ////Trap information
+            pAlarmTrapinfo.ID = _globalPowerMangerTemp->product_ch_id;
+            pAlarmTrapinfo.Alarmid = nAlarmID;
+            strcpy(pAlarmTrapinfo.AlarmContext, buff);
+            strcpy(pAlarmTrapinfo.AlarmDate, buffer);
+            if (_globalSNMPManager.trapmode == 1)
+                send_pduSensorAlarm_trap(1, (void *)&pAlarmTrapinfo);
+
             break;
         }
     }
@@ -1250,7 +1265,21 @@ void AlarmCtrlAll(int nCtrl)
             if(rec<0)log_i("Close All address:%d rec:%d:%s",nSendAddr,rec,modbus_strerror(errno));
         }      
         sprintf(buff,"Over limit protection |$关闭$|$所有$|$通道$");
-        dev_insert_alarm_ctrl(__globalDeviceManage.db,_globalPowerMangerTemp->product_id,ALARM_TYPE_SENSOR,buff);
+        int nAlarmID=dev_insert_alarm_ctrl(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, ALARM_TYPE_SENSOR, buff);
+
+        struct tm *t;
+        time_t now;
+        time(&now);
+        t = localtime(&now);
+        char buffer[80];
+        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
+        AlarmTrapinfo pAlarmTrapinfo; ////Trap information
+        pAlarmTrapinfo.ID = _globalPowerMangerTemp->product_ch_id;
+        pAlarmTrapinfo.Alarmid = nAlarmID;
+        strcpy(pAlarmTrapinfo.AlarmContext, buff);
+        strcpy(pAlarmTrapinfo.AlarmDate, buffer);
+        if (_globalSNMPManager.trapmode == 1)
+            send_pduSensorAlarm_trap(1, (void *)&pAlarmTrapinfo);
 }
 /**
  * @brief 传感器报警函数
@@ -1882,6 +1911,8 @@ void* snmp_thread(void *arg)
     
     /* pduMIB will be used to read pduMIB.conf files. */
     init_snmp(path);
+    init_snmp_alarm();
+	
     int reconfig=0;
     while(h->quit==0) {
         if (reconfig) {  
@@ -2067,8 +2098,6 @@ int app_init(void)
     }
     log_i("get all chn data ok.\n");
 
-    
-
     // 初始化modbus,搜寻子设备
     ret = g_modbus_init(&_globalDeviceManager->_globalRelaySampManger,
                         INTERL_MODBUS_PORT,
@@ -2195,10 +2224,11 @@ int app_init(void)
     thread_start(THREAD_ID_NTP, NULL);
     dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "NTP");
 
+    //初始化snmp
+     dev_get_snmp_info(_globalDeviceManager->db, &_globalSNMPManager);
 #ifndef USE_NETSWITCH
     thread_start(THREAD_ID_SNMP, _globalDeviceManager);
 #endif
-
     dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "SNMP");
 
     cascade_init();

+ 36 - 26
pro/src/appweb_handle.c

@@ -3926,42 +3926,52 @@ static void serviceManagement(void *conn)
         
         crypt_t *pc=&_globalSNMPManager.crypt;
         _SNMP_ServerRequestInfo *info=&_serviceManageRequestInfo._snmp_info;
-        
-        if(info->user) {
-            len=strlen(info->user);
-            if(len<8 || len>32) {
-                log_e("snmp user length %d is wrong! correct is [8~32]", len);
-                return;
-            }
-            strcpy(pc->user, info->user);
 
-            if(info->auth_alg) {
-                strcpy(pc->auth.alg, info->auth_alg);
+        if (_globalSNMPManager.version == 2)
+        {
+            if (info->user)
+            {
+                len = strlen(info->user);
+                if (len < 8 || len > 32)
+                {
+                    log_e("snmp user length %d is wrong! correct is [8~32]", len);
+                    return;
+                }
+                strcpy(pc->user, info->user);
+
+                if (info->auth_alg)
+                {
+                    strcpy(pc->auth.alg, info->auth_alg);
 
-                if(strlen(info->auth_alg)>1 && info->auth_passwd) {
-                    len=strlen(info->auth_passwd);
-                    if(len<8 || len>32) {
-                        log_e("snmp auth passwd length %d is wrong! correct is [8~32]", len);
-                        return;
+                    if (strlen(info->auth_alg) > 1 && info->auth_passwd)
+                    {
+                        len = strlen(info->auth_passwd);
+                        if (len < 8 || len > 32)
+                        {
+                            log_e("snmp auth passwd length %d is wrong! correct is [8~32]", len);
+                            return;
+                        }
+                        strcpy(pc->auth.passwd, info->auth_passwd);
                     }
-                    strcpy(pc->auth.passwd, info->auth_passwd);
                 }
-            }
 
-            if(info->priv_alg) {
-                strcpy(pc->priv.alg, info->priv_alg);
+                if (info->priv_alg)
+                {
+                    strcpy(pc->priv.alg, info->priv_alg);
 
-                if(strlen(info->priv_alg)>1 && info->priv_passwd) {
-                    len=strlen(info->priv_passwd);
-                    if(len<8 || len>32) {
-                        log_e("snmp priv passwd length %d is wrong! correct is [8~32]", len);
-                        return;
+                    if (strlen(info->priv_alg) > 1 && info->priv_passwd)
+                    {
+                        len = strlen(info->priv_passwd);
+                        if (len < 8 || len > 32)
+                        {
+                            log_e("snmp priv passwd length %d is wrong! correct is [8~32]", len);
+                            return;
+                        }
+                        strcpy(pc->priv.passwd, info->priv_passwd);
                     }
-                    strcpy(pc->priv.passwd, info->priv_passwd);
                 }
             }
         }
-
         _globalSNMPManager.product_id = __globalDeviceManage._globalDevInfo.product.id;
         if (dev_update_snmp_info(__globalDeviceManage.db,_globalSNMPManager.product_id,&_globalSNMPManager) != 0)
         {

+ 36 - 46
pro/src/pduMIB_trap.c

@@ -8,62 +8,42 @@
 #include <net-snmp/agent/net-snmp-agent-includes.h>
 #include "pduMIB_trap.h"
 
-extern const oid snmptrap_oid[];
-extern const size_t snmptrap_oid_len;
+const oid snmptrap_oid[] = {1,3,6,1,6,3,1,1,4,1,0};
+const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
 
-int
-send_pduAlarmAdded_trap( void )
+void
+send_pduPowerAlarm_trap(unsigned int TrapNum,void *Data)
 {
+    AlarmTrapinfo GlobalAlarmTrapinfo = *(AlarmTrapinfo*)Data;
     netsnmp_variable_list  *var_list = NULL;
-    const oid pduAlarmAdded_oid[] = { 1,3,6,1,4,1,2024,2,1 };
-    const oid pduAlarmType_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2, /* insert index here */ };
-    const oid pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3, /* insert index here */ };
-    const oid pduAlarmAction_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,4, /* insert index here */ };
-    const oid pduAlarmActionPara_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,5, /* insert index here */ };
-    const oid pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6, /* insert index here */ };
-    const oid pduAlarmTime_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,7, /* insert index here */ };
+    const oid pduPowerAlarmTraps_oid[] = { 1,3,6,1,4,1,2024,2,1 };
+    const oid pduAlarmID_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2,GlobalAlarmTrapinfo.ID };
+    const oid pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3, GlobalAlarmTrapinfo.ID};
+    const oid pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6, GlobalAlarmTrapinfo.ID };
 
     /*
      * Set the snmpTrapOid.0 value
      */
     snmp_varlist_add_variable(&var_list,
-        snmptrap_oid, snmptrap_oid_len,
+        snmptrap_oid,OID_LENGTH(snmptrap_oid) ,
         ASN_OBJECT_ID,
-        pduAlarmAdded_oid, sizeof(pduAlarmAdded_oid));
+        pduPowerAlarmTraps_oid, sizeof(pduPowerAlarmTraps_oid));
     
     /*
      * Add any objects from the trap definition
      */
     snmp_varlist_add_variable(&var_list,
-        pduAlarmType_oid, OID_LENGTH(pduAlarmType_oid),
+        pduAlarmID_oid, OID_LENGTH(pduAlarmID_oid),
         ASN_INTEGER,
-        /* Set an appropriate value for pduAlarmType */
-        NULL, 0);
+        &GlobalAlarmTrapinfo.Alarmid, sizeof(GlobalAlarmTrapinfo.Alarmid));
     snmp_varlist_add_variable(&var_list,
         pduAlarmContext_oid, OID_LENGTH(pduAlarmContext_oid),
         ASN_OCTET_STR,
-        /* Set an appropriate value for pduAlarmContext */
-        NULL, 0);
-    snmp_varlist_add_variable(&var_list,
-        pduAlarmAction_oid, OID_LENGTH(pduAlarmAction_oid),
-        ASN_INTEGER,
-        /* Set an appropriate value for pduAlarmAction */
-        NULL, 0);
-    snmp_varlist_add_variable(&var_list,
-        pduAlarmActionPara_oid, OID_LENGTH(pduAlarmActionPara_oid),
-        ASN_INTEGER,
-        /* Set an appropriate value for pduAlarmActionPara */
-        NULL, 0);
+        GlobalAlarmTrapinfo.AlarmContext, strlen(GlobalAlarmTrapinfo.AlarmContext));
     snmp_varlist_add_variable(&var_list,
         pduAlarmDate_oid, OID_LENGTH(pduAlarmDate_oid),
         ASN_OCTET_STR,
-        /* Set an appropriate value for pduAlarmDate */
-        NULL, 0);
-    snmp_varlist_add_variable(&var_list,
-        pduAlarmTime_oid, OID_LENGTH(pduAlarmTime_oid),
-        ASN_OCTET_STR,
-        /* Set an appropriate value for pduAlarmTime */
-        NULL, 0);
+        GlobalAlarmTrapinfo.AlarmDate, strlen(GlobalAlarmTrapinfo.AlarmDate));
 
     /*
      * Add any extra (optional) objects here
@@ -76,31 +56,41 @@ send_pduAlarmAdded_trap( void )
     send_v2trap( var_list );
     snmp_free_varbind( var_list );
 
-    return SNMP_ERR_NOERROR;
+   // return SNMP_ERR_NOERROR;
 }
-int
-send_pduAlarmRemoved_trap( void )
+void
+send_pduSensorAlarm_trap( unsigned int TrapNum,void *Data)
 {
+    AlarmTrapinfo GlobalAlarmTrapinfo = *(AlarmTrapinfo*)Data;
     netsnmp_variable_list  *var_list = NULL;
-    const oid pduAlarmRemoved_oid[] = { 1,3,6,1,4,1,2024,2,2 };
-    const oid pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3, /* insert index here */ };
+    const oid pduSensorAlarmTraps_oid[] = { 1,3,6,1,4,1,2024,2,2 };
+    const oid pduAlarmID_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2, GlobalAlarmTrapinfo.ID };
+    const oid pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3, GlobalAlarmTrapinfo.ID};
+    const oid pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6,GlobalAlarmTrapinfo.ID };
 
     /*
      * Set the snmpTrapOid.0 value
      */
     snmp_varlist_add_variable(&var_list,
-        snmptrap_oid, snmptrap_oid_len,
+        snmptrap_oid, OID_LENGTH(snmptrap_oid),
         ASN_OBJECT_ID,
-        pduAlarmRemoved_oid, sizeof(pduAlarmRemoved_oid));
+        pduSensorAlarmTraps_oid, sizeof(pduSensorAlarmTraps_oid));
     
     /*
      * Add any objects from the trap definition
      */
+    snmp_varlist_add_variable(&var_list,
+        pduAlarmID_oid, OID_LENGTH(pduAlarmID_oid),
+        ASN_INTEGER,
+        &GlobalAlarmTrapinfo.Alarmid, sizeof(GlobalAlarmTrapinfo.Alarmid));
     snmp_varlist_add_variable(&var_list,
         pduAlarmContext_oid, OID_LENGTH(pduAlarmContext_oid),
         ASN_OCTET_STR,
-        /* Set an appropriate value for pduAlarmContext */
-        NULL, 0);
+         GlobalAlarmTrapinfo.AlarmContext, strlen(GlobalAlarmTrapinfo.AlarmContext));
+    snmp_varlist_add_variable(&var_list,
+        pduAlarmDate_oid, OID_LENGTH(pduAlarmDate_oid),
+        ASN_OCTET_STR,
+         GlobalAlarmTrapinfo.AlarmDate, strlen( GlobalAlarmTrapinfo.AlarmDate));
 
     /*
      * Add any extra (optional) objects here
@@ -113,5 +103,5 @@ send_pduAlarmRemoved_trap( void )
     send_v2trap( var_list );
     snmp_free_varbind( var_list );
 
-    return SNMP_ERR_NOERROR;
-}
+   // return SNMP_ERR_NOERROR;
+}

+ 8 - 2
pro/src/pduMIB_trap.h

@@ -4,9 +4,15 @@
  */
 #ifndef PDUMIB_H
 #define PDUMIB_H
+typedef struct AlarmTrapinfo{
+    uint32_t    Alarmid;
+    uint32_t    ID;
+    char            AlarmContext[256];
+    char            AlarmDate[80];
+}AlarmTrapinfo;
 
 /* function declarations */
-int send_pduAlarmAdded_trap(void);
-int send_pduAlarmRemoved_trap(void);
+void send_pduPowerAlarm_trap( unsigned int TrapNum,void *Data);
+void send_pduSensorAlarm_trap( unsigned int TrapNum,void *Data);
 
 #endif /* PDUMIB_H */

+ 35 - 7
pro/src/sqlite_handle.c

@@ -9,6 +9,7 @@
 #include "mqtt.h"
 #include "sys.h"
 #include "switch_ctrl.h"
+#include "pduMIB_trap.h"
 
 #define	TOTAL_COUNT	60//统计总数
 
@@ -2604,8 +2605,9 @@ int dev_insert_alarm_info(sqlite3* db,int product_id,int alarm_type,time_data_t
     char select_sql[1024] = {0};
     char *table="Table_AlarmManage";
 
+    int alarmNumber=-1;
     if(overwrite_flag) {
-        int alarmNumber=get_key(db, table, "alarmNumber", DB_MAX);
+        alarmNumber=get_key(db, table, "alarmNumber", DB_MAX);
         if(alarmNumber<0) {
             return -1;
         }
@@ -2639,7 +2641,7 @@ int dev_insert_alarm_info(sqlite3* db,int product_id,int alarm_type,time_data_t
 
     //smtp_send();
 
-    return 0;
+    return alarmNumber;
 }
 
 /// @brief 查询电源 传感器以及网络告警信息
@@ -3089,8 +3091,7 @@ int dev_insert_alarm_ctrl(sqlite3* db,int product_id,int nAlarmType,char* alarm_
 
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
-    dev_insert_alarm_info(db,product_id,nAlarmType,buffer,alarm_content);
-    return 0;
+    return dev_insert_alarm_info(db,product_id,nAlarmType,buffer,alarm_content);
 }
 /// @brief 删除分组信息
 int dev_delete__group_info(sqlite3 *db,int product_id)
@@ -3709,7 +3710,7 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
 
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
-    dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
+    int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
     smtp_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
 
@@ -3720,6 +3721,16 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
     para.action = alarm_action;
     para.actionId = -1;
     mqtt_post_alarm(ALARM_TYPE_POWER, 0, AlarmText, &para);
+
+    AlarmTrapinfo pAlarmTrapinfo; ////Trap information
+    pAlarmTrapinfo.ID = __globalPowerTemp->product_ch_id;
+    pAlarmTrapinfo.Alarmid = nAlarmID;
+    strcpy(pAlarmTrapinfo.AlarmContext, AlarmText);
+    strcpy(pAlarmTrapinfo.AlarmDate, buffer);
+    if (_globalSNMPManager.trapmode == 1)
+    send_pduPowerAlarm_trap(1, (void *)&pAlarmTrapinfo);
+    // if(_globalSNMPManager.trapmode==1)snmp_alarm_register(1,SA_REPEAT,send_pduPowerAlarm_trap,(void *)&pAlarmTrapinfo);
+    
     
     /*
     int ret = -1 ;
@@ -3874,7 +3885,7 @@ int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeAC
 
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
-    dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
+    int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
     smtp_post_alarm(ALARM_TYPE_POWER, 1, _AlarmType, AlarmText);
 
@@ -3885,6 +3896,14 @@ int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeAC
     para.actionId = -1;
     mqtt_post_alarm(ALARM_TYPE_POWER, 1, AlarmText, &para);
 
+    AlarmTrapinfo pAlarmTrapinfo; ////Trap information
+    pAlarmTrapinfo.ID = __globalPowerTemp->product_ch_id;
+    pAlarmTrapinfo.Alarmid = nAlarmID;
+    strcpy(pAlarmTrapinfo.AlarmContext, AlarmText);
+    strcpy(pAlarmTrapinfo.AlarmDate, buffer);
+    if (_globalSNMPManager.trapmode == 1)
+    send_pduPowerAlarm_trap(1, (void *)&pAlarmTrapinfo);
+    // if(_globalSNMPManager.trapmode==1)snmp_alarm_register(1,SA_REPEAT,send_pduPowerAlarm_trap,(void *)&pAlarmTrapinfo);
     return 0;
 }
 /**
@@ -3981,7 +4000,7 @@ int dev_sensor_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,Global
 
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
-    dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,1,buffer,AlarmText);
+    int nAlarmID=dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,1,buffer,AlarmText);
 
     int subtype=__globalPowerTemp->sensor_type;
     smtp_post_alarm(ALARM_TYPE_SENSOR, subtype, _AlarmType, AlarmText);
@@ -3993,6 +4012,15 @@ int dev_sensor_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,Global
     para.actionId = -1;
     mqtt_post_alarm(ALARM_TYPE_POWER, subtype, AlarmText, &para);
 
+    AlarmTrapinfo pAlarmTrapinfo; ////Trap information
+    pAlarmTrapinfo.ID = __globalPowerTemp->sensor_id;
+    pAlarmTrapinfo.Alarmid = nAlarmID;
+    strcpy(pAlarmTrapinfo.AlarmContext, AlarmText);
+    strcpy(pAlarmTrapinfo.AlarmDate, buffer);
+    if (_globalSNMPManager.trapmode == 1)
+        send_pduSensorAlarm_trap(1, (void *)&pAlarmTrapinfo);
+    // if(_globalSNMPManager.trapmode==1)snmp_alarm_register(1,SA_REPEAT,send_pduSensorAlarm_trap,(void *)&pAlarmTrapinfo);
+
     return 0;
 }
 int dev_Alarm_Run_message(GlobalDeviceManager* globalDeviceManger, const char* strRunMSG, const char *strOther)