Преглед изворни кода

IP表程序,修改snmp 修改北向对齐,修改ntp内存泄漏

liyi пре 1 година
родитељ
комит
d4235b4949

+ 8 - 8
ip/CMakeLists.txt

@@ -11,8 +11,8 @@ set(CMAKE_SYSTEM_PROCESSOR arm)
 project (pdu_ctrl_app)
 
 add_definitions(-DSHELL_CFG_USER="shell_cfg_user.h")
-#set(STAGING_DIR "/home/liyi/tina/out/t113-bingpi_m2/staging_dir")
-#set(COMPILING_DIR "/home/liyi/tina/out/t113-bingpi_m2/compile_dir")
+set(STAGING_DIR "/home/liyi/tina/out/t113-bingpi_m2/staging_dir")
+set(COMPILING_DIR "/home/liyi/tina/out/t113-bingpi_m2/compile_dir")
 
 
 include_directories (${PROJECT_SOURCE_DIR}/modbus/inc 
@@ -22,7 +22,7 @@ include_directories (${PROJECT_SOURCE_DIR}/modbus/inc
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/os/inc)
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/inc)
 include_directories (${PROJECT_SOURCE_DIR}/easylogger/plugins/file)
-include_directories ($ENV{STAGING_DIR}/target/usr/include)
+include_directories (${STAGING_DIR}/target/usr/include)
 
 include_directories (${PROJECT_SOURCE_DIR}/letter/src)
 include_directories (${PROJECT_SOURCE_DIR}/letter/os)
@@ -39,11 +39,11 @@ link_directories(${PROJECT_SOURCE_DIR}/appweb/lib)
 link_directories(${PROJECT_SOURCE_DIR}/snmp/lib)
 #link_directories(${PROJECT_SOURCE_DIR}/sqlite/lib)
 link_directories(${PROJECT_SOURCE_DIR}/modbus/lib)
-link_directories($ENV{STAGING_DIR}/target/usr/lib)
-link_directories($ENV{STAGING_DIR}/target/lib)
-link_directories($ENV{COMPILING_DIR}/target/lib)
-link_directories($ENV{COMPILING_DIR}/target/usr/lib)
-link_directories($ENV{COMPILING_DIR}/target/usr/lib/arm-qt/lib)
+link_directories(${STAGING_DIR}/target/usr/lib)
+link_directories(${STAGING_DIR}/target/lib)
+link_directories(${COMPILING_DIR}/target/lib)
+link_directories(${COMPILING_DIR}/target/usr/lib)
+link_directories(${COMPILING_DIR}/target/usr/lib/arm-qt/lib)
 add_definitions("-Wall -g")
 
 set(PDU_SRC_LIST

+ 1 - 0
ip/modbus/modbus-tcp.c

@@ -341,6 +341,7 @@ static int _modbus_tcp_connect(modbus_t *ctx)
     addr.sin_family = AF_INET;
     addr.sin_port = htons(ctx_tcp->port);
     addr.sin_addr.s_addr = inet_addr(ctx_tcp->ip);
+    // addr.sin_addr.s_addr = INADDR_ANY;
     rc = _connect(ctx->s, (struct sockaddr *)&addr, sizeof(addr), &ctx->response_timeout);
     if (rc == -1) {
         close(ctx->s);

+ 108 - 26
ip/src/app.c

@@ -161,10 +161,11 @@ void* power_thread(void* arg)
         _globalDeviceManager->mmp->data[0].saddr = 0;
         _globalDeviceManager->mmp->data[0].temprature = _globalDeviceManager->g_modebus_read.temprature *100;
         _globalDeviceManager->mmp->data[0].humidity = _globalDeviceManager->g_modebus_read.humidity *100;
-
-        dev_list_t dl;
-        cascade_get_dlist(&dl);
-
+        _globalDeviceManager->mmp->data[0].saddr = _globalDeviceManager->_globalDevInfo._gmodbus_info.product_modbus_addr;
+        //dev_list_t dl;
+       // cascade_get_dlist(&dl);
+       dev_list_t_n dl={0};
+       cascade_get_n_dlist(&dl);
         int flag = 0;
 
 
@@ -207,23 +208,30 @@ void* power_thread(void* arg)
                 GlobalSensorManger* sensor_temp = NULL;
                 //malloc
                 Temp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
+                log_d("malloc Temp=%lx\n",Temp);
                 if(Temp)
                 {
                     memset(Temp, 0, sizeof(GlobalPowerManger));
                     Temp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
+                    log_d("malloc temp->global_over_manager=%lx\n", Temp->global_over_manager);
                     if(Temp->global_over_manager)
                     {
                         memset(Temp->global_over_manager, 0, sizeof(GlobalOverManager));
                         sensor_temp = (GlobalSensorManger *)malloc(sizeof(GlobalSensorManger));
+                        log_d("malloc sensor_temp=%lx\n",sensor_temp);
                         if(sensor_temp)
                         {
                             sensor_temp->over_manager = (GlobalSensorOverManage*)malloc(sizeof(GlobalSensorOverManage));
+                            log_d("malloc sensor_temp->over_manager = %lx\n",sensor_temp->over_manager );
                             memset(sensor_temp->over_manager,0,sizeof(GlobalSensorOverManage));
                             if(sensor_temp->over_manager)
                             {
                                 create_temp_flag = 1;
                             }else
                             {
+                                log_d("free sensor_temp Temp1=%lx\n",sensor_temp);
+                                log_d("free temp->global_over_manager Temp1=%lx\n",Temp->global_over_manager);
+                                log_d("free Temp =%lx\n",Temp);
                                 free(sensor_temp);
                                 sensor_temp = NULL;
                                 free(Temp->global_over_manager);
@@ -234,6 +242,8 @@ void* power_thread(void* arg)
 
                         }else
                         {
+                            log_d("free Temp->global_over_manager=%lx\n",Temp->global_over_manager);
+                            log_d("free Temp2=%lx\n",Temp);
                             free(Temp->global_over_manager);
                             free(Temp);
                             Temp = NULL;
@@ -242,6 +252,7 @@ void* power_thread(void* arg)
                     }else
                     {
                         free(Temp);
+                        log_d("free Temp=%lx\n",Temp);
                     }
                 }
                 
@@ -318,7 +329,12 @@ void* power_thread(void* arg)
                         channel[k] = 1;
                     }else
                     {
+                        log_d("free sensor_temp->over_manager =%lx\n",sensor_temp->over_manager);
+                        log_d("free sensor_temp Temp1=%lx\n",sensor_temp);
+                        log_d("free Temp->global_over_manager =%lx\n",Temp->global_over_manager);
+                        log_d("free Temp =%lx\n",Temp);
                         free(sensor_temp->over_manager);
+                        
                         free(sensor_temp);
                         sensor_temp = NULL;
                         free(Temp->global_over_manager);
@@ -435,6 +451,7 @@ void* power_thread(void* arg)
             if(!flag)
             {
                     //delete sensor
+                uint8_t saddr = 0;
                 pthread_mutex_lock(&__globalDeviceManage._sensor_update);
                 GlobalSensorManger *sensor_temp,*sensor_pos;
                 list_for_each_entry_safe(sensor_temp,sensor_pos,&_globalDeviceManager->_globalSensorManger.list,list)
@@ -443,6 +460,8 @@ void* power_thread(void* arg)
                         continue;
                     if(sensor_temp->product_id == tmp->product_saddr && sensor_temp->sensor_id == tmp->product_saddr)
                     {
+                        log_d("free sensor_temp->over_manager = %lx\n",sensor_temp->over_manager);
+                        log_d("free sensor_temp = %lx\n",sensor_temp);
                         free(sensor_temp->over_manager);
                         list_del(&sensor_temp->list);
                         free(sensor_temp);
@@ -451,11 +470,15 @@ void* power_thread(void* arg)
                     }
                 }
                 pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
+                saddr = tmp->product_saddr ;
                 //delete power_thead
+                log_d("free tmp->global_over_manager = %lx\n",tmp->global_over_manager);
+                log_d("free tmp = %lx\n",tmp);
                 free(tmp->global_over_manager);
                 list_del(&tmp->list);
                 //cnt --;
                 free(tmp);
+                memset(&_globalDeviceManager->mmp->data[saddr],0,sizeof(case_ip_485_data_t));
             }
         }
 
@@ -466,28 +489,28 @@ void* power_thread(void* arg)
         for(int i = 1;i < dl.cnt;i++)
         {
             cascade_request_saddr(&cmd,dl.slave[i].addr,i);
-            usleep(10000);
+            usleep(100000);
         }
         _globalDeviceManager->mmp->dev_chn = dl.cnt;
-        cmd.cmd = CASCADE_CMD_QUERY_CH;
-        cascade_free_dlist(&dl);
+        //cmd.cmd = CASCADE_CMD_QUERY_CH;
+        //cascade_free_dlist(&dl);
 
-        for(int i = 1; i < _globalDeviceManager->mmp->dev_chn;i++)
+        for(int i = 1;i < dl.cnt;i++)
         {
-            int board = _globalDeviceManager->mmp->data[i].saddr;   
+            int board = dl.slave[i].addr;   
             _globalDeviceManager->_all_ctrl_board[board].product_type = 0;
             _globalDeviceManager->_all_ctrl_board[board].product_saddr = _globalDeviceManager->mmp->data[i].saddr;
             _globalDeviceManager->_all_ctrl_board[board].product_number = 1;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->consumption = _globalDeviceManager->mmp->data[i].consumer/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->current     = _globalDeviceManager->mmp->data[i].current/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->factor      = _globalDeviceManager->mmp->data[i].factor/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->freq        = _globalDeviceManager->mmp->data[i].freq/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->voltage     = _globalDeviceManager->mmp->data[i].voltage/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->power       = _globalDeviceManager->mmp->data[i].power/1000.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->status      = _globalDeviceManager->mmp->data[i].status;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->tempratue   = _globalDeviceManager->mmp->data[i].temprature / 100.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->humidity    = _globalDeviceManager->mmp->data[i].humidity /100.0;
-            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->NF_status   = _globalDeviceManager->mmp->data[i].temprature_status;    //todo
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->consumption = _globalDeviceManager->mmp->data[board].consumer/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->current     = _globalDeviceManager->mmp->data[board].current/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->factor      = _globalDeviceManager->mmp->data[board].factor/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->freq        = _globalDeviceManager->mmp->data[board].freq/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->voltage     = _globalDeviceManager->mmp->data[board].voltage/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->power       = _globalDeviceManager->mmp->data[board].power/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->status      = _globalDeviceManager->mmp->data[board].status;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->tempratue   = _globalDeviceManager->mmp->data[board].temprature / 100.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->humidity    = _globalDeviceManager->mmp->data[board].humidity /100.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->NF_status   = _globalDeviceManager->mmp->data[board].temprature_status;    //todo
         }
 
         struct tm *t;
@@ -608,7 +631,16 @@ void* power_thread(void* arg)
                     _globalPowerMangerTemp->global_over_manager->product_vol_upper_threshold)
                 {
                     _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_up = 1;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_v = 1;
+                }else
+                {
+                    _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_up = 0;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_v = 0;
                 }
+            }else
+            {
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_up = 0;
+                _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_v = 0;
             }
             if (_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable)
             {
@@ -616,7 +648,16 @@ void* power_thread(void* arg)
                     _globalPowerMangerTemp->global_over_manager->product_vol_lower_threshold)
                 {
                     _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_down = 1;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_low_v = 1;
+                }else
+                {
+                    _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_down = 0;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_low_v = 0;
                 }
