Просмотр исходного кода

1、改snmp_nms为netswitch
2、添加交换机控制逻辑

guohui лет назад: 2
Родитель
Сommit
8c7af36f3a

+ 1 - 1
output/push/push.bat

@@ -1,7 +1,7 @@
 @ECHO OFF
 
 SET TARGET=pdutar
-SET IP=192.168.1.131
+SET IP=192.168.1.132
 
 SET CURDIR=%~dp0
 SET CURDIR=%CURDIR:~0,-1%

+ 32 - 24
output/push/tools/script.sh

@@ -2,9 +2,22 @@
 
 obj=pdutar
 
+function is_ipv6()
+{
+    var="$1"
+    regex='^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$'
+
+    if [[ $var =~ $regex ]]; then
+        return 1
+    else
+        return 0
+    fi
+}
+
 function kill_all()
 {
-    killall  RestartApp.sh smartMornitor.sh smartMonitor.sh main  snmpd  Qt_Test  smartPDU
+    killall  RestartApp.sh smartMornitor.sh smartMonitor.sh main  snmpd  Qt_Test  smartPDU  smartUPG
+
 }
 function rm_old()
 {
@@ -15,28 +28,23 @@ function rm_old()
     rm -f  /usr/sbin/smartMornitor.sh
     rm -f  /usr/libmpr.so /usr/libhttp.so /usr/lib/libesp.o /usr/lib/libmodbus*
 }
-function chg_net()
+function set_net()
 {
-   curIP=`ifconfig eth0 |sed -n '/inet addr/s/^[^:]*:\([0-9.]\{7,15\}\) .*/\1/p'`
-   text="# interface file auto-generated by buildroot\n\
-\n\
-auto lo\n\
-iface lo inet loopback\n\
-\n\
-auto eth0\n\
-iface eth0 inet static\n\
-  address $curIP\n\
-  netmask 255.255.255.0\n\
-  gateway 192.168.1.1\n\
-\n\
-auto eth1\n\
-iface eth1 inet dhcp\n\
-  pre-up /etc/network/nfs_check\n\
-  wait-delay 5\n\
-  hostname $(hostname)\n"
-
-  echo -e $text > /etc/network/interfaces
-  ifconfig eth0 $curIP up
+   ip4=`ip addr show dev eth0 | sed -e's/^.*inet \([^ ]*\)\/.*$/\1/;t;d'`
+   ip6=`ip addr show dev eth0 | sed -e's/^.*inet6 \([^ ]*\)\/.*$/\1/;t;d'`
+   str_lo="auto lo\niface lo inet loopback\n\n"
+   str_e0="auto eth0\niface eth0 inet static\naddress $ip4\nnetmask 255.255.255.0\ngateway 192.168.1.1\n\n"
+   
+   if [ "$ip6" = "" ]; then
+      echo ___$ip6
+   fi
+   
+   str_e1="auto eth1\niface eth1 inet dhcp\npre-up /etc/network/nfs_check\nwait-delay 5\nhostname $(hostname)\n"
+
+   netfile=/etc/network/interfaces
+   echo -e $str_lo > $netfile
+   echo -e $str_e0 >> $netfile
+   echo -e $str_e1 >> $netfile
 }
 
 
@@ -52,11 +60,11 @@ echo release $obj ...
 tar -xpf  $obj  -C  /  >/dev/null  2>&1
 rm $obj
 
-chg_net
+#set_net
 
 echo +++++++ upgrade ok! +++++++
 echo reboot device now ... 
-reboot  -f
+reboot
 
 
 

+ 1 - 1
pro/CMakeLists.txt

