Kaynağa Gözat

修改级联bug
暂时屏蔽dhcp和升级
为数据库添加断路开关表

guohui 2 yıl önce
ebeveyn
işleme
89101dedc2

BIN
cust_data/db/ac_i1_o1_chinese.db


BIN
cust_data/db/ac_i1_o1_english.db


BIN
cust_data/db/ac_i1_o1_russian.db


BIN
cust_data/db/ac_i3_o1_chinese.db


BIN
cust_data/db/ac_i3_o1_russian.db


BIN
cust_data/db/ac_i3_o3_chinese.db


BIN
cust_data/db/dc_i_dc_o_chinese.db


+ 1 - 1
output/t113i/etc/init.d/rcS

@@ -31,7 +31,7 @@ mdev -s
 /etc/adb_conf.sh start &
 #/usr/sbin/dnsmasq
 /usr/sbin/smartMonitor.sh &
-/usr/sbin/smartUPG &
+#/usr/sbin/smartUPG &
 
 tinymix set "ADC2 Input MIC2 Boost Switch" 1 > /dev/null
 tinymix set "ADC3 Input MIC3 Boost Switch" 1 > /dev/null

+ 4 - 1
pro/src/app.c

@@ -1518,6 +1518,9 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
             log_i("all chn data inserted ok.\n");
         }        
     }
+
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list_Tree_AC);
+    
     if (_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree
     ||_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One
     ||_globalDeviceManager->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_One_B
@@ -1528,7 +1531,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
         _globalDeviceManager->_all_ctrl_board[0].product_saddr = 0;
         _globalDeviceManager->_all_ctrl_board[0].product_number = -1;
         _globalDeviceManager->_all_ctrl_board[0].product_type = -1;
-        INIT_LIST_HEAD(&_globalDeviceManager->_globalPowerManger.list_Tree_AC);
+        
         // 填充三相表
         for (size_t TreeACindex = 0; TreeACindex < 3; TreeACindex++)
         {

+ 11 - 6
pro/src/appweb_handle.c

@@ -169,12 +169,15 @@ static int upload_handle(void *conn, char *path)
         printf("filename: %s length: %lu bytes\n", name, (unsigned long) part.body.len);
 
         if (mg_path_is_sane(mg_str(path))) {
-            mg_file_write(&mg_fs_posix, path, part.body.buf, part.body.len);
-            total_bytes += part.body.len;
-            r = 0;
+            bool wr = mg_file_write(&mg_fs_posix, path, part.body.buf, part.body.len);
+            printf("____ mg_file_write %d\n", wr);
+            if(wr) {
+                total_bytes += part.body.len;
+                r = 0;
+            }
         }
     }
-    //printf("___ upload file to %s %d\n", path, total_bytes);
+    printf("___ upload file to %s %d\n", path, total_bytes);
 
     return r;
 }
@@ -2511,7 +2514,7 @@ static void communicationManagement(void *conn)
         int ipv=strstr(reqInfo.type, "WkIPV4Save")?IP_V4:IP_V6;
         
         int mode = atoi(info2->mode);
-        if(ipv==IP_V4) {
+        if(ipv==IP_V4 && mode==IP_STATIC) {
             info->mode = mode;
             
             if(info2->ipaddr)   strcpy(info->ip_address, info2->ipaddr);
@@ -3950,6 +3953,8 @@ static void equipmentMintenance(void *conn)
     }
     else if (strcmp(_Over_equipment_mintenance.type,"resetChannel") == 0)
     {
+        http_reply(conn, 200, ack_str);
+
         //__globalDeviceManage._ReloadChm_flag=true;
         pthread_mutex_lock(&__globalDeviceManage._power_update);
         ResetChmData();
@@ -3958,7 +3963,7 @@ static void equipmentMintenance(void *conn)
     }
 
     cJSON_Delete(cjson);
-    int r = http_reply(conn, 200, ack_str);
+    http_reply(conn, 200, ack_str);
     cJSON_free((void*)ack_str);
 }
 

+ 5 - 7
pro/src/cascade.c