+            }else
+            {
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_down = 0;
+                _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_low_v = 0;
             }
             // current
             if (_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable)
@@ -625,7 +666,16 @@ void* power_thread(void* arg)
                     _globalPowerMangerTemp->global_over_manager->product_cur_upper_threshold)
                 {
                     _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_current = 1;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_i = 1;
+                }else
+                {
+                    _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_current = 0;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_i = 0;
                 }
+            }else
+            {
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_current = 0;
+                _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_i = 0;
             }
             // power
             if (_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable)
@@ -634,7 +684,17 @@ void* power_thread(void* arg)
                     _globalPowerMangerTemp->global_over_manager->product_pwr_upper_threshold)
                 {
                     _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_power = 1;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_p = 1;
+                }else
+                {
+                    _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_power = 0;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_p = 0;
                 }
+            }else
+            {
+
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_power = 0;
+                _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_p = 0;
             }
             // constmer
             if (_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable)
@@ -643,7 +703,16 @@ void* power_thread(void* arg)
                     _globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_threshold)
                 {
                     _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_consumption = 1;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_c = 1;
+                }else
+                {
+                    _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_consumption = 0;
+                    _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_c = 0;
                 }
+            }else
+            {
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_consumption = 0;
+                _globalDeviceManager->mmp->waning[(int)_globalPowerMangerTemp->product_saddr].waning_up_c = 0;
             }
 
             memcpy(&_globalPowerWarningInfo,
@@ -1276,12 +1345,23 @@ static void* ntp_thread(void *arg)
                     if (getCurrentTimeFromNTP(pc, &utc_time) == 0)
                     {
                         time_t host_time = time(NULL);
-                        log_d("host_time: %ld, ntp_time: %ld", host_time, utc_time);
-                        //if(host_time != utc_time) {
+                        //struct tm * _tm = localtime(&utc_time);
+                        //printf("%s",asctime(_tm));
+                        
+                        log_d("host_time: %ld, ntp_time: %ld\n", host_time, utc_time);
+
+                        // printf("%d-%d-%d %d:%d:%d\n",(_tm->tm_year+1900),_tm->tm_mon,_tm->tm_mday,
+                        // _tm->tm_hour,_tm->tm_min,_tm->tm_sec);
+                        // _tm->tm_year += 1900;
+                        // _tm->tm_mon +=1;
+                        if(abs(host_time - utc_time) > 30) {
                             set_utctime(utc_time);
+                            //set_time(_tm,pntp->tzone);
+                            //set_time_zone(_tm,pntp->tzone);
                             //set_utctime_zone(utc_time, pntp->tzone);
                             log_i("setCurrentTimeFromNTP success!");
-                       // }
+                        }
+                       //sync();
                     }
                     else
                     {
@@ -1437,6 +1517,7 @@ static void get_mac(cascade_ip_mmap_t *mmp)
     mmp->mac[3]=ifreq.ifr_hwaddr.sa_data[3];
     mmp->mac[4]=ifreq.ifr_hwaddr.sa_data[4];
     mmp->mac[5]=ifreq.ifr_hwaddr.sa_data[5];
+    log_d("%x %x %x %x %x %x\n", mmp->mac[0], mmp->mac[1], mmp->mac[2], mmp->mac[3], mmp->mac[4], mmp->mac[5]);
 }
 
 /// @brief 全局结构体初始化
@@ -1535,6 +1616,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
         log_e("mmp malloc error!!!!!\n");
         return 0;        
     }
+    memset(_globalDeviceManager->mmp,0,sizeof(cascade_ip_mmap_t));
     get_mac(_globalDeviceManager->mmp);
 
     _globalDeviceManager->_RS485LowConfData = hlw8110_init();
@@ -1601,7 +1683,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     
 
 
-    INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
+    //INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
     // ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
     //                                 _globalDeviceManager->_globalDevInfo.product_id,
     //                                 &_globalDeviceManager->_globalSensorManger);
@@ -1618,7 +1700,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"sensor");
 
 
-    thread_start(THREAD_ID_POWER, power_thread, _globalDeviceManager, 10*MB, 0);
+    thread_start(THREAD_ID_POWER,power_thread, _globalDeviceManager, 10*MB, 0);
     //thread_start(THREAD_ID_SENSOR, ip_cascade_thread, _globalDeviceManager, 5*MB, 0);
     thread_start(THREAD_ID_SHMW, shm_thread, _globalDeviceManager, 5*MB, 0);
 
@@ -1630,7 +1712,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     //创建传感器采集控制线程
 
 
-     ntp_init();
+    ntp_init();
     dev_Alarm_Run_message(_globalDeviceManager, language_alarm_Init_Success[0], "NTP");
 
 #ifndef USE_NETSWITCH
@@ -1654,7 +1736,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     smtp_init();
 
     //通知smartUPG,app已经运行起来
