guohui 2 gadi atpakaļ
vecāks
revīzija
29227d0d3c

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4704 - 2407
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/mongoose/mongoose.c


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 601 - 520
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/mongoose/mongoose.h


+ 3 - 2
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/appweb_handle.c

@@ -167,10 +167,11 @@ static void http_mg_cb(struct mg_connection *c, int ev, void *ev_data)
 {
     int i,j;
     mg_handle_t *h=&webHandle.mg;
-    mg_stream_t s={c,ev,ev_data};
 
     if (ev == MG_EV_HTTP_MSG) {
         struct mg_http_message *hm = ev_data;
+        mg_stream_t s={c,ev,ev_data};
+
         for(i=0; i<h->cnt; i++) {
             if (h->fn[i].f && h->fn[i].uri && mg_match(hm->uri, mg_str(h->fn[i].uri), NULL)) {
                 h->fn[i].f(&s); c->pfn = NULL;
@@ -209,7 +210,7 @@ static void *web_thread(void *arg)
     }
     mg_mgr_free(&mgr);
         
- pthread_exit(NULL);
+    pthread_exit(NULL);
 }
 #endif
 /// @brief 定时更新前端

+ 86 - 103
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/cascade.c

@@ -11,23 +11,17 @@
 #if 0
 #define LOGD            log_d
 #define LOGE            log_e
+#define LOGW            log_w
 #else
 #define LOGD            printf
 #define LOGE            printf
+#define LOGW            printf
 #endif
 
-#define ERR_MAX         5
-#define CASCADE_MAX     10
-//#define CASCADE_MAX     100
-
+#define CASCADE_MAX     32
 #define MB_MAX_LEN      250
 
 
-typedef struct {
-    uint8_t             addr;
-    int                 err;      //err times
-}slave_t;
-
 typedef struct {
     
     handle_t            l;
@@ -38,14 +32,12 @@ typedef struct {
     modbus_mapping_t    *map;
     uint8_t             query[MODBUS_RTU_MAX_ADU_LENGTH];
 
-    int                 addr;   //self addr
-    int                 saddr;  //current slave addr
+    slave_t             slaves[CASCADE_MAX+1];
+    int                 scanAddr;
 }cascade_handle_t;
 
 int cur_dev_addr=0;
 static cascade_handle_t casHandle={.inited=0};
-static int add_slave(cascade_handle_t *cas, int addr);
-
 
 
 static inline GlobalDeviceManager* get_dm(void)
@@ -56,10 +48,47 @@ static inline GlobalDeviceManager* get_dm2(void)
 {
     return &__globalDeviceManage2;
 }
-static inline GlobalDeviceInfo *get_dev(void)
+static inline ModbusInfo_t *get_mb(void)
+{
+    return &get_dm()->_global_device_info->_gmodbus_info;
+}
+static int slave_init(cascade_handle_t *cas)
+{
+    int i;
+    for(i=0; i<=CASCADE_MAX; i++) {
+        cas->slaves[i].addr = -1;
+        cas->slaves[i].err  = 0;
+    }
+}
+static int slave_add(cascade_handle_t *cas, int addr)
+{
+    cas->slaves[addr].addr = addr;
+    cas->slaves[addr].err  = 0;
+    return 0;
+}
+static int slave_cnt(cascade_handle_t *cas)
 {
-    return &paras_get()->dev;
+    int i,cnt=0;
+    for(i=1; i<=CASCADE_MAX; i++) {
+        if(cas->slaves[i].addr>=0) {
+            cnt++;
+        }
+    }
+    return cnt;
 }
+static slave_t* slave_get(cascade_handle_t *cas, int addr)
+{
+    return &cas->slaves[addr];
+}
+static int slave_find(cascade_handle_t *cas, int addr)
+{
+    if(cas->slaves[addr].addr>=0) {
+        return 1;
+    }
+    return 0;
+}
+
+
 static int mbus_init(cascade_handle_t *cas, char *path, int mode, int addr, uint32_t baud)
 {
     int r;
@@ -143,50 +172,26 @@ static int mbus_receive(cascade_handle_t *cas)
 }
 
 /////////////////////////////////////////////////////////////////////////
-static int find_addr_fn(handle_t l, node_t *node, node_t *xd, void *arg, int *act)
-{
-    slave_t *s1 = (slave_t*)node->buf;
-    slave_t *s2 = (slave_t*)xd->buf;
-    
-    if(s1->addr==s2->addr) {
-        *act = LIST_ACT_STOP;
-        return 1;
-    }
-    return 0;
-}
-static int find_addr(cascade_handle_t *cas, int addr)
-{
-    int r=0;
-    slave_t sl={addr,0};
-    node_t nod={0,&sl,sizeof(sl),sizeof(sl)};
-
-    r = xlist_iterator(cas->l, &nod, find_addr_fn, NULL);
-    if(r<0) r=0;
-    
-    return r;
-}
-
-
 static int cascade_scan(cascade_handle_t *cas)
 {
-    int i,r=0 ;
-    uint16_t tmp[100];
-
-    for(i=1; i<CASCADE_MAX; i++) {
-        if(find_addr(cas, i)) {
-            //LOGD("___slave 0x%02x is in the list\n", i);
-            continue;
-        }
+    int r=0 ;
+    uint16_t tmp[10];
 
-        r = mbus_read(cas, i, 6000, tmp, 1);
+    if(!slave_find(cas, cas->scanAddr)) {
+        r = mbus_read(cas, cas->scanAddr, 6000, tmp, 1);
         if(r>0) {
-            LOGD("____ find slave %d\n", i);
-            add_slave(cas, i);
+            LOGD("____ find slave %d\n", cas->scanAddr);
+            slave_add(cas, cas->scanAddr);
         }
         else {
-            //LOGD("____ scan slave %d fail, %s\n", i, modbus_strerror(errno));
+            LOGD("____ scan slave %d fail, %s\n", cas->scanAddr, modbus_strerror(errno));
         }
     }
+    
+    cas->scanAddr++;
+    if(cas->scanAddr>CASCADE_MAX) {
+        cas->scanAddr = 1;
+    }
     //print_slave(cas);
       
     return 0;
@@ -239,11 +244,11 @@ static void print_sensor(char *s, sensor_data_t *ss)
     LOGD("__%s__ ss.consumption: %f\n", s, ss->pwr.consumption);
     LOGD("__%s__ ss.freq: %f\n", s, ss->pwr.freq);
     LOGD("__%s__ ss.factor: %f\n", s, ss->pwr.factor);
+    LOGD("__%s__ ss.status: %f\n", s, ss->pwr.status);
 
     LOGD("__%s__ ss.temprature: %f\n", s, ss->temprature);
     LOGD("__%s__ ss.humidity: %f\n", s, ss->humidity);
     LOGD("__%s__ ss.warning: %d\n", s, ss->warning);
-    LOGD("__%s__ ss.power_status: %d\n", s, ss->power_status);
     LOGD("__%s__ ss.sensor_status: %d\n", s, ss->sensor_status);
     LOGD("\n");
 
@@ -259,7 +264,6 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
     if(addr<=0) {
         return -1;
     }
-
     
     r = mbus_read(cas, addr, offset, temp, cnt);
     if(r!=cnt) {
@@ -276,11 +280,11 @@ static int power_get(cascade_handle_t *cas, int addr, sensor_data_t *ss)
     ss->pwr.consumption = VALUE_OF(temp,9,8)/1000.0;
     ss->pwr.freq   = VALUE_OF(temp,11,10)/1000.0;
     ss->pwr.factor = VALUE_OF(temp,13,12)/1000.0;
+    ss->pwr.status = temp[20];
 
     ss->temprature = VALUE_OF(temp,15,14)/1000.0;
     ss->humidity   = VALUE_OF(temp,17,16)/1000.0;
     ss->warning    = VALUE_OF(temp,19,18)/1000.0;
-    ss->power_status = temp[20];
     ss->sensor_status = temp[21];
 
     //print_sensor("11", ss);
@@ -302,14 +306,17 @@ static int master_request(cascade_handle_t *cas)
 
     if(tmp) {
         sensor_data_t sdat;
+        slave_t *sl=slave_get(cas, cur_dev_addr);
 
         //LOGD("___ master request slave %d\n", cur_dev_addr);
         r = power_get(cas, cur_dev_addr, &sdat);
         if(r==0) {
             tmp->_PowerInfo = sdat.pwr;
+            sl->err = 0;
         }
         else {
-            //err++
+            sl->err++;
+
         }
     }
 }
@@ -319,7 +326,7 @@ static int slave_receive(cascade_handle_t *cas)
     int i,r=0,rc;
     uint8_t *query=cas->query;
     modbus_mapping_t *map=cas->map;
-    ModbusInfo_t *info=&get_dev()->_gmodbus_info;
+    ModbusInfo_t *info=get_mb();
 
     //rc = mbus_receive(cas, &h);
     if (rc>0) {
@@ -335,7 +342,7 @@ static void* cascade_thread(void *arg)
     int r;
     thread_handle_t *h=(thread_handle_t*)arg;
     cascade_handle_t *cas=(cascade_handle_t*)h->arg;
-    ModbusInfo_t *info=&get_dev()->_gmodbus_info;
+    ModbusInfo_t *info=get_mb();
     
     LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
     while(h->quit==0) {
@@ -356,10 +363,9 @@ static void* scan_thread(void *arg)
     int r;
     thread_handle_t *h=(thread_handle_t*)arg;
     cascade_handle_t *cas=(cascade_handle_t*)h->arg;
-    ModbusInfo_t *info=&get_dev()->_gmodbus_info;
     
     while(h->quit==0) {
-        if(info->product_modbus_type==0) {  //master
+        if(get_mb()->product_modbus_type==0) {  //master
             r = cascade_scan(cas);
         }
         sleep(1);
@@ -386,39 +392,15 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
 
     return 0;
 }
-static int add_slave(cascade_handle_t *cas, int addr)
-{
-    int r,tmp=addr;
-    r = xlist_append(cas->l, 0, &tmp, sizeof(tmp));
-    if(r) {
-        LOGE("___ add slave %d failed\n", addr);
-    }
-    return r;
-}
-static int add_slaves(cascade_handle_t *cas, int s, int e)
-{
-    int i,r;
-    for(i=s; i<=e; i++) {
-        r = add_slave(cas, i);
-    }
-    return 0;
-}
-
 
 int cascade_init(void)
 {
     int r=0;
     list_cfg_t lc;
     cascade_handle_t *cas=&casHandle;
-    ModbusInfo_t *info=&get_dm()->_global_device_info->_gmodbus_info;
     
-    paras_load();
     power_init();
-
-    lc.log = 0;
-    lc.max = CASCADE_MAX;
-    lc.mode = LIST_FULL_FIFO;
-    cas->l = xlist_init(&lc);
+    slave_init(cas);
     
     cas->map = modbus_mapping_new(
         MODBUS_MAX_READ_BITS,
@@ -426,9 +408,10 @@ int cascade_init(void)
         MAX_READ_REGS, 
         MAX_WRITE_REGS
     );
-    set_modbus(cas, info);
+    cas->scanAddr = 1;
 
-    add_slave(cas, 0);
+    set_modbus(cas, get_mb());
+    slave_add(cas, 0);
 
     sys_start_thread(THREAD_ID_CASCADE, cascade_thread, cas);
     sys_start_thread(THREAD_ID_SCAN, scan_thread, cas);
@@ -449,32 +432,28 @@ int cascade_set_modbus(ModbusInfo_t *info)
 }
 
 
- static int dlist_fn(handle_t l, node_t *node, node_t *xd, void *arg, int *act)
-{
-    slave_t *s=(slave_t*)xd->buf;
-    dev_list_t *dl=(dev_list_t*)arg;
-
-    dl->addr[dl->cnt++] = s->addr;
-    return 0;
-}
 int cascade_get_dlist(dev_list_t *dl)
 {
-    int *p=NULL;
+    int i,cnt=0;
+    slave_t *sl=NULL;
     cascade_handle_t *cas=&casHandle;
-    int sz=xlist_size(cas->l);
 
     if(!dl) {
         return -1;
     }
 
-    p = (int*)malloc(sizeof(int)*(sz+1));
-    if(!p) {
+    sl = (slave_t*)malloc(sizeof(slave_t)*(CASCADE_MAX+1));
+    if(!sl) {
         return -1;
     }
 
-    dl->addr = p;
-    dl->cnt = 0;
-    xlist_iterator(cas->l, NULL, dlist_fn, dl);
+    for(i=0; i<=CASCADE_MAX; i++) {
+        if(cas->slaves[i].addr>=0) {
+            sl[cnt++] = cas->slaves[i];
+        }
+    }
+    dl->slave = sl;
+    dl->cnt = cnt;
 
     return 0;
 }
@@ -484,7 +463,7 @@ int cascade_free_dlist(dev_list_t *dl)
         return -1;
     }
 
-    free(dl->addr);
+    free(dl->slave);
     return 0;
 }
 
@@ -499,13 +478,17 @@ int cascade_request(int addr)
         return -1;
     }
 
-    cas->saddr = addr;
     r = master_request(cas);
 
     return r;
 }
 
 
+int cascade_is_offline(int addr)
+{
+    slave_t *sl=slave_get(&casHandle, addr);
 
+    return (sl->addr>=ERR_MAX)?1:0;
+}
 
 

+ 11 - 5
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/cascade.h

@@ -4,13 +4,20 @@
 #include <stdint.h>
 #include "common.h"
 
-#define MAX_READ_REGS                   100
-#define MAX_WRITE_REGS                  100
+#define ERR_MAX                     5
 
+#define MAX_READ_REGS              100
+#define MAX_WRITE_REGS             100
+
+
+typedef struct {
+    int       addr;
+    int       err;      //err times
+}slave_t;
 
 typedef struct {
-    int *addr;
-    int cnt;
+    slave_t   *slave;
+    int       cnt;
 }dev_list_t;
 
 #pragma pack (1)
@@ -43,7 +50,6 @@ typedef struct {
     float temprature;            //温度值
     float humidity;              //湿度值
     float warning;               //告警
-    int   power_status;          //供电状态
     int   sensor_status;         //传感器状态
 }sensor_data_t;
 

+ 11 - 2
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/common.c

@@ -162,6 +162,7 @@ char* getLocalIpAddress(char* dev)
 {
     int fd;
     struct ifreq ifr;
+    char ip_addr[INET6_ADDRSTRLEN];
 
     fd = socket(AF_INET, SOCK_DGRAM, 0);
     ifr.ifr_addr.sa_family = AF_INET;
@@ -170,7 +171,14 @@ char* getLocalIpAddress(char* dev)
     ioctl(fd, SIOCGIFADDR, &ifr);
     close(fd);
 
-    return inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
+    char *p=inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
+    if(!p || INET6_ADDRSTRLEN<strlen(p)+1) {
+        printf("____ inet_ntoa failed\n");
+        return NULL;
+    }
+    strcpy(ip_addr, p);
+
+    return ip_addr;
 }
 // 获取MAC地址的函数  
 char* get_mac_address(const char *iface_name) 
@@ -178,7 +186,8 @@ char* get_mac_address(const char *iface_name)
     int fd;  
     struct ifreq ifr;  
     unsigned char *mac; 
-    char mac_str[18];
+    static char mac_str[32];
+
     snprintf(mac_str, sizeof(mac_str), "%02d:%02d:%02d:%02d:%02d:%02d",  
              0, 0,0, 0, 0, 0);  
 

+ 12 - 7
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/json_handle.c

@@ -933,22 +933,22 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
                 for(i=0; i<dl.cnt; i++) {
                     cJSON* data_filed = cJSON_CreateObject();
                     if(data_filed) {
-                        if(dl.addr[i]==0) {
+                        if(dl.slave[i].addr==0) {
                             sprintf(temp, "%s", _over_back_sts_info->product_name);
                         }
                         else{
-                            sprintf(temp, "%s %d", _over_back_sts_info->product_name, dl.addr[i]);
+                            sprintf(temp, "%s %d", _over_back_sts_info->product_name, dl.slave[i].addr);
                         }
 
                         cJSON_AddStringToObject(data_filed, "productName", temp);
                         //cJSON_AddNumberToObject(data_filed, "productId", _over_back_sts_info->product_id);
-                        cJSON_AddNumberToObject(data_filed, "productId", dl.addr[i]);
+                        cJSON_AddNumberToObject(data_filed, "productId", dl.slave[i].addr);
 
                         cJSON_AddStringToObject(data_filed, "productNumber", _over_back_sts_info->product_number);
                         cJSON_AddStringToObject(data_filed, "productCode", _over_back_sts_info->product_Code);
                         cJSON_AddStringToObject(data_filed, "productModel", _over_back_sts_info->product_type);
 
-                        if(dl.addr[i]==0) {
+                        if(dl.slave[i].addr==0) {
                             cJSON_AddStringToObject(data_filed, "productVersion", _over_back_sts_info->productVersion);
                             cJSON_AddStringToObject(data_filed, "systemTime", _over_back_sts_info->product_sysTime);
                             cJSON_AddStringToObject(data_filed, "runTime", _over_back_sts_info->product_runTime);
@@ -963,18 +963,23 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
                             cJSON_AddStringToObject(data_filed, "MACadress", "");
                         }
 
-                        if(dl.addr[i]==0) {
+                        if(dl.slave[i].addr==0) {
                             cJSON_AddStringToObject(data_filed, "RSadress", " "); 
                         }
                         else {
-                            sprintf(temp, "%d", dl.addr[i]);
+                            sprintf(temp, "%d", dl.slave[i].addr);
                             cJSON_AddStringToObject(data_filed, "RSadress", temp);
                         }
 
                         sprintf(temp, "%d", _over_back_sts_info->product_type_id);
                         cJSON_AddStringToObject(data_filed, "productType", temp);
                         
-                        cJSON_AddStringToObject(data_filed, "productStatus", "12333");
+                        if(dl.slave[i].err>=ERR_MAX) {
+                            cJSON_AddStringToObject(data_filed, "productStatus", "offline");
+                        }
+                        else {
+                            cJSON_AddStringToObject(data_filed, "productStatus", "online");
+                        }
 
                         cJSON_AddItemToArray(root_array, data_filed);
                     }

+ 144 - 117
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/websocket_handle.c

@@ -5,152 +5,179 @@
 #include "common.h"
 #include "sys.h"
 
-//获取本地IP以及端口进行初始化操作
-//static const char *s_listen_on = "ws://192.168.2.132:6785";
+//#define WS_MULTI
 
-static char s_listen_on[64] = "ws://192.168.1.132:6785";
 
-static const char *s_web_root = ".";
+#define WS_MAX    30
 
-static void fn(struct mg_connection *c, int ev, void *ev_data) 
+typedef struct mg_mgr           mg_mgr_t;
+typedef struct mg_connection    mg_conn_t;
+typedef struct mg_ws_message    mg_ws_msg_t;
+typedef struct mg_http_message  mg_http_msg_t;
+
+
+typedef struct {
+
+  mg_mgr_t  mgr;
+  char      wpath[200];
+  char      root[200];
+
+  int       cnt;
+  mg_conn_t *conn[WS_MAX];
+  mg_conn_t *c;
+
+  int       inited;
+  pthread_mutex_t mutex;
+}ws_handle_t;
+static ws_handle_t wsHandle;
+
+
+static void read_ipaddr(ws_handle_t *h)
 {
-  if (ev == MG_EV_OPEN) 
-  {
-    // c->is_hexdumping = 1;
-  } 
-  //如果获取到HTTP消息
-  else if (ev == MG_EV_HTTP_MSG) 
-  {
-    struct mg_http_message *hm = (struct mg_http_message *) ev_data;
-    //通过检查/websocket进行协议升级
-    if (mg_http_match_uri(hm, "/websocket/PDU-WebSocket")) 
-    {
-      // Upgrade to websocket. From now on, a connection is a full-duplex
-      // Websocket connection, which will receive MG_EV_WS_MSG events.
-        mg_ws_upgrade(c, hm, NULL);
+    char *ip=getLocalIpAddress("eth0");
+    if(ip) {
+        sprintf(h->wpath,"ws://%s:6785", ip);
+        printf("____ ws path: %s\n", h->wpath);
+    }
+}
+static int ws_add(ws_handle_t *h, mg_conn_t *c)
+{  
+    int i=0;
+
+    for(i=0; i<WS_MAX; i++) {
+      if(h->conn[i]==NULL) {
+        h->conn[i] = c;
+        h->cnt++;
+        return 0;
+      }
+    }
 
-        __globalDeviceManage.ws_isok = 1 ;
-        //insertWSLinkAtEnd(&__globalDeviceManage.ws_client,c);
-         pthread_mutex_lock(&WSlock);  
-        __globalDeviceManage.ws_client = c ;
-         pthread_mutex_unlock(&WSlock);  
+    return -1;
+}  
+static int ws_rm(ws_handle_t *h, mg_conn_t *c)
+{  
+    int i=0;
+
+    for(i=0; i<WS_MAX; i++) {
+      if(h->conn[i]==c) {
+        h->conn[i] = NULL;
+        h->cnt--;
+        return 0;
+      }
+    }
+
+    return -1;
+}
 
-        log_d("ws upgrade new connection ID:%d\n",c->id);
+static void fn(mg_conn_t *c, int ev, void *ev_data) 
+{
+  ws_handle_t *wh=&wsHandle;
+
+  switch(ev) {
+    case MG_EV_CONNECT:
+    {
+      //ws_add(wh, c);
     }
-    //测试用例
-    else if (mg_http_match_uri(hm, "/rest")) 
+    break;
+
+    case MG_EV_CLOSE:
     {
-      // Serve REST response
-      mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
-    } 
-    else 
+      //ws_rm(wh, c);
+    }
+    break;
+
+    case MG_EV_HTTP_MSG:
+    {
+      mg_http_msg_t *hm = (mg_http_msg_t *) ev_data;
+      if (mg_match(hm->uri, mg_str("/websocket/PDU-WebSocket"), NULL)) {
+          mg_ws_upgrade(c, hm, NULL);
+          wh->c = c;
+      }
+      else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
+        mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
+      }
+      else {
+        wh->c = NULL;
+      }
+    }
+    break;
+
+    case MG_EV_WS_MSG:
     {
-      // Serve static files
-      struct mg_http_serve_opts opts = {.root_dir = s_web_root};
-
-      //if (c!=NULL)
-      //{
-       // deleteWSLinkNode(&__globalDeviceManage.ws_client,c->id);
-       // log_d("ws upgrade del connection ID:%d\n",c->id);
-      //}
-      pthread_mutex_lock(&WSlock);  
-      mg_http_serve_dir(c, ev_data, &opts);
-      pthread_mutex_unlock(&WSlock); 
-
-     // if (__globalDeviceManage.ws_client == NULL)
-      //{
-        __globalDeviceManage.ws_isok = 0;
-        log_d("ws upgrade del connection!");
-      //}
-
-      
+      struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
+      mg_ws_send(c, wm->data.buf, wm->data.len, WEBSOCKET_OP_TEXT);
     }
-  } 
-  //接收到消息
-  else if (ev == MG_EV_WS_MSG) 
-  {
-    // Got websocket frame. Received data is wm->data. Echo it back!
-    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
-    mg_ws_send(c, wm->data.ptr, wm->data.len, WEBSOCKET_OP_TEXT);
+    break;
   }
-}
 
+}
 static void* websocket_thread(void* arg)
 {
     thread_handle_t *h=(thread_handle_t*)arg;
-    struct mg_mgr mgr;  // Event manager
+    ws_handle_t *wh=(ws_handle_t*)h->arg;
 
-    mg_mgr_init(&mgr);  // Initialise event manager
-    log_d("Starting WS listener on %s/websocket\n", s_listen_on);
-    mg_http_listen(&mgr, s_listen_on, fn, NULL);  // Create HTTP listener
+    mg_mgr_init(&wh->mgr);  // Initialise event manager
+    mg_http_listen(&wh->mgr, wh->wpath, fn, NULL);  // Create HTTP listener
+    wh->inited = 1;
 
     while(h->quit==0) {
-	    mg_mgr_poll(&mgr, 1000);                    // Infinite event loop
+      pthread_mutex_lock(&wh->mutex);
+	    mg_mgr_poll(&wh->mgr, 1000);                    // Infinite event loop
+      pthread_mutex_unlock(&wh->mutex);
     }
-    mg_mgr_free(&mgr);
+    wh->inited = 0;
+    mg_mgr_free(&wh->mgr);
 
     pthread_exit(NULL);
 }
 
-void ReadIPaddress()
-{
-  // 打印IP地址
-  printf("IP Address: %s\n", getLocalIpAddress("eth0"));  
-  sprintf(s_listen_on,"ws://%s:6785", getLocalIpAddress("eth0"));
-  printf("monggoose Address: %s\n", s_listen_on); 
-
-}
 
 int websocket_init(void) 
 {
-      // 初始化互斥锁  
-    if (pthread_mutex_init(&WSlock, NULL) != 0) {  
-        log_d("Websocket Mutex init has failed\n");  
-        return -1;  
-    }  
-    ReadIPaddress();
+    ws_handle_t *wh=&wsHandle;
     
-    sys_start_thread(THREAD_ID_WS, websocket_thread, NULL);
+    memset(wh, 0, sizeof(ws_handle_t));
+
+    read_ipaddr(wh);
+    if (pthread_mutex_init(&wh->mutex, NULL) != 0) {  
+        log_e("websocket mutex init has failed\n");  
+        return -1;  
+    }
+    sys_start_thread(THREAD_ID_WS, websocket_thread, wh);
     return 0;
 }
 
-void insertWSLinkAtEnd(struct mg_connection** head, struct mg_connection* data) {  
-    struct mg_connection* newNode = data;  
-    newNode->next = NULL;  
-  
-    if (*head == NULL) {  
-        *head = newNode;  
-    } else {  
-        struct mg_connection* temp = *head;  
-        while (temp->next != NULL) {  
-            temp = temp->next;  
-        }  
-        temp->next = newNode;  
-    }  
-}  
 
-// 删除指定节点  
-void deleteWSLinkNode(struct mg_connection** head, unsigned long key) {  
-    struct mg_connection* temp = *head;  
-    struct mg_connection* prev = NULL;  
-  
-    // 如果头节点就是要删除的节点  
-    if (temp != NULL && temp->id == key) {  
-        *head = temp->next;  
-        free(temp);  
-        return;  
-    }  
-  
-    // 查找要删除的节点,前一个节点是prev  
-    while (temp != NULL && temp->id != key) {  
-        prev = temp;  
-        temp = temp->next;  
-    }  
-  
-    // 如果找到了要删除的节点  
-    if (temp != NULL) {  
-        prev->next = temp->next;  
-        free(temp);  
-    }  
-}  
+int websocket_send(void *data, int len) 
+{
+    int i;
+    ws_handle_t *wh=&wsHandle;
+
+    if(!wh->inited) {
+      return -1;
+    }
+
+#ifdef WS_MULTI
+    for(i=0; i<WS_MAX; i++) {
+      if(wh->conn[i]) {
+          pthread_mutex_lock(&wh->mutex);
+          mg_ws_send(wh->conn[i], data, len, WEBSOCKET_OP_TEXT);
+          pthread_mutex_unlock(&wh->mutex);
+      }
+    }
+#else
+  pthread_mutex_lock(&wh->mutex);
+  mg_ws_send(wh->c, data, len, WEBSOCKET_OP_TEXT);
+  pthread_mutex_unlock(&wh->mutex);
+#endif
+}
+
+
+int websocket_isok(void) 
+{
+    ws_handle_t *wh=&wsHandle;
+    //return (wh->cnt)?1:0;
+    return (wh->c)?1:0;
+}
+
   

+ 3 - 1
04-软件设计及源码/03-核心板/V1.0/05.src/smart_pdu/src/websocket_handle.h

@@ -1,7 +1,9 @@
 #ifndef __WEBSOCKET_HANDLE_H
 #define __WEBSOCKET_HANDLE_H
 
-int websocket_init(void) ;
+int websocket_init(void);
+int websocket_send(void *data, int len);
+int websocket_isok(void);
 
 #endif