@@ -75,7 +75,7 @@ set(PDU_SRC_LIST
     ${PROJECT_SOURCE_DIR}/src/cascade_slave.c
 	${PROJECT_SOURCE_DIR}/src/upg.c
 	${PROJECT_SOURCE_DIR}/src/file.c
-	${PROJECT_SOURCE_DIR}/src/snmp_nms.c
+	${PROJECT_SOURCE_DIR}/src/netswitch.c
 	${PROJECT_SOURCE_DIR}/src/main.c
 
 	${PROJECT_SOURCE_DIR}/src/language_hashmap.c

+ 2 - 0
pro/src/app.c

@@ -15,6 +15,7 @@
 #include "cascade.h"
 #include "upg.h"
 #include "sys.h"
+#include "netswitch.h"
 #include "breaker_detection.h"
 #include <sys/mman.h>
 #include <string.h>
@@ -2275,6 +2276,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     appweb_init();
 
     cascade_init();
+    //netswitch_init();
 
     //通知smartUPG,app已经运行起来
     upg_init();

+ 7 - 6
pro/src/common.h

@@ -873,15 +873,16 @@ typedef struct GlobalBreakerManager{
 
 
 typedef struct {
-    uint16_t        id;
-    uint16_t        up;
+    int             id;
+    int             up;
+    char            ip[48];
     char            mac[20];
-    char            ip4[24];
-    char            ip6[48];
+    char            desc[128];
 }port_data_t;
 
 typedef struct {
-    #define SW_PORT_MAX   28
+    #define SW_PORT_MAX         24      //28
+    #define SW_PORT_START       99329
     port_data_t     port[SW_PORT_MAX];
 }switch_data_t;
 
@@ -915,7 +916,7 @@ typedef struct
     int                 nTreeACLshow; //三项总数据显示L1=0,L2=1,L3=2
     pthread_t           snmp_agent_thread;//SNMP代理线程
     bool                _ReloadChm_flag; //重新加载端口数据
-    GlobalPowerCtrlBoard _all_ctrl_board[16]; //所有控制板
+    GlobalPowerCtrlBoard _all_ctrl_board[MAX_CHN_COUNT]; //所有控制板
     LowConf*            _RS485LowConfData;//485Data
       //传感器
     struct modbus_slave_read_reg g_modebus_read;

+ 4 - 4
pro/src/main.c

@@ -1,6 +1,4 @@
 #include <stdio.h>
-#include <pthread.h>
-
 #include "common.h"
 #include "appweb_handle.h"
 #include "modbus_handle.h"
@@ -10,7 +8,7 @@
 #include "switch_ctrl.h"
 #include "app.h"
 #include "shell.h"
-
+#include "sys.h"
 #include "json_handle.h"
 
 //static GlobalDeviceManager* _globalDeviceManager;
@@ -49,7 +47,6 @@ static void dev_ctrl_main(void* arg)
     }
 }
 