@@ -175,7 +175,9 @@ static int slave_get_info(cascade_handle_t *cas)
             info->ch[cnt].product_ch_status = tmp->product_ch_status;
             info->ch[cnt].start_delay = tmp->product_ch_start_delay;
             info->ch[cnt].stop_delay  = tmp->product_ch_stop_delay;
-            if (tmp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B) {
+
+            info->ch[cnt].chinfo = tmp->_PowerInfo;
+            if (tmp->product_ch_type==TREE_AC_TYPE||dm->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B) {
                 cnt2 = 0;
                 list_for_each_entry(tmp3, &tmp->list_Tree_AC, list_Tree_AC)
                 {
@@ -187,9 +189,6 @@ static int slave_get_info(cascade_handle_t *cas)
                     cnt2++;
                 }
             }
-            else {
-                info->ch[cnt].pinfo[0].power = tmp->_PowerInfo;
-            }
             cnt++;
         }
     }
@@ -1189,6 +1188,7 @@ static int power_update(cascade_handle_t *cas)
         cnt = 0;
         list_for_each_entry(tmp, &dm2->_globalPowerManger.list, list)
         {
+            tmp->_PowerInfo = info->ch[cnt].chinfo;
             if(tmp->product_ch_type==TREE_AC_TYPE||info->prod.product_pwr_type==SmartPDU_Tree_AC_One_B) {
                 if(list_empty(&tmp->list_Tree_AC)) {
                     continue;
@@ -1200,9 +1200,6 @@ static int power_update(cascade_handle_t *cas)
                     tmp3->_PowerInfo = info->ch[cnt].pinfo[cnt2++].power;
                 }
             }
-            else {
-                tmp->_PowerInfo = info->ch[cnt].pinfo[0].power;
-            }
             cnt++;
         }
     }
@@ -1405,6 +1402,7 @@ static int master_query(cascade_handle_t *cas)
             if(cas->sBreaker.cnt == 0)
             {
                 breaker_clear(cas);
+                cmd->cmd = CASCADE_CMD_QUERY_CH;
                 return -1;
             }
             rdata.dlen = sizeof(breaker_info_t)-sizeof(breaker_channel_info_t)*(CH_MAX-cas->sBreaker.cnt);

+ 1 - 0
pro/src/cascade.h