-    upg_init();
+    //upg_init();
     
     while(1)
     {

+ 130 - 36
ip/src/appweb_handle.c

@@ -2694,7 +2694,7 @@ static void alarmProtect(void *conn)
     //查询json参数
     if(strcmp(_alarm_request_info.type,"listAllQuery")==0) //告警信息查询
     {
-#if IS_IP
+#if 0
     
         GlobalPowerManger *_globalPowerMangerTemp = NULL;
         //int ret = -1;
@@ -2730,7 +2730,7 @@ static void alarmProtect(void *conn)
         int i = 0 ;
         //初始化表
         INIT_LIST_HEAD(&_alarm_ack_info.list);
-        //查询数据库,最近的10个报警信息
+        // //查询数据库,最近的10个报警信息
         ret = dev_serarch_all_alarm(__globalDeviceManage.db,
             __globalDeviceManage._globalDevInfo.product_id,
            ALARM_TYPE_POWER ,1,10,
@@ -2739,26 +2739,72 @@ static void alarmProtect(void *conn)
 
         if(ret!=0) {
             log_e("get power alarm error.");
+            if(nAlarmNumber > 0)
+           {
+                
+                ack_str = mem_info_to_json();
+           }
         }
         else {
             ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
             //释放资源
-            _AlarmAckInfo* node;
-            _AlarmAckInfo* next;
-            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-            {
-                list_del(&node->list);
-                free(node);
-            }
         }
+        _AlarmAckInfo* node;
+        _AlarmAckInfo* next;
+        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+        {
+            list_del(&node->list);
+            free(node);
+        }
+        // char start_time[32] = {0};
+        // char stop_time[32] = {0};
+        // if (_alarm_request_info.startTime == NULL || _alarm_request_info.endTime == NULL)
+        // {
+        //     struct tm *t;
+        //     struct timeval tv;
+
+        //     gettimeofday(&tv, NULL);
+        //     t = localtime(&tv.tv_sec);
+        //     sprintf(stop_time, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 23, 59, 59);
+        //     log_d(stop_time);
+
+        //     sprintf(start_time, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 0, 0, 0);
+        //     log_d(start_time);
+
+        //     _alarm_request_info.startTime = start_time;
+        //     _alarm_request_info.endTime = stop_time;
+        // }
+        // ret = dev_search_alarm_info(__globalDeviceManage.db,
+        //     __globalDeviceManage._globalDevInfo.product.id,
+        //    -1,_alarm_request_info.startTime,_alarm_request_info.endTime,
+        //    1,10,
+        //     &_alarm_ack_info,&nAlarmNumber);
+        // if(ret != 0)
+        // {
+        //     log_e("get power alarm error.");
+        // }else
+        // {
+        //     ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
+        // }
+        //     //释放资源
+        // _AlarmAckInfo* node;
+        // _AlarmAckInfo* next;
+        // list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+        // {
+        //    if(node)
+        //    {
+        //         list_del(&node->list);
+        //         free(node);
+        //    }
+        // }        
 #endif
 
     }
     else if(strcmp(_alarm_request_info.type,"powerAlarmList")==0) //电源告警信息查询
     {
         //初始化表
-#if IS_IP
+#if 0
         GlobalPowerManger *_globalPowerMangerTemp = NULL;
         INIT_LIST_HEAD(&_alarm_ack_info.list);
         int number = 0;
@@ -2795,18 +2841,23 @@ static void alarmProtect(void *conn)
             &_alarm_ack_info,&nAlarmNumber);
         if(ret!=0) {
             log_e("get power alarm error.");
+            if(nAlarmNumber > 0)
+            {
+                
+                ack_str = mem_info_to_json();
+            }
         }
         else {
             ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
             //释放资源
-            _AlarmAckInfo* node;
-            _AlarmAckInfo* next;
-            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-            {
-                list_del(&node->list);
-                free(node);
-            }
+        }
+        _AlarmAckInfo* node;
+        _AlarmAckInfo* next;
+        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+        {
+            list_del(&node->list);
+            free(node);
         }
 #endif
     }
@@ -2815,7 +2866,7 @@ static void alarmProtect(void *conn)
         //初始化表
         INIT_LIST_HEAD(&_alarm_ack_info.list);
         //查询数据库
-#if IS_IP
+#if 0
     GlobalSensorManger *temp = NULL;
     int number = 0;
 
@@ -2855,13 +2906,13 @@ static void alarmProtect(void *conn)
             ack_str = alarm_info_to_json(&_alarm_ack_info,nAlarmNumber);
 
             //释放资源
-            _AlarmAckInfo* node;
-            _AlarmAckInfo* next;
-            list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
-            {
-                list_del(&node->list);
-                free(node);
-            }
+        }
+        _AlarmAckInfo* node;
+        _AlarmAckInfo* next;
+        list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+        {
+            list_del(&node->list);
+            free(node);
         }
 #endif
     }