-
 //主函数
 int main(int argc,char* argv[])
 {
@@ -69,6 +66,9 @@ int main(int argc,char* argv[])
     //初始化日志组件
     initLogger();
     //初始化系统
+
+    //sys_init();
+
     _global_device_manage_init(&__globalDeviceManage);
 
     return 0;

+ 251 - 77
pro/src/snmp_nms.c

@@ -1,8 +1,10 @@
 #include <net-snmp/net-snmp-config.h>
 #include <net-snmp/net-snmp-includes.h>
-#include "snmp_nms.h"
+#include "netswitch.h"
 #include "sys.h"
 #include "elog.h"
+#include "thread.h"
+#include "sqlite_handle.h"
 
 #if 0
     #define LOGD            log_d
@@ -15,24 +17,18 @@
 #endif
 
 
+#define SW_HOST_IP          "192.168.0.1"
 #define NETSNMP_DS_APP_DONT_FIX_PDUS 0
 
-typedef struct {
-    int  flag;
-}snmp_handle_t;
-static snmp_handle_t snHandle;
 
-int snmp_nms_init(void)
-{
-    snmp_handle_t   *sh=&snHandle;
 
-    SOCK_STARTUP;
-    
-    return 0;
-}
+typedef struct {
+    switch_data_t   sw;
+}ns_handle_t;
+static ns_handle_t nsHandle;
 
+////////////////////////////////////////////////////////////////////////
 
-//snmp_get("public","192.168.1.133","1.3.6.1.2.1.1.1.0");
 static netsnmp_variable_list* snmp_getx(int version, char *community, char *ip, char *oid_str, int msgtype)
 {
     int             count;
@@ -141,8 +137,90 @@ static netsnmp_variable_list* snmp_getbulk(int version, char *community, char *i
 
 
 
-#define SW_HOST_IP      "192.168.0.1"
-#define SW_PORT_START   99329
+typedef struct {
+    char  chr[2];
+}seg_t;
+typedef struct {
+    int        cnt;
+    seg_t      seg[20];
+}mac_data_t;
+
+static int parse_mac(char *ss, mac_data_t *mac)
+{
+    char sp=0;
+    int i=0,j=0,idx=0;
+    
+    if(strstr(ss, "-")) {
+        sp = '-';
+    }
+    else if(strstr(ss, " ")) {
+        sp = ' ';
+    }
+    else if(strstr(ss, ":")) {
+        sp = ':';
+    }
+    else {
+        LOGE("___ wrong mac addr\n");
+        return -1;
+    }
+
+    memset(mac, 0, sizeof(mac_data_t));
+    while(ss[i]) {
+        if(ss[i]==sp) {
+            idx++;
+            j=0;
+        }
+        else {
+            mac->seg[idx].chr[j++] = (char)toupper(ss[i]);
+        }
+        i++;
+    }
+    mac->cnt = idx+1;
+
+    return 0;
+}
+
+static int get_mac(char *ss, char *mac)
+{
+    int i,j,r;
+    mac_data_t mdat;
+    
+    r = parse_mac(ss, &mdat);
+    if(r) {
+        return -1;
+    }
+
+    j = 0;
+    for(i=0; i<mdat.cnt; i++) {
+        if(mdat.seg[i].chr[1]==0) {
+            mac[j++] = '0';
+            mac[j++] = mdat.seg[i].chr[0];
+        }
+        else {
+            mac[j++] = mdat.seg[i].chr[0];
+            mac[j++] = mdat.seg[i].chr[1];
+        }
+        if(i!=mdat.cnt-1) {
+            mac[j++] = ':';
+        }
+    }
+    mac[j] = 0;
+
+    return 0;
+}
+static port_data_t* get_port(switch_data_t *sw, char *mac)
+{
+    int i;
+    port_data_t *pt=NULL;
+
+    for(i=0; i<SW_PORT_MAX; i++) {
+        pt = &sw->port[i];
+        if(strcmp(mac, pt->mac)==0) {
+            break;
+        }
+    }
+    return pt;
+}
 
 static char *get_string(netsnmp_variable_list *var)
 {
@@ -155,7 +233,7 @@ static char *get_string(netsnmp_variable_list *var)
         return NULL;
     }
 
-    if (sprint_realloc_value(&buf, &buflen, &outlen, 1, var->name, var->name_length, var)) {
+    if (sprint_realloc_variable(&buf, &buflen, &outlen, 1, var->name, var->name_length, var)) {
         return (char*)buf;
     } else {
         free(buf);
@@ -163,46 +241,52 @@ static char *get_string(netsnmp_variable_list *var)
     
     return NULL;
 }
-static void sw_print(char *s, switch_data_t *sw)
+static void sw_init(switch_data_t *sw)
 {
     int i;
+
+    memset(sw, 0, sizeof(switch_data_t));
+    for(i=0; i<SW_PORT_MAX; i++) {
+        sw->port[i].id = -1;
+    }
+}
+static void sw_sync_mac_by_id(switch_data_t *dst, switch_data_t *src)
+{
+    int i,id;
     for(i=0; i<SW_PORT_MAX; i++) {
-        port_data_t *pt=&sw->port[i];
-        int id=(pt->id>=SW_PORT_START)?(pt->id-SW_PORT_START):pt->id;
-
-        if(pt->id>=SW_PORT_START) {
-            LOGD("__%s__, port[%d].id: %d\n", s, i, id);
-            LOGD("__%s__, port[%d].up: %d\n", s, i, pt->up);
-            LOGD("__%s__, port[%d].mac:  %s\n", s, i, pt->mac);
-            LOGD("__%s__, port[%d].ip4:  %s\n", s, i, pt->ip4);
-            LOGD("__%s__, port[%d].ip6:  %s\n", s, i, pt->ip6);
+        id = src->port[i].id;
+        if(id != -1) {
+            strcpy(dst->port[id].mac, src->port[i].mac);
         }
     }
-    LOGD("\n");
 }
-
-
-int snmp_nms_test(void)
+static void sw_sync_ip_by_mac(switch_data_t *dst, switch_data_t *src)
 {
     int i,j;
-    char *ipAddr="1.3.6.1.2.1.17.4.3.1.0";
-    char *phyAddr="1.3.6.1.2.1.4.22.0";
-    char *icmp="1.3.6.1.2.1.5";
-    char temp[100];
-    netsnmp_variable_list *var;
-    switch_data_t sw={0};
+    for(i=0; i<SW_PORT_MAX; i++) {
+        for(j=0; j<SW_PORT_MAX; j++) {
+            if(strcmp(dst->port[j].mac, src->port[i].mac)==0) {
+                strcpy(dst->port[j].ip, src->port[i].ip);
+            }
+        }
+    }
+}
 
-    SOCK_STARTUP;
+static void sw_print(char *s, switch_data_t *sw)
+{
+    int i,id;
+    port_data_t *pt=NULL;
 
-#if 0
     for(i=0; i<SW_PORT_MAX; i++) {
-        sprintf(temp, "%s.%d", phyAddr, i+99329); //LOGD("getnext: %s\n", temp);
-        snmp_get(SNMP_VERSION_1, "public", "192.168.0.1", temp);
+        pt = &sw->port[i];
+        LOGD("__%s__, port[%d].id:   %d\n", s, i, pt->id);
+        LOGD("__%s__, port[%d].up:   %d\n", s, i, pt->up);
+        LOGD("__%s__, port[%d].ip:  %s\n", s, i, pt->ip);
+        LOGD("__%s__, port[%d].mac:  %s\n", s, i, pt->mac);
+        LOGD("__%s__, port[%d].desc: %s\n", s, i, pt->desc);
     }
-#endif
-
-    //snmp_getnext(SNMP_VERSION_2c, "public", "192.168.0.1", ipAddr);
-    //snmp_getnext(SNMP_VERSION_2c, "public", "192.168.0.1", phyAddr);
+    LOGD("\n");
+}
 
 /*
     public
@@ -234,43 +318,50 @@ int snmp_nms_test(void)
         1: ifreIndex - INTEGER(2 - integer (32 bit))
         6: ifPhysAddress - PhysAddress(4 - octets)
         8: ifOperStatus - INTEGER(2 - integer (32 bit))
-*/
+ 
+        No Such Instance currently exists at this OID:
+        1. MIB文件没有正确添加到MIB树里面,因此agent在收到查询以后真的找不到目标OID.
 
-    //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.4.22.1");
-    //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.4.20.1");
-    
-    //LOGD("++++++++++++++++\n");
-    //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.17.4");
+        2. MIB文件添加成功了,但是snmpd.conf里面的关于权限的配置不对。agent在收到client的查询以后也找到了该OID, 
+           但是因为没有权限因此返回“No Such Instance currently exists at this OID”。
+           关于权限粗看会以为很复杂,尤其是在心浮气燥的时候,其实静下心来仔细看看就会发现也就那么回事
+        3. 第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
+           使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
+*/
+static int sw_get(switch_data_t *sw)
+{
+    int i,j,find=0;
+    char temp[100];
+    switch_data_t sw2;
+    netsnmp_variable_list *var,*pvar;
 
     //snmp_getbulk(SNMP_VERSION_2c, "public", "192.168.0.1", "1.3.6.1.2.1.17.4");
 
     char *dot1dTpFdbEntryOid="1.3.6.1.2.1.17.4.3.1";
     var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, dot1dTpFdbEntryOid);
     if(var) {
-        netsnmp_variable_list *pvar=NULL;
-        char *tok_mac="Hex-STRING: ";
-        char *tok_id="INTEGER: ";
+        char *tok_mac="Hex-STRING: ", *tok_id="INTEGER: ";
+
+        sw_init(&sw2);
 
         i = j = 0;
         for (pvar=var; pvar; pvar=pvar->next_variable) {
             char *pstr = get_string(pvar);
             if(pstr) {
-                LOGD("__1__%s\n", pstr);
+                //LOGD("__1__%s\n", pstr);
 
-                sprintf(temp, "%s.%d", dot1dTpFdbEntryOid, 1);
-                if(strstr(pstr, temp)) {
+                if(strstr(pstr, "2.17.4.3.1.1")) {  //mac
                     char *p=strstr(pstr, tok_mac);
                     if(p) {
-                        strcpy(sw.port[i].mac, p+strlen(tok_mac));
+                        get_mac(p+strlen(tok_mac), sw2.port[i].mac);
                         i++;
                     }
                 }
 
-                sprintf(temp, "%s.%d", dot1dTpFdbEntryOid, 2);
-                if(strstr(pstr, temp)) {
-                    char *p=strstr(pstr, tok_mac);
+                if(strstr(pstr, "2.17.4.3.1.2")) {  //port
+                    char *p=strstr(pstr, tok_id);
                     if(p) {
-                        sw.port[j].id = atoi(p+strlen(tok_id));
+                        sw2.port[j].id = atoi(p+strlen(tok_id)) - SW_PORT_START;
                         j++;
                     }
                 }
@@ -278,52 +369,135 @@ int snmp_nms_test(void)
             }
         }
         snmp_free_varbind(var);
+
+        if(j>0) {
+            sw_sync_mac_by_id(sw, &sw2);
+            find = 1;
+        }
+    }
+
+    if(find==0) {
+        return -1;
     }
-    sw_print("111", &sw);
 
     char *ipNetToMediaEntryOid="1.3.6.1.2.1.4.22.1";
     var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, ipNetToMediaEntryOid);
     if(var) {
-        netsnmp_variable_list *pvar=NULL;
+        char *tok_mac="STRING: ", *tok_ip="IpAddress: ";
+
+        sw_init(&sw2);
+
+        i = j = 0;
         for (pvar=var; pvar; pvar=pvar->next_variable) {
             char *pstr = get_string(pvar);
             if(pstr) {
-                LOGD("__2__%s\n", pstr);
+                //LOGD("__2__%s\n", pstr);
+
+                if(strstr(pstr, "ipNetToMediaPhysAddress")) {  //mac addr
+                    char *p=strstr(pstr, tok_mac);
+                    if(p) {
+                        get_mac(p+strlen(tok_mac), sw->port[i].mac);
+                        i++;
+                    }
+                }
+
+                if(strstr(pstr, "ipNetToMediaNetAddress")) {  //ip addr
+                    char *p=strstr(pstr, tok_ip);
+                    if(p) {
+                        strcpy(sw->port[j].ip, p+strlen(tok_ip));
+                        j++;
+                    }
+                }
                 free(pstr);
             }
-
         }
         snmp_free_varbind(var);
+
+        if(i>0) {
+            sw_sync_ip_by_mac(sw, &sw2);
+            //sw_print("111", sw);
+        }
     }
 
+    char *ifEntry="1.3.6.1.2.1.2.2";
+    var = snmp_getbulk(SNMP_VERSION_2c, "public", SW_HOST_IP, ifEntry);
+    if(var) {
+         for (pvar=var; pvar; pvar=pvar->next_variable) {
+            char *pstr = get_string(pvar);
+            if(pstr) {
+                LOGD("__3__%s\n", pstr);
+            }
+         }
 
-     /*  
-        No Such Instance currently exists at this OID:
-        1. MIB文件没有正确添加到MIB树里面,因此agent在收到查询以后真的找不到目标OID.
+        snmp_free_varbind(var);
+    }
 
-        2. MIB文件添加成功了,但是snmpd.conf里面的关于权限的配置不对。agent在收到client的查询以后也找到了该OID, 
-           但是因为没有权限因此返回“No Such Instance currently exists at this OID”。
-           关于权限粗看会以为很复杂,尤其是在心浮气燥的时候,其实静下心来仔细看看就会发现也就那么回事
-        3. 第三种情况比较特殊,对于net-snmp不熟的也可能会范理解上的错误。
-           使用snmpget而忘记了添加OID结尾的实例标识符,net-snmp则会报出“No Such Instance currently exists at this OID”的错误。
-     */
 
 
 
-    SOCK_CLEANUP;
-    exit(0);
+    return 0;
+}
+static int sw_cmp(switch_data_t *sw1, switch_data_t *sw2)
+{
+    int i;
 
+    for(i=0; i<SW_PORT_MAX; i++) {
+        if(sw1->port[i].up != sw2->port[i].up) {
+            return 1;
+        }
+    }
     return 0;
 }
 
-int snmp_nms_deinit(void)
+
+static sqlite3* get_db(void)
 {
+    return __globalDeviceManage.db;
+}
+
+
+static void* switch_thread(void *arg)
+{
+    int r;
+    thread_handle_t *h=(thread_handle_t*)arg;
+    ns_handle_t   *nh=(ns_handle_t*)h->arg;
+    switch_data_t   sw_tmp;
+    switch_data_t   *sw=&nh->sw;
+    switch_data_t   *sw2=&sw_tmp;
+    sqlite3 *db=get_db();;
+
+    dev_switch_init(db, sw);
+    *sw2 = *sw;
+
+    SOCK_STARTUP;
+    //while(h->quit==0) {
+        r = sw_get(sw2);
+        if(r==0 && memcmp(sw, sw2, sizeof(switch_data_t))) {
+            LOGD("____ port plug detected!\n");
+        }
+
+    //}
     SOCK_CLEANUP;
+
+    pthread_exit(NULL);
+}
+
+int netswitch_init(void)
+{
+    ns_handle_t *h=&nsHandle;
+
+    thread_start(THREAD_ID_SWITCH, switch_thread, h, 4*MB, 0);
     
     return 0;
 }
 
 
+int netswitch_deinit(void)
+{
+    thread_stop(THREAD_ID_SWITCH);
+    return 0;
+}
+
 
 
 

+ 8 - 0
pro/src/netswitch.h

@@ -0,0 +1,8 @@
+#ifndef __NETSWITCH_Hx__
+#define __NETSWITCH_Hx__
+
+int netswitch_init(void);
+int netswitch_deinit(void);
+
+#endif
+

+ 0 - 25
pro/src/snmp_nms.h

@@ -1,25 +0,0 @@
-#ifndef __SNMP_NMS_Hx__
-#define __SNMP_NMS_Hx__
-
-enum {
-    NMS_GET=0,
-    NMS_GETNEXT,
-    NMS_GETBULK,
-    
-    NMS_SET,
-};
-
-typedef struct {
-    char *community;
-    char *ip;
-    char *oid;
-}snmp_req_t;
-
-
-int snmp_nms_init(void);
-int snmp_nms_scan(void);
-int snmp_nms_test(void);
-
-
-#endif
-

+ 140 - 28
pro/src/sqlite_handle.c

@@ -3426,60 +3426,172 @@ int dev_Alarm_Run_message(GlobalDeviceManager* __globalDeviceManger,const char*
     return 0;
 }
 
+/// @brief ////////////////////////////////////////////////////////////
+#define SWITCH_TABLE    "Table_SwitchInfo"
+static int tab_exists(sqlite3 *db, char *table)
+{
+    int r,exists = 0;
+    sqlite3_stmt *stmt;
+    char sql[1024];
+
+    snprintf(sql, sizeof(sql), "SELECT name FROM sqlite_master WHERE type='table' AND name='%s';", table);
+    r = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
+    if (r == SQLITE_OK) {
+        r = sqlite3_step(stmt);
+        if (r == SQLITE_ROW) {
+            exists = 1;
+        } else if (r == SQLITE_DONE) {
+            exists = 0;
+        } else {
+            log_e("Error: %s\n", sqlite3_errmsg(db));
+        }
+        sqlite3_finalize(stmt);
+    } else {
+        log_e("Error: %s\n", sqlite3_errmsg(db));
+    }
+ 
+    return exists;
+}
 
-int dev_switch_init(sqlite3 *db, switch_data_t *sw)
-{
-    int r;
-    char *tab_name="Table_SwitchPort";
-    char select_sql[1000] = {0};
-    char *errorMsg = NULL;
 
-    sprintf(select_sql, "SELECT name FROM sqlite_master WHERE type='table' AND name='%s'", tab_name);
-    r = sqlite3_exec(db, select_sql, 0, 0, NULL);
-    if(r!=SQLITE_OK) {
-        log_w("___ %s not exist, create it\n", tab_name);
+static int sw_load(sqlite3 *db, switch_data_t *sw)
+{
+    int i,r;
+    char temp[1024],*p;
+    char *table=SWITCH_TABLE;
+    sqlite3_stmt *stmt;
 
-        sprintf(select_sql, "CREATE TABLE %s(id INTEGER PRIMARY KEY AUTOINCREMENT,"
-                            "up INTEGER, mac TEXT, ip4 TEXT, ip6 TEXT);", tab_name);
-        r = sqlite3_exec(db, select_sql, 0, 0, NULL);
-        if(r!=SQLITE_OK) {
-            log_w("___ %s create failed\n", tab_name);
-            return -1;
-        }
+    sprintf(temp, "SELECT * FROM %s;", table);
+    r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+    if (r != SQLITE_OK) {
+        log_e("___switch_load, sqlite3_prepare_v2 failed\n");
+        return -1;
     }
+    
+    i = 0;
+    memset(sw, 0, sizeof(switch_data_t));
+    while (sqlite3_step(stmt) == SQLITE_ROW) {
+        port_data_t *pt=&sw->port[i];
+
+        pt->id = sqlite3_column_int(stmt, 0);
+        pt->up = sqlite3_column_int(stmt, 1);
+        
+        p = (char*)sqlite3_column_text(stmt, 2);
+        if(p) strcpy(pt->ip, p);
 
-    //
+        p = (char*)sqlite3_column_text(stmt, 3);
+        if(p) strcpy(pt->mac, p);
 
+        p = (char*)sqlite3_column_text(stmt, 4);
+        if(p) strcpy(pt->desc, p);
 
+        i++;
+    }
+    sqlite3_finalize(stmt);
 
     return 0;
 }
+static int sw_update_port(sqlite3 *db, port_data_t *pt)
+{
+    int i,r=0;
+    char temp[1024];
+    sqlite3_stmt *stmt;
+    char *err_msg=NULL;
+    char *table=SWITCH_TABLE;
 
+    sprintf(temp, "UPDATE %s id=%d,up=%d,ip=%s,mac=%s,desc=%s WHERE id=%d;", 
+            table,pt->id,pt->up,pt->ip,pt->mac,pt->desc,pt->id);
+    r = sqlite3_exec(db, temp, NULL, 0, &err_msg);
+    if(r != SQLITE_OK) {
+        log_e("___sw_update_port failed, %s\n", err_msg);
+        sqlite3_free(err_msg);
+        return -1;
+    }
 
-int dev_switch_update(sqlite3 *db, switch_data_t *sw)
+    return 0;
+}
+static int sw_update_all(sqlite3 *db, switch_data_t *sw)
 {
-    char **result;
-    char *errMsg = 0;
-    int r,nrow=0,ncol=0;
+    int i,r=0;
+    char temp[1024];
+    sqlite3_stmt *stmt;
+    char *table=SWITCH_TABLE;
 
-    pthread_mutex_lock(&__globalDeviceManage.dbThreadlock);
+    sprintf(temp, "REPLACE INTO %s (id,up,ip,mac,desc) VALUES (?,?,?,?,?);", table);
+    r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
+    if (r != SQLITE_OK) {
+        log_e("___sw_update_all, sqlite3_prepare_v2 failed\n");
+        return -1;
+    }
 
-    //r = sqlite3_get_table2(db, sql, &result, &nrow, &ncol, &errMsg);
+    for(i=0; i<SW_PORT_MAX; i++) {
+        port_data_t *pt=&sw->port[i];
+        pt->id = i;
 
-    pthread_mutex_unlock(&__globalDeviceManage.dbThreadlock);
+        sqlite3_bind_int(stmt,  1, pt->id);
+        sqlite3_bind_int(stmt,  2, pt->up);
+        sqlite3_bind_text(stmt, 3, pt->ip,   -1, NULL);
+        sqlite3_bind_text(stmt, 4, pt->mac,  -1, NULL);
+        sqlite3_bind_text(stmt, 5, pt->desc, -1, NULL);
+        r = sqlite3_step(stmt);
+        if (r != SQLITE_DONE) {
+            log_e("___sw_update_all, sqlite3_step port %d failed\n", i);
+            r = -1; break;
+        }
+        sqlite3_reset(stmt);
+    }
+    sqlite3_finalize(stmt);
 
-    return 0;
+    return r;
 }
 
 
+int dev_switch_init(sqlite3 *db, switch_data_t *sw)
+{
+    int r;
+    char *table=SWITCH_TABLE;
+    char temp[1000] = {0};
+    char *err_msg = NULL;
 
+    sprintf(temp, "CREATE TABLE IF NOT EXISTS %s("
+                        "id INTEGER PRIMARY KEY AUTOINCREMENT,"
+                        "up INTEGER,"
+                        "ip TEXT,"
+                        "mac TEXT,"
+                        "desc TEXT);", table);
+    r = sqlite3_exec(db, temp, 0, 0, &err_msg);
+    if(r!=SQLITE_OK) {
+        log_e("___ %s create failed, %s\n%s\n", table, temp, err_msg); sqlite3_free(err_msg);
+        return -1;
+    }
 
+    if(sw) {
+        memset(sw, 0, sizeof(switch_data_t));
+        sw_update_all(db, sw);
+    }
 
+    r = sw_load(db, sw);
 
+    return r;
+}
 
+int dev_switch_update_port(sqlite3 *db, port_data_t *pt)
+{
+    int r;
+    pthread_mutex_lock(&__globalDeviceManage.dbThreadlock);
+    r = sw_update_port(db, pt);
+    pthread_mutex_unlock(&__globalDeviceManage.dbThreadlock);
 
+    return 0;
+}
+int dev_switch_update_all(sqlite3 *db, switch_data_t *sw)
+{
+    int r;
+    pthread_mutex_lock(&__globalDeviceManage.dbThreadlock);
+    r = sw_update_all(db, sw);
+    pthread_mutex_unlock(&__globalDeviceManage.dbThreadlock);
 
-
-
+    return 0;
+}
 
 

+ 2 - 1
pro/src/sqlite_handle.h

@@ -139,6 +139,7 @@ int dev_update_breaker_genera_manage(sqlite3 *db,int product_id,int breaker_id,G
 int dev_delete_breaker_manage(sqlite3 *db,int product_id,int breaker_id);
 
 int dev_switch_init(sqlite3 *db, switch_data_t *sw);
-int dev_switch_update(sqlite3 *db, switch_data_t *sw);
+int dev_switch_update_port(sqlite3 *db, port_data_t *pt);
+int dev_switch_update_all(sqlite3 *db, switch_data_t *sw);
 
 #endif

+ 1 - 0
pro/src/thread.h

@@ -25,6 +25,7 @@ enum {
     THREAD_ID_SCAN,
     THREAD_ID_SHMW,
     THREAD_ID_BREAKER,
+    THREAD_ID_SWITCH,
     
     THREAD_ID_MAX=30
 };