Explorar o código

Merge branch 'master' of https://gowone.dy.takin.cc/liyuezong/SmartPDCode

liyi hai 1 ano
pai
achega
b5f53f673c
Modificáronse 7 ficheiros con 249 adicións e 33 borrados
  1. 19 0
      pro/CMakeLists.txt
  2. BIN=BIN
      pro/mem/mem
  3. 154 0
      pro/mem/mem.c
  4. 35 2
      pro/src/app.c
  5. 1 0
      pro/src/cascade_slave_tcp.c
  6. 33 27
      pro/src/json_handle.c
  7. 7 4
      pro/src/switch_ctrl.c

+ 19 - 0
pro/CMakeLists.txt

@@ -146,6 +146,12 @@ set(UPG_SRC_LIST ${PROJECT_SOURCE_DIR}/upgrade/md5.c
 add_executable(smartUPG ${UPG_SRC_LIST})
 target_link_libraries(smartUPG -lc -lpthread)
 
+
+set(MEM_SRC_LIST ${PROJECT_SOURCE_DIR}/mem/mem.c)
+add_executable(memInfo ${MEM_SRC_LIST})
+target_link_libraries(memInfo -lc -lpthread)
+
+
 add_custom_command(TARGET smartUPG  POST_BUILD
                    COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/usr/sbin
                    COMMAND cp -upf  ${SRC_DIR}/smartUPG ${DST_DIR}/${CHIP}/pack_dir/usr/sbin)
@@ -154,6 +160,9 @@ add_custom_command(TARGET  smartPDU  POST_BUILD
                    COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/root/run/app
                    COMMAND cp -upf  ${SRC_DIR}/smartPDU ${DST_DIR}/${CHIP}/pack_dir/root/run/app)
 
+add_custom_command(TARGET  memInfo  POST_BUILD
+                   COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/root/run/app
+                   COMMAND cp -upf  ${SRC_DIR}/memInfo ${DST_DIR}/${CHIP}/pack_dir/root/run/app)
 
 
 #execute_process(COMMAND ${DST_DIR}/pack.sh)
@@ -308,6 +317,11 @@ set(PDU_SRC_LIST
                  ${PROJECT_SOURCE_DIR}/upgrade/upgrade.c)
 	add_executable(smartUPG ${UPG_SRC_LIST})
 	target_link_libraries(smartUPG -lc -lpthread)
+
+	set(MEM_SRC_LIST ${PROJECT_SOURCE_DIR}/mem/mem.c)
+	add_executable(memInfo ${MEM_SRC_LIST})
+	target_link_libraries(memInfo -lc -lpthread)
+
 	add_custom_command(TARGET smartUPG  POST_BUILD
 	COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/usr/sbin
 	COMMAND cp -upf  ${SRC_DIR}/smartUPG ${DST_DIR}/${CHIP}/pack_dir/usr/sbin)
@@ -316,4 +330,9 @@ set(PDU_SRC_LIST
 	COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/mnt/UDISK/app
 	COMMAND cp -upf  ${SRC_DIR}/smartPDU ${DST_DIR}/${CHIP}/pack_dir/mnt/UDISK/app)
 
+
+	add_custom_command(TARGET  memInfo  POST_BUILD
+                   COMMAND mkdir -p ${DST_DIR}/${CHIP}/pack_dir/root/run/app
+                   COMMAND cp -upf  ${SRC_DIR}/memInfo ${DST_DIR}/${CHIP}/pack_dir/root/run/app)
+
 endif()

BIN=BIN
pro/mem/mem


+ 154 - 0
pro/mem/mem.c

@@ -0,0 +1,154 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/sysinfo.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <signal.h>
+
+#define MAX_LINE 256
+#define DEFAULT_INTERVAL 10
+#define DEFAULT_DURATION 0
+#define FLUSH_INTERVAL 5  // 每5次写入刷新一次文件
+
+volatile sig_atomic_t stop = 0;
+
+void handle_signal(int sig) {
+    stop = 1;
+}
+
+// 低内存方式获取系统内存信息
+int get_memory_info(unsigned long* total, unsigned long* available, 
+                   unsigned long* buffers, unsigned long* cached) {
+    FILE* fp = fopen("/proc/meminfo", "r");
+    if (!fp) return -1;
+
+    char line[MAX_LINE];
+    *total = *available = *buffers = *cached = 0;
+
+    while (fgets(line, sizeof(line), fp)) {
+        if (strncmp(line, "MemTotal:", 9) == 0) sscanf(line+9, "%lu", total);
+        else if (strncmp(line, "MemAvailable:", 13) == 0) sscanf(line+13, "%lu", available);
+        else if (strncmp(line, "Buffers:", 8) == 0) sscanf(line+8, "%lu", buffers);
+        else if (strncmp(line, "Cached:", 7) == 0) sscanf(line+7, "%lu", cached);
+    }
+
+    fclose(fp);
+    return 0;
+}
+
+// 低内存方式获取进程内存信息
+int get_process_mem(pid_t pid, unsigned long* rss, unsigned long* vsz) {
+    char path[MAX_LINE];
+    snprintf(path, sizeof(path), "/proc/%d/statm", pid);
+
+    FILE* fp = fopen(path, "r");
+    if (!fp) return -1;
+
+    if (fscanf(fp, "%lu %lu", vsz, rss) != 2) {
+        fclose(fp);
+        return -1;
+    }
+
+    fclose(fp);
+    
+    long page_kb = sysconf(_SC_PAGESIZE) / 1024;
+    *vsz *= page_kb;
+    *rss *= page_kb;
+    
+    return 0;
+}
+
+// 最小化内存占用的CSV写入
+void write_csv_entry(FILE* csv, const char* name, pid_t pid, 
+                    unsigned long rss, unsigned long vsz,
+                    unsigned long total, unsigned long avail,
+                    unsigned long buf, unsigned long cache) {
+    time_t now = time(NULL);
+    struct tm* tm = localtime(&now);
+    
+    // 直接格式化输出到文件,减少内存缓冲
+    fprintf(csv, "%04d-%02d-%02d %02d:%02d:%02d,%s,%d,%lu,%lu,%lu,%lu,%lu,%lu\n",
+            tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
+            tm->tm_hour, tm->tm_min, tm->tm_sec,
+            name, pid, rss, vsz, total, avail, buf, cache);
+}
+
+int main(int argc, char** argv) {
+    if (argc < 4) {
+        printf("Usage: %s <name> <pid> <output.csv> [interval=10] [duration=0]\n", argv[0]);
+        return 1;
+    }
+
+    signal(SIGINT, handle_signal);
+    signal(SIGTERM, handle_signal);
+
+    const char* name = argv[1];
+    pid_t pid = atoi(argv[2]);
+    const char* outfile = argv[3];
+    int interval = argc > 4 ? atoi(argv[4]) : DEFAULT_INTERVAL;
+    int duration = argc > 5 ? atoi(argv[5]) : DEFAULT_DURATION;
+
+    if (interval <= 0) interval = DEFAULT_INTERVAL;
+
+    // 以最小缓冲模式打开文件
+    FILE* csv = fopen(outfile, "a");
+    if (!csv) {
+        perror("Failed to open output file");
+        return 1;
+    }
+
+    // 设置文件缓冲模式为行缓冲
+    setvbuf(csv, NULL, _IOLBF, 0);
+
+    // 如果是新文件,写入表头
+    if (ftell(csv) == 0) {
+        fprintf(csv, "Timestamp,Process,PID,RSS(KB),VSZ(KB),Total(KB),Available(KB),Buffers(KB),Cached(KB)\n");
+    }
+
+    time_t start = time(NULL);
+    int count = 0;
+
+    printf("Monitoring %s (PID: %d), logging to %s\n", name, pid, outfile);
+    printf("Interval: %ds, Duration: %ds\n", interval, duration);
+
+    while (!stop) {
+        unsigned long rss, vsz, total, avail, buf, cache;
+        
+        if (get_process_mem(pid, &rss, &vsz)) {
+            fprintf(stderr, "Failed to get process memory\n");
+        } else if (get_memory_info(&total, &avail, &buf, &cache)) {
+            fprintf(stderr, "Failed to get system memory\n");
+        } else {
+            write_csv_entry(csv, name, pid, rss, vsz, total, avail, buf, cache);
+            count++;
+            
+            // 定期刷新文件缓冲
+            if (count % FLUSH_INTERVAL == 0) {
+                fflush(csv);
+            }
+            
+            printf(".");
+            fflush(stdout);
+        }
+
+        // 检查是否达到总时长
+        if (duration > 0 && (time(NULL) - start) >= duration) {
+            printf("\nReached specified duration\n");
+            break;
+        }
+
+        // 更精确的睡眠控制
+        time_t next = time(NULL) + interval;
+        while (time(NULL) < next && !stop) {
+            sleep(1);
+        }
+    }
+
+    fclose(csv);
+    printf("\nMonitoring stopped. %d records written.\n", count);
+    return 0;
+}

+ 35 - 2
pro/src/app.c

@@ -40,6 +40,7 @@
 static void* power_thread(void* arg)
 {
     int ret = 0 ;
+    bool isFirstRun=false;//标记地第一轮运行
     GlobalPowerManger* _globalPowerMangerTemp = NULL ;
     GlobalPowerInfo _globalPowerInfo ;
     GlobalPowerInfo _globalTotalPowerInfo ; //总电源信息
@@ -68,7 +69,8 @@ static void* power_thread(void* arg)
 
     dev_search_last_Index(_globalDeviceManager->db, &lastIndex, tabPower);       // 查询日志最大点
     dev_search_last_Index(_globalDeviceManager->db, &lastIndex3, tabPower3);      // 查询日志最大点
-
+    //初始化启动延时
+    log_d("START_INI_DELAY");
     list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
     {
         ret = g_switch_set_all_start_time_delay(&__globalDeviceManage._globalRelaySampManger,_globalPowerMangerTemp->product_ch_type,_globalPowerMangerTemp->product_saddr,_globalPowerMangerTemp->product_ch_addr,_globalPowerMangerTemp->product_ch_start_delay);
@@ -99,7 +101,37 @@ static void* power_thread(void* arg)
             }
         }
     }