@@ -2876,6 +2927,10 @@ static void alarmProtect(void *conn)
             &_alarm_ack_info,&nAlarmNumber);
         if(ret!=0) {
             log_e("get net alarm error.");
+            if(nAlarmNumber > 0)
+            {
+                ack_str = mem_info_to_json();
+            }
         }
         else {
             //转换参数
@@ -3532,13 +3587,15 @@ static void serviceManagement(void *conn)
     else if(strcmp(_serviceManageRequestInfo.type,"SmtpSave")==0)
     {
         //_SMTP_ServerRequestInfo
+        smtp_info_t mailInfo=gdm->smtpInfo;
         smtp_send_t *send=&gdm->smtpInfo.send;
         smtp_recv_t *recv=gdm->smtpInfo.recv;
         _SMTP_ServerRequestInfo *info=&_serviceManageRequestInfo._smtp_info;
 
         if(info->mode) {
             int save_flag=0;
-            send->mode = atoi(info->mode);
+            int mode = atoi(info->mode);
+            send->mode = mode;
             if(send->mode) {
                 if(info->account && info->password && info->server && info->port && info->auth)  {
                     if(strcmp(send->account, info->account)) {
@@ -3563,22 +3620,59 @@ static void serviceManagement(void *conn)
                 }
             }
             else {
-                memset(send, 0, sizeof(smtp_send_t));  save_flag = 1;
+                //memset(send, 0, sizeof(smtp_send_t));  save_flag = 1;
             }
-            
-            if(save_flag) {
+            if(memcmp(&mailInfo.send,&gdm->smtpInfo.send,sizeof(smtp_send_t)))
+            {
                 dev_smtp_update_send(gdm->db, send);
+                gdm->smtpInfo.send = mailInfo.send;
             }
-        }
-
-        for(int i=0; i<SMTP_RECV_MAX; i++) {
-            if(info->recvAccount[i]) {
+            for (int i = 0; i < MAIL_RECV_MAX; i++)
+            {
                 recv[i].idx = i;
-                recv[i].use = 1;
-                strcpy(recv[i].account, info->recvAccount[i]);
-                dev_smtp_update_recv(gdm->db, &recv[i]);
+                if (info->recvAccount[i])
+                {
+                    recv[i].use = 1;
+                    strcpy(recv[i].account, info->recvAccount[i]);
+                }
+                else
+                {
+                    recv[i].use = 0;
+                    if (mode)
+                    {
+                        strcpy(recv[i].account, "");
+                    }
+                }
             }
         }
+        if (memcmp(mailInfo.recv, gdm->smtpInfo.recv, sizeof(smtp_recv_t) * MAIL_RECV_MAX))
+        {
+            dev_mail_update_recv(gdm->db, recv);
+            //memcpy(gdm->smtpInfo.recv, mailInfo.recv, sizeof(smtp_recv_t) * MAIL_RECV_MAX);
+        }
+        // if(memcmp(mailInfo.recv, gdm->smtpInfo.recv, sizeof(smtp_recv_t) * MAIL_RECV_MAX))
+        // {
+        
+        //     for(int i=0; i<SMTP_RECV_MAX; i++) {
+        //         if(info->recvAccount[i]) {
+        //             recv[i].idx = i;
+        //             recv[i].use = 1;
+        //             strcpy(recv[i].account, info->recvAccount[i]);
+        //             dev_smtp_update_recv(gdm->db, &recv[i]);
+        //         }
+        //     }
+        //     //dev_smtp_update_recv(gdm->db, recv);
+        //     //memcpy(gdm->mailInfo.recv, mailInfo.recv, sizeof(smtp_recv_t) * MAIL_RECV_MAX);                        
+        // }
+
+        // for(int i=0; i<SMTP_RECV_MAX; i++) {
+        //     if(info->recvAccount[i]) {
+        //         recv[i].idx = i;
+        //         recv[i].use = 1;
+        //         strcpy(recv[i].account, info->recvAccount[i]);
+        //         dev_smtp_update_recv(gdm->db, &recv[i]);
+        //     }
+        // }
     }   
     //查询snmp信息
     else if(strcmp(_serviceManageRequestInfo.type,"listSnmpQuery")==0)

+ 42 - 13
ip/src/cascade.c

@@ -1499,25 +1499,37 @@ static int master_cmd_addr(cascade_handle_t *cas, cmd_data_t *cmd,int saddr,int
                 //LOGD("______cas->info.cnt2: %d\n", cas->sInfo.cnt);
                 // if(r==0) {
                 //     power_add(cas);
-                // }
+                // 
                 for(int i = 0; i < cas->sInfo.cnt;i++)
                 { 
-                    dm->mmp->data[index].current =  cas->sInfo.ch[i].chinfo.current * 1000;
-                    dm->mmp->data[index].consumer = cas->sInfo.ch[i].chinfo.consumption * 1000;
-                    dm->mmp->data[index].power = cas->sInfo.ch[i].chinfo.power* 1000;
-                    dm->mmp->data[index].voltage = cas->sInfo.ch[i].chinfo.voltage* 1000;
-                    dm->mmp->data[index].status = cas->sInfo.ch[i].chinfo.status;
-                    dm->mmp->data[index].factor = cas->sInfo.ch[i].chinfo.factor* 1000;
-                    dm->mmp->data[index].freq = cas->sInfo.ch[i].chinfo.freq* 1000;
-                    dm->mmp->data[index].temprature = cas->sInfo.ch[i].chinfo.tempratue * 100;
-                    dm->mmp->data[index].humidity = cas->sInfo.ch[i].chinfo.humidity * 100;        
-                    dm->mmp->data[index].saddr = saddr;
-                    dm->mmp->data[index].temprature_status = cas->sInfo.ch[i].product_ch_status;
+                    dm->mmp->data[saddr].current =  cas->sInfo.ch[i].chinfo.current * 1000;
+                    dm->mmp->data[saddr].consumer = cas->sInfo.ch[i].chinfo.consumption * 1000;
+                    dm->mmp->data[saddr].power = cas->sInfo.ch[i].chinfo.power* 1000;
+                    dm->mmp->data[saddr].voltage = cas->sInfo.ch[i].chinfo.voltage* 1000;
+                    dm->mmp->data[saddr].status = cas->sInfo.ch[i].chinfo.status;
+                    dm->mmp->data[saddr].factor = cas->sInfo.ch[i].chinfo.factor* 1000;
+                    dm->mmp->data[saddr].freq = cas->sInfo.ch[i].chinfo.freq* 1000;
+                    dm->mmp->data[saddr].temprature = cas->sInfo.ch[i].chinfo.tempratue * 100;
+                    dm->mmp->data[saddr].humidity = cas->sInfo.ch[i].chinfo.humidity * 100;        
+                    dm->mmp->data[saddr].saddr = saddr;
+                    dm->mmp->data[saddr].temprature_status = cas->sInfo.ch[i].product_ch_status;
                 }
             }
 
             else {
                 LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
+                // memset(&cas->sInfo.ch[0],0,sizeof(channel_info_t)*32);
+                // dm->mmp->data[saddr].current =  cas->sInfo.ch[0].chinfo.current * 1000;
+                // dm->mmp->data[saddr].consumer = cas->sInfo.ch[0].chinfo.consumption * 1000;
+                // dm->mmp->data[saddr].power = cas->sInfo.ch[0].chinfo.power* 1000;
+                // dm->mmp->data[saddr].voltage = cas->sInfo.ch[0].chinfo.voltage* 1000;
+                // dm->mmp->data[saddr].status = cas->sInfo.ch[0].chinfo.status;
+                // dm->mmp->data[saddr].factor = cas->sInfo.ch[0].chinfo.factor* 1000;
+                // dm->mmp->data[saddr].freq = cas->sInfo.ch[0].chinfo.freq* 1000;
+                // dm->mmp->data[saddr].temprature = cas->sInfo.ch[0].chinfo.tempratue * 100;
+                // dm->mmp->data[saddr].humidity = cas->sInfo.ch[0].chinfo.humidity * 100;        
+                // dm->mmp->data[saddr].saddr = saddr;
+                // dm->mmp->data[saddr].temprature_status = cas->sInfo.ch[0].product_ch_status;
             }
 #endif
         }
@@ -1796,7 +1808,8 @@ static void* scan_thread(void *arg)
         //if(info->product_modbus_type==0) {  //master
             cascade_lock();
             //r = new_master_scaner(cas);
-            master_scan(cas);
+            if(cas->scanner_flag == 0)
+                master_scan(cas);
             cascade_unlock();
         //}
         sleep(1);
@@ -2064,6 +2077,22 @@ int cascade_set_modbus(ModbusInfo_t *info)
 }
 
 
+int cascade_get_n_dlist(dev_list_t_n *dl)
+{
+    if(!dl)
+        return -1;
+    int i,cnt=0;
+    cascade_handle_t *cas=&casHandle;
+    for(i=0; i<=CASCADE_MAX; i++) {
+        if(cas->slaves[i].addr>=0) {
+            dl->slave[cnt++] = cas->slaves[i];
+        }       
+    }
+    dl->cnt = cnt;
+    return 0;
+}
+
+
 int cascade_get_dlist(dev_list_t *dl)
 {
     int i,cnt=0;

+ 12 - 0
ip/src/cascade.h

@@ -82,6 +82,12 @@ typedef struct {
     int       cnt;
 }dev_list_t;
 
+
+typedef struct {
+    slave_t slave[32];
+    int     cnt;
+}dev_list_t_n;
+
 typedef struct {
     uint16_t deveice_type;          //设备类型
     uint16_t slave_addr;            //设备地址
@@ -270,6 +276,12 @@ int cascade_get_ch(_OverChnPwrAckInfo *ch);
 
 int cascade_get_dlist(dev_list_t *dl);
 int cascade_free_dlist(dev_list_t *dl);
+
+int cascade_get_n_dlist(dev_list_t_n *dl);
+
+
+
+
 int cascade_set_modbus(ModbusInfo_t *info);
 
 int cascade_lock(void);

+ 6 - 3
ip/src/cascade_slave.c

@@ -156,6 +156,7 @@ static mmap_modbus_t ip[] ={
     [DS_IP_DEV_CHN         ]{.offset = DEV_CHN_REG              },
     [DS_IP_MAC             ]{.offset = DEV_IP_MAC               },
     [DS_POWER_INFO_REG     ]{.offset = POWER_INFO_REG           },
+    [DS_WANNING_REG        ]{.offset = WARNING_485_IP           },
 };
 
 
@@ -705,6 +706,7 @@ int cascade_slave_init(void)
     ip[DS_IP_DEV_CHN          ].addr = &mgr->mmp->dev_chn;
     ip[DS_IP_MAC              ].addr = &mgr->mmp->mac[0];
     ip[DS_POWER_INFO_REG      ].addr = &mgr->mmp->data[0];
+    ip[DS_WANNING_REG         ].addr = &mgr->mmp->waning[0];
     return 0;
 }
 
@@ -751,9 +753,9 @@ void cascade_slave_read(uint32_t addr,uint32_t lenth)
         break;
         case WARNING_485_IP ... (WARNING_485_IP+W_LENTH):
         {
-            uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
+            uint16_t *base_addr = (uint16_t *)ip[DS_WANNING_REG].addr;
             uint32_t step = addr - sh->map->start_registers;
-            base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
+            base_addr = base_addr + (addr - ip[DS_WANNING_REG].offset);
             uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
             if(lenth < 126)
             {
@@ -971,7 +973,7 @@ static void *pthread_handle_tcp(void *arg)
     while(1)
     {
         rc = modbus_receive(mb->ctx,query);
-        log_d("recive modbus rc=%d\n",rc);
+        //log_d("recive modbus rc=%d\n",rc);
         if(rc > 0)
         {
             _mb_hdr(&query[6],rc,&h);
@@ -988,6 +990,7 @@ static void *pthread_handle_tcp(void *arg)
                 continue;
             }
     }
+    close(fd);
     modbus_close(mb->ctx);
     modbus_free(mb->ctx);
     mb->ctx = 0;

+ 44 - 4
ip/src/common.c

@@ -283,14 +283,19 @@ static int set_rtc(time_t t)
     int r=0,fd;
     struct rtc_time *rtc;
 
-    struct tm *tm = gmtime(&t);
+    //struct tm *tm = gmtime(&t);
+    struct tm out = {0};
+    struct tm out1 = {0};
+    struct tm *tm = gmtime_r(&t,&out);
+    //print_utc("set rtc value",)
+    log_d("___yyk___ write_rtc:%d-%d-%d %d:%d:%d\n",out.tm_year+1900,out.tm_mon+1,out.tm_mday,out.tm_hour,out.tm_min,out.tm_sec);
     fd = open("/dev/rtc0", O_RDONLY);
     if (fd < 0) {
         perror("open rtc failed\n");
         return -1;
     }
  
-    rtc = (struct rtc_time*)tm;
+    rtc = (struct rtc_time*)(&out);
     if (ioctl(fd, RTC_SET_TIME, rtc) < 0) {
         perror("ioctl RTC_SET_TIME failed\n");
         r = -1;
@@ -299,7 +304,27 @@ static int set_rtc(time_t t)
         printf("set rtc ok!\n");
     }
     close(fd);
-    
+    sync();
+    sleep(1);
+    fd = open("/dev/rtc0", O_RDONLY);
+    if (fd == -1) {
+        perror("open /dev/rtc error");
+		exit(errno);
+    }
+
+    /* Read the RTC time/date */
+    int retval = ioctl(fd, RTC_RD_TIME, &out1);
+    if (retval == -1) {
+        perror("ioctl RTC_RD_TIME error");
+        exit(errno);
+    }
+    close(fd);
+    log_d("___yyk___ read_rtc:%d-%d-%d %d:%d:%d\n",out1.tm_year+1900,out1.tm_mon+1,out1.tm_mday,out1.tm_hour,out1.tm_min,out1.tm_sec);
+    if(out.tm_year != out1.tm_year || out.tm_mon != out1.tm_mon || out.tm_mday != out1.tm_mday || out.tm_hour !=out1.tm_hour)
+    {
+        log_d("___yyk___ write_rtc:  %d-%d-%d %d:%d:%d\n",out.tm_year+1900,out.tm_mon+1,out.tm_mday,out.tm_hour,out.tm_min,out.tm_sec);
+        log_d("___yyk___  read_rtc:  %d-%d-%d %d:%d:%d\n",out1.tm_year+1900,out1.tm_mon+1,out1.tm_mday,out1.tm_hour,out1.tm_min,out1.tm_sec);
+    }
     return r;
     
     //system("hwclock -w -f /dev/rtc0");
@@ -345,6 +370,13 @@ time_t mktime2(struct tm *t, int zone)
 
     return res;
 }
+time_t mktime_rtc(time_t time,int zone)
+{
+    time_t res;
+    res = time - zone*3600;
+    return res;
+}
+
 time_t mktime0(void)
 {
     struct tm t;
@@ -368,6 +400,8 @@ int set_time(struct tm *t, int zone)
     t->tm_mon -= 1;
     time_t utc = mktime2(t, zone);
     stime(&utc);
+    //time_t da = mktime2(utc, zone);
+    //time_t da = mktime_rtc(utc,zone);
     set_rtc(utc);
     return 0;
 }
@@ -376,6 +410,7 @@ int set_time(struct tm *t, int zone)
 int set_utctime(time_t t)
 {
     stime(&t);
+    print_utc("kkkkk",t);
     set_rtc(t);
     sleep(1);
     //system("hwclock -w -f /dev/rtc0");
@@ -475,7 +510,12 @@ int set_zone(int zone)
 #endif
 
     log_i("set_zone: %s", buf);
-    return system(buf);
+    system(buf);
+    tzset();
+    // char buff[123] = {0};
+    // sprintf(buff,"export TZ='GMT%s%d'",(zone<0)?"+":"-", abs(zone));
+    // system(buff);
+    return 0;
 }
 
 

+ 9 - 9
ip/src/common.h

@@ -66,6 +66,8 @@
 #define LOGO_FILE           "logo.png"
 #define QRCODE_FILE         "qrcode.png"
 
+#define MAIL_RECV_MAX  10
+
 
 #define AC_SINGLE_S_CUR_CHN_NUM 8
 #define AC_SINGLE_B_CUR_CHN_NUM 4
@@ -264,13 +266,6 @@ typedef struct
     char          dns2[64];    					//dns2
 }NetworkInfo_t;
 
-typedef struct {
-    int         watchdog;
-    int         flip_time;
-    int         led;
-    int         beep;
-    int         rotate;
-}MiscInfo_t;
 
 /// @brief 用户登录
 typedef struct
@@ -299,7 +294,6 @@ typedef struct
     NetworkInfo_t   _network_info ;             ;//网络信息
     ModbusInfo_t    _gmodbus_info               ;//级联端口    
     float           consumer                    ;  
-    MiscInfo_t      misc;
 }GlobalDeviceInfo;
 ///////////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////////
@@ -937,7 +931,12 @@ typedef struct
 }Modbus_Manger_Tcp;
 
 typedef struct {
-    uint16_t waning;
+    uint16_t   waning_up_v      :    1;         //
+    uint16_t   waning_low_v     :    1;         //
+    uint16_t   waning_up_i      :    1;         //
+    uint16_t   waning_up_p      :    1;         //
+    uint16_t   waning_up_c      :    1;         //
+    uint16_t                    :   11;
 }case_ip_wanning_t;
 
 typedef struct cascade_ip_mmap{
@@ -1099,6 +1098,7 @@ int set_utctime_zone(time_t t, int zone);
 
 time_t mktime0(void);
 time_t mktime2(struct tm *t, int zone);
+time_t mktime_rtc(time_t time,int zone);
 int get_time_str(char *s, int len, time_t t);
 int get_time_str2(char *s, int len, time_t t);
 int get_bldtime(char *buf, int len);

+ 19 - 0
ip/src/json_handle.c

@@ -3106,6 +3106,25 @@ char* over_sensor_history_info_to_json(_OverSensorBackInfo* _over_all_sensor_bac
     return str;
 }
 
+
+char* mem_info_to_json()
+{
+    char* str = NULL;
+    // 创建 JSON 对象
+    cJSON* root = cJSON_CreateObject();   
+    // 添加基本键值对
+    cJSON_AddNumberToObject(root, "code", 201); 
+    //添加结果
+    cJSON_AddStringToObject(root, "msg", "Memmery is not enough and clean the wanning!!!");
+    //转换
+    str = cJSON_Print(root); 
+    //释放资源
+    cJSON_Delete(root);   
+    return str;
+}
+
+
+
 /// @brief 返回告警日志
 /// @param _alarm_ack_info 
 /// @return 

+ 1 - 0
ip/src/json_handle.h

@@ -622,6 +622,7 @@ char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_
 int json_to_switch_language(const char* str);
 
 int InitHashTable(GlobalDeviceManager *gdm);
+char* mem_info_to_json();
 
 
 int GetRoleIDByUserName(char* _userName,UserInfo* __UserInfo_t);

+ 3 - 2
ip/src/ntpclient.c

@@ -126,6 +126,7 @@ NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {
     client->res = NULL;
     client->flag = 0;
     pthread_create(&tid, NULL, tmp_thread, client);
+    pthread_detach(tid);
     for(int i=0; i<timeout_sec; i++) {
         if(client->flag) {
             break;
@@ -135,8 +136,8 @@ NTPClient* createNTPClient(const char* ntp_server, int port, int timeout_sec) {
     if(client->flag!=1) {
         if(client->flag==0) {
             printf("___getaddrinfo timeout, cancel thread %lu\n", (unsigned long)tid);
-            pthread_cancel(tid);//SIGTERM
-            pthread_join(tid, NULL);
+            // pthread_cancel(tid);//SIGTERM
+            // pthread_join(tid, NULL);
             printf("___cancel ok!\n");
         }
         if(client->res) freeaddrinfo(client->res);

+ 506 - 10
ip/src/pduMIB_form.c

@@ -152,9 +152,9 @@ initialize_table_pduSensorTable(void)
                                             NULL, 0,
                                             COLUMN_PDUSENSORVALUENUM, ASN_INTEGER, 0,
                                             NULL, 0,
-                                            COLUMN_PDUSENSORVALUE1, ASN_INTEGER, 0,
+                                            COLUMN_PDUSENSORVALUE1, ASN_OCTET_STR, 0,
                                             NULL, 0,
-                                            COLUMN_PDUSENSORVALUE2, ASN_INTEGER, 0,
+                                            COLUMN_PDUSENSORVALUE2, ASN_OCTET_STR, 0,
                                             NULL, 0,
                               0);
     
@@ -462,18 +462,22 @@ initialize_table_pduSensorLimitTable(void)
                            0);
 
     DEBUGMSGTL(("initialize_table_pduSensorLimitTable",
-                "adding column types to table pduSensorLimitTable\n"));		 
+                "adding column types to table pduSensorLimitTable\n"));
     netsnmp_table_set_multi_add_default_row(table_set,
                                             COLUMN_PDUSENSORLIMITID, ASN_INTEGER, 1,
                                             NULL, 0,
                                             COLUMN_PDUSENSORLIMITNAME, ASN_OCTET_STR, 1,
                                             NULL, 0,
-                                            COLUMN_PDUSENSORLIMITVALUE1, ASN_INTEGER, 1,
+                                            COLUMN_PDUSENSORLIMITVALUE1UP, ASN_INTEGER, 1,
                                             NULL, 0,
-                                            COLUMN_PDUSENSORLIMITVALUE2, ASN_INTEGER, 1,
+                                            COLUMN_PDUSENSORLIMITVALUE2UP, ASN_INTEGER, 1,
                                             NULL, 0,
-                              0);
-    
+                                            COLUMN_PDUSENSORLIMITVALUE1DOWN, ASN_INTEGER, 1,
+                                            NULL, 0,
+                                            COLUMN_PDUSENSORLIMITVALUE2DOWN, ASN_INTEGER, 1,
+                                            NULL, 0,
+                                            0);
+
     /* registering the table with the master agent */
     /* note: if you don't need a subhandler to deal with any aspects
        of the request, change pduSensorLimitTable_handler to "NULL" */
@@ -518,12 +522,35 @@ pduChannelTable_handler(
       GlobalPowerManger* iterator;
       //GlobalPowerInfo powerInfo;
       char buffer[16];
+      oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 9, 1, 1, 1};
+      int max_clonum=11;
       switch(reqinfo->mode)
       {
          case MODE_GET:
+         case MODE_GETNEXT:
                for (request = requests; request; request = request->next)
                {
                   table_info = netsnmp_extract_table_info(request);
+                   if (reqinfo->mode==MODE_GETNEXT)
+                   {
+                      if (table_info->index_oid[0] == 0)
+                      {
+                         table_info->index_oid[0] = 1;
+                         table_info->colnum = 1;
+                         snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+                      }
+                      else
+                      {
+                        if (table_info->colnum > max_clonum)
+                        {
+                            table_info->index_oid[0] += 1;
+                            table_info->colnum =1;
+                        }
+                        oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 9, 1, table_info->colnum, table_info->index_oid[0]};
+                         snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+                      }
+                   }
+
                   int nIndex=1;
                   list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
                   {
@@ -541,7 +568,7 @@ pduChannelTable_handler(
                      //       _over_all_pwr_back_info._Power_Trend_Info.ydata[POWER_REACTIVE_TYPE][i] = __PowerTrendInfo._power_trend_info.ydata[POWER_REACTIVE_TYPE][i];
                      //       _over_all_pwr_back_info._Power_Trend_Info.ydata[POWER_APPARENT_TYPE][i] = __PowerTrendInfo._power_trend_info.ydata[POWER_APPARENT_TYPE][i];
                      // }
-                     //if(dev_search_latest_power_info(__globalDeviceManage.db,__globalDeviceManage._globalDevInfo.product_id,iterator->product_ch_id,&powerInfo)!=0)
+                     //if(dev_search_latest_power_info(__globalDeviceManage.db,__globalDeviceManage._globalDevInfo.product.id,iterator->product_ch_id,&powerInfo)!=0)
                      //{
                      //   log_e("search total pwr err at pduChannelTable_handler from db.");
                      //}
@@ -758,12 +785,34 @@ pduGroupTable_handler(
     }
 
     char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 10, 1, 1, 1};
+    int max_clonum = 4;
     switch (reqinfo->mode)
     {
     case MODE_GET:
+    case MODE_GETNEXT:
        for (request = requests; request; request = request->next)
        {
           table_info = netsnmp_extract_table_info(request);
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 3, 10, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
           int nIndex = 1;
           list_for_each_entry(_GroupInfoTemp, &group_list.list, list)
           {
@@ -949,8 +998,7 @@ pduGroupTable_handler(
        /* we should never get here, so this is a really bad error */
        snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
        return SNMP_ERR_GENERR;
-      }
-
+    }
 
     return SNMP_ERR_NOERROR;
 }
@@ -966,6 +1014,113 @@ pduSensorTable_handler(
        already been processed by the master table_dataset handler, but
        this gives you chance to act on the request in some other way
        if need be. */
+    netsnmp_request_info *request;
+    netsnmp_table_request_info *table_info;
+    GlobalSensorManger *iterator = NULL;
+    //
+    char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 4, 1, 1, 1, 1};
+    int max_clonum = 10;
+    switch (reqinfo->mode)
+    {
+    case MODE_GET:
+    case MODE_GETNEXT:
+       for (request = requests; request; request = request->next)
+       {
+          table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 4, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
+          int nIndex = table_info->index_oid[0];
+          bool findinstance = false;
+
+          list_for_each_entry(iterator, &__globalDeviceManage._globalSensorManger.list, list)
+          {
+             if (!iterator || nIndex != iterator->sensor_id)
+             {
+                continue;
+             }
+             memset(buffer, 0, sizeof(buffer));
+             switch (table_info->colnum)
+             {
+             case COLUMN_PDUSENSORID:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_id);
+                break;
+             case COLUMN_PDUSENSORNAME:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, iterator->sensor_name, strlen(iterator->sensor_name));
+                break;
+             case COLUMN_PDUSENSORTYPE:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_type);
+                break;
+             case COLUMN_PDUSENSORDATACHENNEL:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_interface_type);
+                break;
+             case COLUMN_PDUSENSORMODBUSADDRESS:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_addr);
+                break;
+             case 6:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_node_number);
+                break;
+             case COLUMN_PDUSENSORSTATUS:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_status);
+                break;
+             case COLUMN_PDUSENSORVALUENUM:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_val_count);
+                break;
+             case COLUMN_PDUSENSORVALUE1:
+                sprintf(buffer, "%0.3f", iterator->Cur_sensor_info.val1);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             case COLUMN_PDUSENSORVALUE2:
+                sprintf(buffer, "%0.3f", iterator->Cur_sensor_info.val2);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             default:
+                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+                break;
+             }
+             //}
+             break;
+          }
+
+       }
+       break;
+    case MODE_SET_RESERVE1:
+       break;
+    case MODE_SET_RESERVE2:
+       break;
+    case MODE_SET_FREE:
+       break;
+    case MODE_SET_ACTION:
+       break;
+    case MODE_SET_UNDO:
+       break;
+    case MODE_SET_COMMIT:
+       break;
+    default:
+       /* we should never get here, so this is a really bad error */
+       snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
+       return SNMP_ERR_GENERR;
+    }
+
     return SNMP_ERR_NOERROR;
 }
 