@@ -150,6 +150,7 @@ typedef struct {
     uint8_t         product_ch_id;
     uint8_t         product_ch_status;
     
+    PowerInfo       chinfo;
     power_info_t    pinfo[3];
     uint16_t        start_delay;
     uint16_t        stop_delay;

+ 2 - 2
pro/src/json_handle.c

@@ -3562,7 +3562,7 @@ char* ws_over_status_ack_to_json(int type,_OverAllPwrAckInfo* _over_all_pwr_back
 /// @param type 
 /// @param _over_chn_pwr_back_info 
 /// @return 
-char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_info)
+char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_info, GlobalDeviceManager *gdm)
 {
     char* str = NULL;
     char temp[32] = {0};
@@ -3611,7 +3611,7 @@ char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_
         cJSON_AddItemToObject(sub_data_root_array, "data", data_filed);
         sprintf(temp, "%d", _chnPwrTemp->status);
         cJSON_AddStringToObject(data_filed,"productChStatus",temp);
-        if (_chnPwrTemp->product_type == TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
+        if (_chnPwrTemp->product_type == TREE_AC_TYPE||gdm->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
         {
             if (_chnPwrTemp->product_phType >= 0 && _chnPwrTemp->product_phType < 3)
             {

+ 1 - 1
pro/src/json_handle.h

@@ -594,7 +594,7 @@ cJSON* json_to_service_manage(const char* str,_ServiceManageRequestInfo* _servic
 cJSON* json_to_user_manage(const char* str,_UserRoleManageInfo* _UserRoleManageRequestInfo);
 
 char* ws_over_status_ack_to_json(int type,_OverAllPwrAckInfo* _over_all_pwr_back_info);
-char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_info);
+char* ws_chn_status_ack_to_json(int type,_OverChnPwrAckInfo* _over_chn_pwr_back_info,GlobalDeviceManager *gdm);
 
 int json_to_switch_language(const char* str);
 

+ 2 - 2
pro/src/sqlite_handle.c

@@ -402,12 +402,12 @@ int dev_search_latest_power_All_info(GlobalDeviceManager* globalDeviceManger,_Ov
             /* code */
         }
         
-        if (_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
+        if (_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||globalDeviceManger->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
         {
             GlobalTreeACManager* _TreeACTemp=NULL;
             int nStatus=-1;//-1则状态不变,0、1则是子状态
             //判断是否三相单输出情况下
-            if(_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||__globalDeviceManage._global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
+            if(_globalPowerMangerTemp->product_ch_type==TREE_AC_TYPE||globalDeviceManger->_global_device_info->product_pwr_type == SmartPDU_Tree_AC_One_B)
             {
                 list_for_each_entry(_TreeACTemp, &_globalPowerMangerTemp->list_Tree_AC, list_Tree_AC)
                 {

+ 123 - 1
pro/src/sys.c

@@ -10,6 +10,7 @@
 #include "paras.h"
 #include "cfg.h"
 #include "file.h"
+#include "thread.h"
 #include "sqlite_handle.h"
 
 #if 0
@@ -182,6 +183,7 @@ int sys_get_path(char *path, char *name)
 #include <net/if.h>
 #include <ifaddrs.h>
 #include <netinet/in.h>
+#include <linux/if.h>
 #include <linux/if_link.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
@@ -750,7 +752,7 @@ static int set_net(NetworkInfo_t *para, int ipv)
     }
     free(fbuf);
     
-    set_dns(para->dns1, para->dns2);
+    //set_dns(para->dns1, para->dns2);
 
     return r;
 }
@@ -869,3 +871,123 @@ int sys_get_net(NetworkInfo_t *para, int ipVersion)
 }
 
 
+#define MAX_BUFFER_SIZE 4096
+static void* plug_thread(void *arg)
+{
+    int nlSock;
+    struct sockaddr_nl srcAddr;
+    struct nlmsghdr *nlMsg;
+    char buffer[MAX_BUFFER_SIZE];
+    int plug_in=0,plug_out=0;
+
+    printf("___plug_thread start\n");
+
+    nlSock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+    if (nlSock < 0) {
+        printf("Failed to create Netlink socket");
+        goto quit;
+    }
+
+    memset(&srcAddr, 0, sizeof(srcAddr));
+    srcAddr.nl_family = AF_NETLINK;
+    srcAddr.nl_groups = RTMGRP_LINK | RTMGRP_NOTIFY;
+
+    if (bind(nlSock, (struct sockaddr *)&srcAddr, sizeof(srcAddr)) < 0) {
+        perror("Failed to bind Netlink socket");
+        close(nlSock);
+        goto quit;
+    }
+
+	int flags = fcntl(nlSock, F_GETFL, 0);
+    fcntl(nlSock, F_SETFL, flags | O_NONBLOCK);
+
+    while (1) {
+        fd_set readSet;
+        FD_ZERO(&readSet);
+        FD_SET(nlSock, &readSet);
+
+        // 设置超时时间为 1 秒
+        struct timeval timeout;
+        timeout.tv_sec = 1;
+        timeout.tv_usec = 0;
+
+        // 监视 Netlink Socket 的可读状态
+        int result = select(nlSock + 1, &readSet, NULL, NULL, &timeout);
+        if (result == -1) {
+            perror("Failed to select");
+            goto quit;
+        } else if (result == 0) {
+            // 超时,没有新数据到达
+            //printf("Timeout\n");
+            continue;
+        }
+
+        if (FD_ISSET(nlSock, &readSet)) {
+            // 接收消息
+            int bytesRead = recv(nlSock, buffer, MAX_BUFFER_SIZE, 0);
+            if (bytesRead < 0) {
+                perror("Failed to receive message from Netlink socket");
+                close(nlSock);
+                goto quit;
+            }
+
+            // 遍历接收到的消息,获取到Netlink的消息头。
+            nlMsg = (struct nlmsghdr *)buffer;
+            while (NLMSG_OK(nlMsg, bytesRead)) {
+                if (nlMsg->nlmsg_type == NLMSG_DONE) {
+                    break;
+                }
+
+                if (nlMsg->nlmsg_type == RTM_NEWLINK || nlMsg->nlmsg_type == RTM_DELLINK) {
+                    //NLMSG_DATA()获取完整的ifinfomsg结构体的指针
+                    //根据消息头nlMsg获取到其后面的数据部分ifinfomsg结构体的指针
+                    struct ifinfomsg *ifInfo = (struct ifinfomsg *)NLMSG_DATA(nlMsg);
+                    if (ifInfo->ifi_family == AF_UNSPEC) {
+                        //获取路由信息的属性,以及消息负载的长度,通过这两个参数来判断本次的数据是否有效
+                        struct rtattr *attribute = IFLA_RTA(ifInfo);
+                        int attributeLen = IFLA_PAYLOAD(nlMsg);
+                        
+                        while (RTA_OK(attribute, attributeLen)) {
+                            char *ifaceName = (char *)RTA_DATA(attribute);
+                            if ((attribute->rta_type == IFLA_IFNAME) && (strcmp(ifaceName, "eth0")==0)) {
+                            
+                                //printf("____Interface: %s \n", ifaceName);
+                                if((ifInfo->ifi_flags & IFF_LOWER_UP)) {
+                                    if(plug_in==0) {
+                                        system("ifup eth0");
+                                        printf("____eth0 plug in\n");
+                                        plug_in = 1; plug_out = 0;
+                                    }
+                                }
+                                else  {
+                                    if(plug_out==0) {
+                                        system("ifdown eth0");
+                                        printf("____eth0 plug out\n");
+                                        plug_in = 0; plug_out = 1;
+                                    }
+                                }
+                            }
+                            attribute = RTA_NEXT(attribute, attributeLen);
+                        }
+                    }
+                }
+                nlMsg = NLMSG_NEXT(nlMsg, bytesRead);
+            }
+        }
+    }
+
+    close(nlSock);
+
+quit:
+    printf("___plug_thread exit\n");
+    pthread_exit(NULL);
+}
+
+
+int sys_init(void)
+{
+    //thread_start(THREAD_ID_PLUG, plug_thread, NULL, 4*MB, 0);
+
+    return 0;
+}
+

+ 1 - 1
pro/src/sys.h

@@ -17,7 +17,7 @@ enum {
 };
 
 
-
+int sys_init(void);
 int sys_reboot(void);
 int sys_set_factory(void);
 int sys_get_path(char *path, char *name);

+ 1 - 1
pro/src/thread.h

@@ -20,7 +20,7 @@ enum {
     THREAD_ID_SNMP,
     THREAD_ID_POWER,
     THREAD_ID_SENSOR,
-    THREAD_ID_UPDATE,
+    THREAD_ID_PLUG,
     THREAD_ID_CASCADE,
     THREAD_ID_SCAN,
     THREAD_ID_SHMW,

+ 4 - 1
pro/src/websocket_handle.c

@@ -89,6 +89,7 @@ static void web_update(ws_handle_t *wh)
     _OverChnPwrAckInfo chInfo;
     GlobalDeviceManager* gdm= &__globalDeviceManage;
     GlobalDeviceManager* gdm2=&__globalDeviceManage2;
+    GlobalDeviceManager* pdm=NULL;
 
     if(ws_is_online(wh))
     {
@@ -155,15 +156,17 @@ static void web_update(ws_handle_t *wh)
                 pthread_mutex_lock(&gdm->_power_update); 
                 nRetCh=dev_search_latest_power_All_info(gdm,&chInfo);
                 pthread_mutex_unlock(&gdm->_power_update);
+                pdm = gdm;
             }
             else {
                 cascade_lock();
                 nRetCh=dev_search_latest_power_All_info(gdm2,&chInfo);
                 cascade_unlock();
+                pdm = gdm2;
             }
             if (0 == nRetCh)
             {
-                json_str = ws_chn_status_ack_to_json(1, &chInfo);
+                json_str = ws_chn_status_ack_to_json(1, &chInfo, pdm);
                 ws_send_data(wh, json_str, strlen(json_str));
                 cJSON_free((void *)json_str);
             }