-
+    // 初始化阈值信息
+    log_d("START_INI_TRESTHOLD");
+    if (__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Tree || __globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_One || __globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_Tree_AC_Two)
+    {
+        log_d("TRESTHOLD_TAC_INI");
+        list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
+        {
+            GlobalTreeACManager *_pTreeACPowerMangerTemp = NULL;
+            list_for_each_entry(_pTreeACPowerMangerTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
+            {
+                _pTreeACPowerMangerTemp->global_over_manager = _globalPowerMangerTemp->global_over_manager;
+                ret = g_switch_set_all_single_threshold(&__globalDeviceManage._globalRelaySampManger,
+                                                        _globalPowerMangerTemp->product_ch_type,
+                                                        _pTreeACPowerMangerTemp->product_saddr,
+                                                        _pTreeACPowerMangerTemp->product_ch_addr,
+                                                        _globalPowerMangerTemp, 0);
+            }
+        }
+    }
+    else
+    {
+        log_d("TRESTHOLD_AC/DC_INI");
+        list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
+        {
+            ret = g_switch_set_all_single_threshold(&__globalDeviceManage._globalRelaySampManger,
+                                                    _globalPowerMangerTemp->product_ch_type,
+                                                    _globalPowerMangerTemp->product_saddr,
+                                                    _globalPowerMangerTemp->product_ch_addr,
+                                                    _globalPowerMangerTemp,0);
+        }
+    }
     //采集线程
     while (h->quit==0)
     {
@@ -1091,6 +1123,7 @@ static void* power_thread(void* arg)
             }
         }
 