@@ -1036,6 +1191,150 @@ pduAlarmHistoryTable_handler(
        already been processed by the master table_dataset handler, but
        this gives you chance to act on the request in some other way
        if need be. */
+
+    netsnmp_request_info *request;
+    netsnmp_table_request_info *table_info;
+
+    //
+    char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 6, 1, 1, 1, 1};
+    int max_clonum = 7;
+    switch (reqinfo->mode)
+    {
+    case MODE_GET:
+    case MODE_GETNEXT:
+    {
+       // 初始化表
+       int nAlarmNumber = 0;
+       _AlarmAckInfo _alarm_ack_info; // 填充数据
+       INIT_LIST_HEAD(&_alarm_ack_info.list);
+       // 查询数据库,最近的10个报警信息
+       char start_time[32] = {0};
+       char stop_time[32] = {0};
+
+       struct tm *t;
+       struct timeval tv;
+
+       gettimeofday(&tv, NULL);
+       t = localtime(&tv.tv_sec);
+       sprintf(stop_time, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 23, 59, 59);
+       sprintf(start_time, "%04d-%02d-%02d %02d:%02d:%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, 0, 0, 0);
+
+       int ret = dev_search_alarm_info(__globalDeviceManage.db,
+                                       __globalDeviceManage._globalDevInfo.product_id,
+                                       -1, start_time, stop_time,
+                                       1, 10,
+                                       &_alarm_ack_info, &nAlarmNumber);
+       if (ret != 0)
+       {
+          log_e("get power alarm error.");
+          return SNMP_ERR_GENERR;
+       }
+    
+
+       for (request = requests; request; request = request->next)
+       {
+          table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 6, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
+          int nIndex = 1;
+          _AlarmAckInfo *_temp;
+          list_for_each_entry(_temp, &_alarm_ack_info.list, list)
+          {
+             if (nIndex < table_info->index_oid[0])
+             {
+                nIndex++;
+                continue;
+             }
+
+             if (!_temp)
+             {
+                break;
+             }
+
+             memset(buffer, 0, sizeof(buffer));
+             switch (table_info->colnum)
+             {
+             case COLUMN_PDUALARMID:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, nIndex);
+                break;
+             case COLUMN_PDUALARMTYPE:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, _temp->alarmType);
+                break;
+             case COLUMN_PDUALARMCONTEXT:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, _temp->alarmContent, strlen(_temp->alarmContent));
+                break;
+             case COLUMN_PDUALARMACTION:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, -1);
+                break;
+             case COLUMN_PDUALARMACTIONPARA:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, -1);
+                break;
+             case COLUMN_PDUALARMDATE:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, _temp->alarmDate, strlen(_temp->alarmDate));
+                break;
+             case COLUMN_PDUALARMTIME:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, _temp->alarmDate, strlen(_temp->alarmDate));
+                break;
+             default:
+                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+                break;
+             }
+             //}
+             break;
+          }
+       }
+
+       // 释放资源
+       if (0 == ret)
+       {
+          _AlarmAckInfo *node;
+          _AlarmAckInfo *next;
+          list_for_each_entry_safe(node, next, &_alarm_ack_info.list, list)
+          {
+             list_del(&node->list);
+             free(node);
+          }
+       }
+    }
+    break;
+    case MODE_SET_RESERVE1:
+       break;
+    case MODE_SET_RESERVE2:
+       break;
+    case MODE_SET_FREE:
+       break;
+    case MODE_SET_ACTION:
+       break;
+    case MODE_SET_UNDO:
+       break;
+    case MODE_SET_COMMIT:
+       break;
+    default:
+       /* we should never get here, so this is a really bad error */
+       snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
+       return SNMP_ERR_GENERR;
+    }
+
     return SNMP_ERR_NOERROR;
 }
 