+
         //all 
         if(__globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_AC
          || __globalDeviceManage._globalDevInfo.product.pwr_type == SmartPDU_DC)

+ 1 - 0
pro/src/cascade_slave_tcp.c

@@ -138,6 +138,7 @@ static void *pthread_handle_tcp(void *arg)
     }
     modbus_close(mb->ctx);
     modbus_free(mb->ctx);
+    close(fd);
     mb->ctx = 0;
     free(mb);
     mb = NULL;

+ 33 - 27
pro/src/json_handle.c

@@ -6048,38 +6048,44 @@ char* service_mqtt_ack_to_json(mqtt_info_t* info,int nWSType)
 
 
 #if 1
-    cJSON *tmp,*array=cJSON_CreateArray();
+    cJSON *array=cJSON_CreateArray();
     if(array) {
         
         for(int i=0; i<MQTT_SER_MAX; i++) {
-            mqtt_server_t *ser=&info->ser[i];
-            cJSON *tmp=cJSON_CreateObject();
-            if(tmp && (ser->id==i)) {
-                sprintf(buf, "%d", ser->id);
-                cJSON_AddStringToObject(tmp,"idx", buf);
-
-                sprintf(buf, "%d", ser->mode);
-                cJSON_AddStringToObject(tmp,"mode", buf);
-
-                cJSON_AddStringToObject(tmp,"serverName", ser->name);
-                cJSON_AddStringToObject(tmp,"ip", ser->server);
-                cJSON_AddStringToObject(tmp,"port", ser->port);
-                cJSON_AddStringToObject(tmp,"yhm", ser->user);
-                cJSON_AddStringToObject(tmp,"mm", ser->password);
-                cJSON_AddStringToObject(tmp,"kfdId", ser->cid);
-
-                if(strlen(ser->cert)>0) {
-                    strcpy(buf, "CERT");
-                }
-                else {
-                    strcpy(buf, "");
-                }
-                cJSON_AddStringToObject(tmp,"zs", buf);
+            mqtt_server_t *ser = &info->ser[i];
+            if (ser->id == i)
+            {
+                cJSON *tmp = cJSON_CreateObject();
+                if (tmp)
+                {
+                    sprintf(buf, "%d", ser->id);
+                    cJSON_AddStringToObject(tmp, "idx", buf);
+
+                    sprintf(buf, "%d", ser->mode);
+                    cJSON_AddStringToObject(tmp, "mode", buf);
+
+                    cJSON_AddStringToObject(tmp, "serverName", ser->name);
+                    cJSON_AddStringToObject(tmp, "ip", ser->server);
+                    cJSON_AddStringToObject(tmp, "port", ser->port);
+                    cJSON_AddStringToObject(tmp, "yhm", ser->user);
+                    cJSON_AddStringToObject(tmp, "mm", ser->password);
+                    cJSON_AddStringToObject(tmp, "kfdId", ser->cid);
 
-                sprintf(buf, "%d", ser->status?1:2);
-                cJSON_AddStringToObject(tmp,"ljzt", buf);
+                    if (strlen(ser->cert) > 0)
+                    {
+                        strcpy(buf, "CERT");
+                    }
+                    else
+                    {
+                        strcpy(buf, "");
+                    }
+                    cJSON_AddStringToObject(tmp, "zs", buf);
 
-                cJSON_AddItemToArray(array, tmp);
+                    sprintf(buf, "%d", ser->status ? 1 : 2);
+                    cJSON_AddStringToObject(tmp, "ljzt", buf);
+
+                    cJSON_AddItemToArray(array, tmp);
+                }
             }
         }
 

+ 7 - 4
pro/src/switch_ctrl.c

@@ -566,7 +566,7 @@ int g_switch_set_ac_single_threshold(void* manger,int saddr,char chn,GlobalOverM
 
     int ret= g_modbus_write_x_reg(manger,saddr,offset,16,data_buf);
 
-    //log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
+    log_d("AC_threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
     return ret;
 }
 int g_switch_set_ac_reset(void *manger, int saddr)
@@ -1140,6 +1140,7 @@ int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,
     case AC_SINGLE_B_TYPE:
     {
         ret = g_switch_set_ac_single_threshold(manger, saddr, (chn - 1), _global_over_manager);
+        log_d("AC_threshold_Addr:%d OffSet:%d Ret=%d",saddr,(chn - 1),ret);
         if(setCh)  ret = g_switch_set_ac_alarm_ctrl(manger, saddr, (chn - 1), _global_over_manager);
     }
     break;
@@ -1155,7 +1156,7 @@ int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,
         ret = g_switch_set_dcpdu_max_cur_threshold(manger, saddr, (chn - 1), _global_over_manager);
         ret = g_switch_set_dcpdu_max_power_threshold(manger, saddr, (chn - 1), _global_over_manager);
         ret = g_switch_set_dcpdu_max_pwrcon_threshold(manger, saddr, (chn - 1), _global_over_manager);
-
+        log_d("DC_threshold_Addr:%d OffSet:%d Ret=%d",saddr,(chn - 1),ret);
         if(setCh)  ret = g_switch_set_dcpdu_alarm_ctrl(manger, saddr, (chn - 1), _global_over_manager);
         
     }
@@ -1166,6 +1167,7 @@ int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,
         if (chn == 0)
         {
             ret = g_switch_set_t_ac_in_threshold(manger, saddr, _global_over_manager);
+            log_d("TAC_Ch_threshold_Addr:%d OffSet:%d Ret=%d",saddr,(chn - 1),ret);
             if(setCh) {
                 ret = g_switch_set_t_ac_alarm_ctrl(manger, saddr, (chn - 1), _global_over_manager);
                 if (ret < 0)
@@ -1176,6 +1178,7 @@ int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,
         }
         else
         {
+
             ret = g_switch_set_t_ac_max_vol_threshold(manger, saddr, (chn - 1), _global_over_manager);
             if (ret < 0)
             {
@@ -1201,7 +1204,7 @@ int g_switch_set_all_single_threshold(void* manger,int ntype,int saddr,char chn,
             {
                 log_e("Threshold Set Error=%s", modbus_strerror(errno));
             }
-
+            log_d("TAC_Ph_threshold_Addr:%d OffSet:%d Ret=%d",saddr,(chn - 1),ret);
             if(setCh) {
                 ret = g_switch_set_t_ac_alarm_ctrl(manger, saddr, (chn - 1), _global_over_manager);
                 if (ret < 0)
@@ -3520,7 +3523,7 @@ int g_switch_get_ac_breaker_info(void* manger,int saddr,GlobalBreakerManager* _b
     ret = g_modbus_read_x_reg(manger, saddr, offset, 1, data_temp);
     if (ret < 0)
     {
-        log_w("g_switch_get_ac_breaker_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
+        //log_w("g_switch_get_ac_breaker_info:%d OffSet:%d Ret=%d:%s", saddr, offset, ret, modbus_strerror(errno));
         // log_d("threshold_Addr:%d OffSet:%d Ret=%d",saddr,offset,ret);
         return ret;
     }