@@ -1050,6 +1349,110 @@ pduChannelLimitTable_handler(
        already been processed by the master table_dataset handler, but
        this gives you chance to act on the request in some other way
        if need be. */
+
+    netsnmp_request_info *request;
+    netsnmp_table_request_info *table_info;
+    GlobalPowerManger *iterator = NULL;
+    //
+    char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 2, 6, 1, 1, 1};
+    int max_clonum = 7;
+    switch (reqinfo->mode)
+    {
+    case MODE_GET:
+   case MODE_GETNEXT:
+       for (request = requests; request; request = request->next)
+       {
+          table_info = netsnmp_extract_table_info(request);
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 2, 6, 1,table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+          int nIndex = 1;
+
+          list_for_each_entry(iterator, &__globalDeviceManage._globalPowerManger.list, list)
+          {
+             if (nIndex < table_info->index_oid[0])
+             {
+                nIndex++;
+                continue;
+             }
+             if (!iterator)
+             {
+                break;
+             }
+
+             memset(buffer, 0, sizeof(buffer));
+             switch (table_info->colnum)
+             {
+             case COLUMN_PDUCHANNELLIMITID:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->product_ch_id);
+                break;
+             case COLUMN_PDUCHANNELLIMITNAME:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, iterator->product_ch_name, strlen(iterator->product_ch_name));
+                break;
+             case COLUMN_PDUCHANNELCURRENTLIMITUP:
+                sprintf(buffer, "%0.2f", iterator->global_over_manager->product_cur_upper_threshold);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             case COLUMN_PDUCHANNELVOLTAGELIMITUP:
+                sprintf(buffer, "%0.2f", iterator->global_over_manager->product_vol_upper_threshold);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
+                sprintf(buffer, "%0.2f", iterator->global_over_manager->product_vol_lower_threshold);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             case COLUMN_PDUCHANNELPOWERLIMITUP:
+                sprintf(buffer, "%0.2f", iterator->global_over_manager->product_pwr_upper_threshold);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
+                sprintf(buffer, "%0.2f", iterator->global_over_manager->product_pwrcon_upper_threshold);
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
+                break;
+             default:
+                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+                break;
+             }
+             //}
+             break;
+          }
+       }
+       break;
+    case MODE_SET_RESERVE1:
+       break;
+    case MODE_SET_RESERVE2:
+       break;
+    case MODE_SET_FREE:
+       break;
+    case MODE_SET_ACTION:
+       break;
+    case MODE_SET_UNDO:
+       break;
+    case MODE_SET_COMMIT:
+       break;
+    default:
+       /* we should never get here, so this is a really bad error */
+       snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
+       return SNMP_ERR_GENERR;
+    }
+
     return SNMP_ERR_NOERROR;
 }
 
@@ -1064,5 +1467,98 @@ pduSensorLimitTable_handler(
        already been processed by the master table_dataset handler, but
        this gives you chance to act on the request in some other way
        if need be. */
+    netsnmp_request_info *request;
+    netsnmp_table_request_info *table_info;
+    GlobalSensorManger *iterator = NULL;
+    //
+    char buffer[16];
+    oid begin_next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 3, 1, 1, 1, 1};
+    int max_clonum = 6;
+    switch (reqinfo->mode)
+    {
+    case MODE_GET:
+    case MODE_GETNEXT:
+       for (request = requests; request; request = request->next)
+       {
+          table_info = netsnmp_extract_table_info(request);
+
+          if (reqinfo->mode == MODE_GETNEXT)
+          {
+             if (table_info->index_oid[0] == 0)
+             {
+                table_info->index_oid[0] = 1;
+                table_info->colnum = 1;
+                snmp_set_var_objid(requests->requestvb, begin_next_oid, OID_LENGTH(begin_next_oid));
+             }
+             else
+             {
+                if (table_info->colnum > max_clonum)
+                {
+                   table_info->index_oid[0] += 1;
+                   table_info->colnum = 1;
+                }
+                oid next_oid[] = {1, 3, 6, 1, 4, 1, 2024, 1, 7, 3, 1, 1, table_info->colnum, table_info->index_oid[0]};
+                snmp_set_var_objid(requests->requestvb, next_oid, OID_LENGTH(next_oid));
+             }
+          }
+
+          int nIndex = table_info->index_oid[0];
+
+          list_for_each_entry(iterator, &__globalDeviceManage._globalSensorManger.list, list)
+          {
+             if (!iterator || nIndex != iterator->sensor_id)
+             {
+                continue;
+             }
+
+             memset(buffer, 0, sizeof(buffer));
+             switch (table_info->colnum)
+             {
+             case COLUMN_PDUSENSORLIMITID:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->sensor_id);
+                break;
+             case COLUMN_PDUSENSORLIMITNAME:
+                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR, iterator->sensor_name, strlen(iterator->sensor_name));
+                break;
+             case COLUMN_PDUSENSORLIMITVALUE1UP:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->over_manager->sensor_val1_upper_threshold);
+                break;
+             case COLUMN_PDUSENSORLIMITVALUE2UP:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->over_manager->sensor_val2_upper_threshold);
+                break;
+             case COLUMN_PDUSENSORLIMITVALUE1DOWN:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->over_manager->sensor_val1_lower_threshold);
+                break;
+             case COLUMN_PDUSENSORLIMITVALUE2DOWN:
+                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER, iterator->over_manager->sensor_val2_lower_threshold);
+                break;
+             default:
+                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
+                break;
+             }
+             //}
+             break;
+          }
+
+       }
+       break;
+    case MODE_SET_RESERVE1:
+       break;
+    case MODE_SET_RESERVE2:
+       break;
+    case MODE_SET_FREE:
+       break;
+    case MODE_SET_ACTION:
+       break;
+    case MODE_SET_UNDO:
+       break;
+    case MODE_SET_COMMIT:
+       break;
+    default:
+       /* we should never get here, so this is a really bad error */
+       snmp_log(LOG_ERR, "unknown mode (%d) in handle_pduType\n", reqinfo->mode);
+       return SNMP_ERR_GENERR;
+    }
+
     return SNMP_ERR_NOERROR;
 }

+ 4 - 2
ip/src/pduMIB_form.h

@@ -101,6 +101,8 @@ Netsnmp_Node_Handler pduSensorLimitTable_handler;
 /* column number definitions for table pduSensorLimitTable */
        #define COLUMN_PDUSENSORLIMITID		1
        #define COLUMN_PDUSENSORLIMITNAME		2
-       #define COLUMN_PDUSENSORLIMITVALUE1		3
-       #define COLUMN_PDUSENSORLIMITVALUE2		4
+       #define COLUMN_PDUSENSORLIMITVALUE1UP		3
+       #define COLUMN_PDUSENSORLIMITVALUE2UP		4
+       #define COLUMN_PDUSENSORLIMITVALUE1DOWN		5
+       #define COLUMN_PDUSENSORLIMITVALUE2DOWN		6
 #endif /* PDUMIB_FORM_H */

+ 31 - 10
ip/src/pduMIB_scalar.c

@@ -315,7 +315,7 @@ int handle_pduId(netsnmp_mib_handler *handler,
 
     case MODE_GET:
         snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,&__globalDeviceManage._globalDevInfo.product_id,sizeof(ASN_INTEGER));
-        //                          /* XXX: a pointer to the scalar's data */&__globalDeviceManage._globalDevInfo.product_id,
+        //                          /* XXX: a pointer to the scalar's data */&__globalDeviceManage._globalDevInfo.product.id,
         //                          /* XXX: the length of the data in bytes */sizeof(ASN_INTEGER));
         break;
 
@@ -348,8 +348,8 @@ int handle_pduName(netsnmp_mib_handler *handler,
                                  strlen(__globalDeviceManage._globalDevInfo.product_name) // buff的长度
         );
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
-        //                          /* XXX: a pointer to the scalar's data */__globalDeviceManage._globalDevInfo.product_name,
-        //                          /* XXX: the length of the data in bytes */strlen(__globalDeviceManage._globalDevInfo.product_name));
+        //                          /* XXX: a pointer to the scalar's data */__globalDeviceManage._globalDevInfo.product.name,
+        //                          /* XXX: the length of the data in bytes */strlen(__globalDeviceManage._globalDevInfo.product.name));
         break;
 
     default:
@@ -3508,14 +3508,17 @@ int handle_pduCurrentLimitUp(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    char buffer[64];
     switch (reqinfo->mode)
     {
-
     case MODE_GET:
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
         //                          /* XXX: a pointer to the scalar's data */,
         //                          /* XXX: the length of the data in bytes */);
+
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(buffer, "%0.2f", __globalDeviceManage._globalPowerManger.global_over_manager->product_cur_upper_threshold);
+        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
         break;
 
     /*
@@ -3588,7 +3591,7 @@ int handle_pduVoltageLimitUp(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    char buffer[64];
     switch (reqinfo->mode)
     {
 
@@ -3596,6 +3599,9 @@ int handle_pduVoltageLimitUp(netsnmp_mib_handler *handler,
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
         //                          /* XXX: a pointer to the scalar's data */,
         //                          /* XXX: the length of the data in bytes */);
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(buffer, "%0.2f", __globalDeviceManage._globalPowerManger.global_over_manager->product_vol_upper_threshold);
+        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
         break;
 
     /*
@@ -3668,7 +3674,7 @@ int handle_pduVoltageLimitDown(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    char buffer[64];
     switch (reqinfo->mode)
     {
 
@@ -3676,6 +3682,9 @@ int handle_pduVoltageLimitDown(netsnmp_mib_handler *handler,
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
         //                          /* XXX: a pointer to the scalar's data */,
         //                          /* XXX: the length of the data in bytes */);
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(buffer, "%0.2f", __globalDeviceManage._globalPowerManger.global_over_manager->product_vol_lower_threshold);
+        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
         break;
 
     /*
@@ -3748,7 +3757,7 @@ int handle_pduPowerLimitUp(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    char buffer[64];
     switch (reqinfo->mode)
     {
 
@@ -3756,6 +3765,9 @@ int handle_pduPowerLimitUp(netsnmp_mib_handler *handler,
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
         //                          /* XXX: a pointer to the scalar's data */,
         //                          /* XXX: the length of the data in bytes */);
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(buffer, "%0.2f", __globalDeviceManage._globalPowerManger.global_over_manager->product_pwr_upper_threshold);
+        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
         break;
 
     /*
@@ -3828,7 +3840,7 @@ int handle_pduConsumptionLimitUp(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    char buffer[64];
     switch (reqinfo->mode)
     {
 
@@ -3836,6 +3848,9 @@ int handle_pduConsumptionLimitUp(netsnmp_mib_handler *handler,
         // snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
         //                          /* XXX: a pointer to the scalar's data */,
         //                          /* XXX: the length of the data in bytes */);
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(buffer, "%0.2f", __globalDeviceManage._globalPowerManger.global_over_manager->product_pwrcon_upper_threshold);
+        snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR, buffer, strlen(buffer));
         break;
 
     /*
@@ -3908,7 +3923,7 @@ int handle_pduRestart(netsnmp_mib_handler *handler,
 
     /* a instance handler also only hands us one request at a time, so
        we don't need to loop over a list of requests; we'll only get one. */
-
+    int nStatus =-1;
     switch (reqinfo->mode)
     {
 
@@ -3959,6 +3974,12 @@ int handle_pduRestart(netsnmp_mib_handler *handler,
         //     /* try _really_really_ hard to never get to this point */
         //     netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED);
         // }
+        nStatus = *requests->requestvb->val.integer;
+        if (nStatus == 1)
+        {
+           system("reboot");
+        }
+        else netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED);
         break;
 
     case MODE_SET_UNDO:

+ 64 - 5
ip/src/sqlite_handle.c

@@ -2910,14 +2910,12 @@ int dev_serarch_all_alarm(sqlite3* db,
 
     if (alarm_type<0)//小于0加载所有的
     {   
-        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (product_id=%d) order by alarmType desc LIMIT %d OFFSET %d ",
-                        product_id,
+        sprintf(select_sql,"SELECT* FROM Table_AlarmManage order by alarmType desc LIMIT %d OFFSET %d ",
                         page_size,
                         page_num>0?(page_num-1)*page_size:0);
     }else
     {
-        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (product_id=%d) AND (alarmType=%d) LIMIT %d OFFSET %d",
-                        product_id,
+        sprintf(select_sql,"SELECT* FROM Table_AlarmManage WHERE (alarmType=%d) LIMIT %d OFFSET %d",
                         alarm_type,
                         page_size,
                         page_num>0?(page_num-1)*page_size:0);
@@ -3046,12 +3044,16 @@ int dev_search_alarm_info(sqlite3* db,
         sqlite3_free_table(pResult);
         return -1 ;
     }
-
+    if(nrow > 100)
+        nrow = 100;
     for (size_t i = 1; i <= nrow; i++)
     {
         _AlarmAckInfo* _alarmTemp = (_AlarmAckInfo*)malloc(sizeof( _AlarmAckInfo));
         if(_alarmTemp==NULL)
+        {
             log_e("alarm malloc failed");
+            break;
+        }
         strcpy(_alarmTemp->alarmNumber,pResult[i*ncolumn+0]);
         strcpy(_alarmTemp->alarmDate,pResult[i*ncolumn+1]);
         _alarmTemp->alarmType = atoi(pResult[i*ncolumn+2]);
@@ -4554,6 +4556,63 @@ quit:
 }
 
 
+int dev_mail_update_recv(sqlite3 *db, smtp_recv_t *recv)
+{
+    int i,r=-1,exist=0,cnt=0;
+
+
+    char temp[1024];
+    sqlite3_stmt *stmt;
+    char *err_msg=NULL;
+    smtp_recv_t *rcv=NULL;
+    char *table=SMTP_RECVEIVE_TABLE;
+    
+    if(!db || !recv) {
+        return -1;
+    }
+
+    cnt = get_count(db, table);
+    for(i=0; i<MAIL_RECV_MAX; i++) {
+        rcv = &recv[i];
+        if(cnt>0) {
+            sprintf(temp, "UPDATE %s SET idx=%d, use=%d, account='%s' WHERE idx=%d;", 
+                    table, rcv->idx, rcv->use, rcv->account, rcv->idx);
+            r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
+            if(r != SQLITE_OK) {
+                log_e("___dev_mail_update_recv failed, %s, %s\n", temp, err_msg);
+                sqlite3_free(err_msg);
+                return -1;
+            }
+            else {
+                exist = sqlite3_changes(db);
+            }
+        }
+
+        if(exist==0) {
+            sprintf(temp, "INSERT INTO %s (idx,use,account) VALUES (?,?,?);", table);
+            r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+            if (r != SQLITE_OK) {
+                log_e("___dev_mail_update_recv, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+                return -1;
+            }
+
+            sqlite3_bind_int(stmt,  1, rcv->idx);
+            sqlite3_bind_int(stmt,  2, rcv->use);
+            sqlite3_bind_text(stmt, 3, rcv->account,  -1, NULL);
+
+            r = sqlite3_step(stmt);
+            sqlite3_finalize(stmt);
+
+            if (r != SQLITE_DONE) {
+                log_e("___dev_mail_update_recv, sqlite3_step failed\n");
+                r = -1;
+            }
+        }
+    }
+
+    return r;
+}
+
 ////////////////mqtt/////////////////////////////////////////////
 #define MQTT_MANAGER_TABLE   "Table_MQTTManage"
 int dev_mqtt_init(sqlite3 *db, mqtt_server_t *ser)

+ 1 - 0
ip/src/sqlite_handle.h

@@ -161,4 +161,5 @@ int dev_search_latest_power_all_info_ip(GlobalDeviceManager* globalDeviceManger,
 int dev_get_sensor_info (sqlite3 *db,int product_id,int sensor_id, GlobalSensorManger* sensor_temp);
 int dev_get_sensor_info_new(sqlite3 *db,int product_id,int sensor_id, GlobalSensorManger* sensor_temp);
 int dev_update_consumer(sqlite3 *db,GlobalDeviceInfo* _globalDeviceInfo);
+int dev_mail_update_recv(sqlite3 *db, smtp_recv_t *recv);
 #endif

+ 0 - 79
ip/src/sys.c

@@ -1126,83 +1126,6 @@ static void mem_check(void)
     }
 }
 
-//https://blog.csdn.net/weixin_47604497/article/details/136913868
-#include <linux/watchdog.h>
-static int wdog_fd=-1;
-static int wdog_is_en(void)
-{
-    GlobalDeviceManager *dm=&__globalDeviceManage;
-    MiscInfo_t *misc=&dm->_globalDevInfo.misc;
-
-    return misc->watchdog;
-}
-static int wdog_init(void)
-{
-    int r=0;
-
-    //if(wdog_is_en() == 0) {
-        char *path="/dev/watchdog";
-        
-        if(wdog_fd<0) {
-            wdog_fd = open(path, O_RDWR);   //O_WRONLY
-            log_d("wdog_fd = %d\n",wdog_fd);
-            if(wdog_fd<0) {
-                printf("___ %s open failed\n", path);
-                return -1;
-            }
-        }
-
-#if (CHIP_TYPE == CHIP_T113s)
-        int i,option,timeout;
-        struct watchdog_info info;
-        
-        option = WDIOS_DISABLECARD;
-        r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
-
-        r = ioctl(wdog_fd, WDIOC_GETSUPPORT, &info);
-        if(r<0) {
-            printf("___ %s getsupport failed\n", path);
-            return -1;
-        }
-        printf("___ watchdog options: 0x%x\n", info.options&WDIOC_SETTIMEOUT);
-
-        timeout = 40;
-        r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &timeout);
-        if(r) {
-            printf("______set__________ wdog set timeout: %d failed, errno: %d\n", timeout, errno);
-        }
-
-        option = WDIOS_ENABLECARD;
-        r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
-#endif
-//    }
-
-    return r;
-}
-
-
-
-static int wdog_feed(void)
-{
-    int r=0;
-
-    //if(wdog_is_en()) {
-        r = ioctl(wdog_fd, WDIOC_KEEPALIVE, 0);
-
-        //int t1=200,t2=0;
-        //r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &t1);
-        //printf("______set__________ wdog timeout: %d, errno: %d\n", r, errno);
-        
-        //r = ioctl(wdog_fd, WDIOC_GETTIMEOUT, &t2);
-        //printf("________________ wdog timeout: %d\n", t2);
-    //}
-
-    return r;
-}
-
-
-
-
 
 
 static void* polling_thread(void *arg)
@@ -1211,7 +1134,6 @@ static void* polling_thread(void *arg)
 
     while(h->quit==0) {
         mem_check();
-        wdog_feed();
         sleep(1);
     }
     pthread_exit(NULL);
@@ -1221,7 +1143,6 @@ static void* polling_thread(void *arg)
 int sys_init(void)
 {
     //userShellInit();
-    wdog_init();
     initLogger();
     lock_s_init();