Kaynağa Gözat

增加固件和logo上传
websocket广播改为单传

guohui 2 yıl önce
ebeveyn
işleme
5062805aee

+ 6 - 3
pro/mongoose/mongoose.c

@@ -2660,11 +2660,12 @@ void mg_http_reply(struct mg_connection *c, int code, const char *headers,
   }
   }
   c->is_resp = 0;
   c->is_resp = 0;
 }
 }
-void mg_http_reply2(struct mg_connection *c, int code, const char *headers,
+int mg_http_reply2(struct mg_connection *c, int code, const char *headers,
                    const char *fmt, ...) {
                    const char *fmt, ...) {
     va_list ap;
     va_list ap;
     size_t len;
     size_t len;
-    if (c==NULL) return;
+    int r;
+    if (c==NULL) return -1;
 
 
     mg_printf(c, "HTTP/1.1 %d %s\r\n"
     mg_printf(c, "HTTP/1.1 %d %s\r\n"
     "Content-Type: text/html\n"
     "Content-Type: text/html\n"
@@ -2680,9 +2681,11 @@ void mg_http_reply2(struct mg_connection *c, int code, const char *headers,
 
 
     len = c->send.len;
     len = c->send.len;
     va_start(ap, fmt);
     va_start(ap, fmt);
-    mg_vxprintf(mg_pfn_iobuf, &c->send, fmt?fmt:"", &ap);
+    r = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt?fmt:"", &ap);
     va_end(ap);
     va_end(ap);
     c->is_resp = 0;
     c->is_resp = 0;
+
+    return r;
 }
 }
 
 
 static void http_cb(struct mg_connection *, int, void *);
 static void http_cb(struct mg_connection *, int, void *);

+ 1 - 1
pro/mongoose/mongoose.h

@@ -2125,7 +2125,7 @@ void mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm,
                         const char *path, const struct mg_http_serve_opts *);
                         const char *path, const struct mg_http_serve_opts *);
 void mg_http_reply(struct mg_connection *, int status_code, const char *headers,
 void mg_http_reply(struct mg_connection *, int status_code, const char *headers,
                    const char *body_fmt, ...);
                    const char *body_fmt, ...);
-void mg_http_reply2(struct mg_connection *c, int code, const char *headers,
+int mg_http_reply2(struct mg_connection *c, int code, const char *headers,
                    const char *body_fmt, ...);
                    const char *body_fmt, ...);
 
 
 struct mg_str *mg_http_get_header(struct mg_http_message *, const char *name);
 struct mg_str *mg_http_get_header(struct mg_http_message *, const char *name);

+ 49 - 59
pro/src/appweb_handle.c

@@ -11,6 +11,7 @@
 #include "cascade.h"
 #include "cascade.h"
 #include "appweb.h"
 #include "appweb.h"
 #include "upg.h"
 #include "upg.h"
+#include "file.h"
 #include "language_common.h"
 #include "language_common.h"
 #include "websocket_handle.h"
 #include "websocket_handle.h"
 
 
@@ -19,14 +20,6 @@
 typedef void (*http_fn_t)(void *arg);
 typedef void (*http_fn_t)(void *arg);
 
 
 
 
-
-static void file_to_base64(void)
-{
-    //mg_base64_encode();
-}
-
-
-
 #ifdef USE_WEBAPP
 #ifdef USE_WEBAPP
 #include "http.h"
 #include "http.h"
 #else
 #else
@@ -95,7 +88,7 @@ static int http_reply(void *conn, int status, char *ack)
     httpFinalize(s);
     httpFinalize(s);
 #else
 #else
     mg_stream_t *s=(mg_stream_t*)conn;
     mg_stream_t *s=(mg_stream_t*)conn;
-    mg_http_reply2(s->c, status, "",  ack);
+    r = mg_http_reply2(s->c, status, "",  ack);
 #endif
 #endif
 
 
     return r;
     return r;
@@ -158,12 +151,30 @@ static void *web_thread(void *arg)
 }
 }
 
 
 #else
 #else
+static int upload_handle(void *conn, char *upload_path)
+{
+    int r=-1;
+    struct mg_http_part part;
+    mg_stream_t *s=(mg_stream_t*)conn;
+    struct mg_http_message *hm = (struct mg_http_message *)s->ev_data;
+    
+    MG_INFO(("New request to: [%.*s], body size: %lu", (int) hm->uri.len,
+             hm->uri.buf, (unsigned long) hm->body.len));
+    size_t pos = 0, total_bytes = 0, num_files = 0;
+    while ((pos = mg_http_next_multipart(hm->body, pos, &part)) > 0) {
+        MG_INFO(("Chunk name: [%.*s] filename: [%.*s] length: %lu bytes",
+                (int) part.name.len, part.name.buf, (int) part.filename.len,
+                part.filename.buf, (unsigned long) part.body.len));
 
 
-typedef struct {
-  size_t expected;  // POST data length, bytes
-  size_t received;  // Already received bytes
-  void *fp;         // Opened uploaded file
-}upload_stat_t;
+        if (mg_path_is_sane(mg_str(upload_path))) {
+            mg_file_write(&mg_fs_posix, upload_path, part.body.buf, part.body.len);
+            total_bytes += part.body.len;
+            num_files++;
+            r = 0;
+        }
+    }
+    return r;
+}
 static void http_mg_cb(struct mg_connection *c, int ev, void *ev_data)
 static void http_mg_cb(struct mg_connection *c, int ev, void *ev_data)
 {
 {
     int i,j;
     int i,j;
@@ -3463,75 +3474,54 @@ static void equipmentMintenance(void *conn)
     }
     }
     else if(strcmp(_Over_equipment_mintenance.type,"listShfwQuery")==0)
     else if(strcmp(_Over_equipment_mintenance.type,"listShfwQuery")==0)
     {
     {
-        ack_str = vendor_info_to_json();
+        GlobalDeviceInfo *dev=__globalDeviceManage._global_device_info;
+        ack_str = vendor_info_to_json(dev);
     }
     }
     else if(strcmp(_Over_equipment_mintenance.type,"sBRestart")==0) {  //restart
     else if(strcmp(_Over_equipment_mintenance.type,"sBRestart")==0) {  //restart
-        if(strcmp(_Over_equipment_mintenance.product_name,__globalDeviceManage._global_device_info->product_name)) {
-            sys_reboot();
-        }
-        else {
-            //send to other device
-        }
+        sys_reboot();
     }
     }
     else if(strcmp(_Over_equipment_mintenance.type,"restoreFactorySettings")==0) {  //restore to factory
     else if(strcmp(_Over_equipment_mintenance.type,"restoreFactorySettings")==0) {  //restore to factory
-        if(strcmp(_Over_equipment_mintenance.product_name,__globalDeviceManage._global_device_info->product_name)) {
-            sys_set_factory();
-        }
-        else {
-            //send to other device
-        }
+        sys_set_factory();
     }
     }
     else {
     else {
-        //char *save_logo="productNumber=Vq1&productVersion=undefined&uploadType=shfw&type=importData&token=b6cdd10e-e1a7-4bd9-8283-c6d6ecbae28c";
-
-
+        
     }
     }
     
     
     cJSON_Delete(cjson);
     cJSON_Delete(cjson);
-    http_reply(conn, 200, ack_str);
+    int r = http_reply(conn, 200, ack_str);
     cJSON_free((void*)ack_str);
     cJSON_free((void*)ack_str);
 }
 }
-static int upload_handle(void *conn, char *upload_path)
-{
-    int r=-1;
-    struct mg_http_part part;
-    mg_stream_t *s=(mg_stream_t*)conn;
-    struct mg_http_message *hm = (struct mg_http_message *)s->ev_data;
-    
-    MG_INFO(("New request to: [%.*s], body size: %lu", (int) hm->uri.len,
-             hm->uri.buf, (unsigned long) hm->body.len));
-    size_t pos = 0, total_bytes = 0, num_files = 0;
-    while ((pos = mg_http_next_multipart(hm->body, pos, &part)) > 0) {
-        MG_INFO(("Chunk name: [%.*s] filename: [%.*s] length: %lu bytes",
-                (int) part.name.len, part.name.buf, (int) part.filename.len,
-                part.filename.buf, (unsigned long) part.body.len));
 
 
-        if (mg_path_is_sane(mg_str(upload_path))) {
-            mg_file_write(&mg_fs_posix, upload_path, part.body.buf, part.body.len);
-            total_bytes += part.body.len;
-            num_files++;
-            r = 0;
-        }
-    }
-    return r;
-}
 static void equipmentMintenanceUpload(void *conn)
 static void equipmentMintenanceUpload(void *conn)
 {
 {
     int r = -1 ;
     int r = -1 ;
+    char* rx_body_buf = NULL;
+    char* ack_str = NULL ;
 
 
 #ifdef USE_WEBAPP
 #ifdef USE_WEBAPP
     HttpStream *s=(HttpStream*)conn;
     HttpStream *s=(HttpStream*)conn;
     http_reply(conn, 200, NULL);
     http_reply(conn, 200, NULL);
 #else
 #else
+    mg_stream_t *s=(mg_stream_t*)conn;
+    struct mg_http_message *msg=s->ev_data;
+    rx_body_buf = (char*)msg->body.buf;
+#endif
     char path[200];
     char path[200];
     
     
-    sprintf(path, "%s/%s", DOWN_FOLDER, UPG_PKG_NAME);
-    r = upload_handle(conn, path);    
-    if(r==0) {
-        upg_start();
+    if(strstr(msg->uri.buf, "uploadType=gjsj")) {        //firmware upload
+        sprintf(path, "%s/%s", DOWN_FOLDER, UPG_PKG_NAME);
+        r = upload_handle(conn, path);    
+        if(r==0) {
+            upg_start();
+        }
     }
     }
+    else if(strstr(msg->uri.buf, "uploadType=shfw")) {   //logo upload
+        //char *save_logo="productNumber=Vq1&productVersion=undefined&uploadType=shfw&type=importData&token=b6cdd10e-e1a7-4bd9-8283-c6d6ecbae28c";
+        sprintf(path, "%s/%s", IMAGE_PATH, LOGO_FILE);
+        upload_handle(conn, path);
+    }
+
     http_reply(conn, 200, "");
     http_reply(conn, 200, "");
-#endif
 }
 }
 
 
 static int webSetCallback(void)
 static int webSetCallback(void)

+ 5 - 0
pro/src/common.h

@@ -51,6 +51,11 @@
 #define INTERL_SENSOR_MODBUS_BAUD 9600
 #define INTERL_SENSOR_MODBUS_BAUD 9600
 
 
 
 
+#define IMAGE_PATH          "image"
+#define LOGO_FILE           "logo.png"
+#define QRCODE_FILE         "qrcode.png"
+
+
 #define AC_SINGLE_S_CUR_CHN_NUM 8
 #define AC_SINGLE_S_CUR_CHN_NUM 8
 #define AC_SINGLE_B_CUR_CHN_NUM 4
 #define AC_SINGLE_B_CUR_CHN_NUM 4
 
 

+ 12 - 10
pro/src/file.c

@@ -50,9 +50,9 @@ int file_save(char *path, void *buf, int len)
     return r;
     return r;
 }
 }
 
 
-int file_load(char* path, file_data_t *fdat)
+int file_load(char* path, buf_t *fbuf)
 {
 {
-    int r,flen;
+    int r,flen,blen;
     FILE* fp;
     FILE* fp;
 
 
     flen = file_length(path);
     flen = file_length(path);
@@ -61,27 +61,29 @@ int file_load(char* path, file_data_t *fdat)
         return -1;
         return -1;
     }
     }
 
 
-    fdat->buf = (char*)malloc(flen+1);
-    if(!fdat->buf) {
+    blen = flen+1;
+    fbuf->buf = (char*)malloc(blen);
+    if(!fbuf->buf) {
         LOGE("____ file_load, %s malloc %d failed\n", path, flen);
         LOGE("____ file_load, %s malloc %d failed\n", path, flen);
         return -1;
         return -1;
     }
     }
-    fdat->len = flen;
+    fbuf->dlen = flen;
+    fbuf->blen = blen;
 
 
     fp = fopen(path, "r");
     fp = fopen(path, "r");
     if (!fp) {
     if (!fp) {
-        LOGE("file_load, fopen %s failed\n", path); free(fdat->buf);
-        free(fdat->buf);
+        LOGE("file_load, fopen %s failed\n", path); free(fbuf->buf);
+        free(fbuf->buf);
         return -1;
         return -1;
     }
     }
-    r = fread(fdat->buf, 1, flen, fp);
+    r = fread(fbuf->buf, 1, flen, fp);
     if (r != flen) {
     if (r != flen) {
         LOGE("file_load %s failed, %d, %d\n", path, r, flen);
         LOGE("file_load %s failed, %d, %d\n", path, r, flen);
-        fclose(fp); free(fdat->buf);
+        fclose(fp); free(fbuf->buf);
         r = -1;
         r = -1;
     }
     }
     else {
     else {
-        fdat->buf[flen] = 0; r = 0;
+        fbuf->buf[flen] = 0; r = 0;
     }
     }
     fclose(fp);
     fclose(fp);
 
 

+ 4 - 4
pro/src/file.h

@@ -7,13 +7,13 @@
 
 
 typedef struct {
 typedef struct {
     char *buf;
     char *buf;
-    int  len;
-}file_data_t;
-
+    int  dlen;
+    int  blen;
+}buf_t;
 
 
 int file_length(char* path);
 int file_length(char* path);
 int file_save(char *path, void *buf, int len);
 int file_save(char *path, void *buf, int len);
-int file_load(char* path, file_data_t *fdat);
+int file_load(char* path, buf_t *buf);
 int file_remove(char *path);
 int file_remove(char *path);
 
 
 
 

+ 146 - 23
pro/src/json_handle.c

@@ -5,10 +5,118 @@
 #include <time.h>
 #include <time.h>
 #include "common.h"
 #include "common.h"
 #include "list.h"
 #include "list.h"
+#include "file.h"
+#include "sys.h"
 #include "cascade.h"
 #include "cascade.h"
 
 
 #define TOTAL_COUNT 60 //计数长度
 #define TOTAL_COUNT 60 //计数长度
 
 
+
+
+
+static const uint8_t base64_enc_map[64] =
+{
+    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
+    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+    'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
+    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+    'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
+    'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
+    '8', '9', '+', '/'
+};
+static int base64_len(int n)
+{
+    return ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1;
+}
+static int base64_encode(uint8_t *src, size_t slen, uint8_t *dst, size_t dlen)
+{
+    size_t i, n;
+    int C1, C2, C3;
+    uint8_t *p;
+ 
+    if( slen == 0 ){
+        return -1;
+    }
+ 
+    n = (slen / 3 + ( slen % 3 != 0 )) * 4;
+    if( ( dlen < n + 1 ) || ( NULL == dst ) ) {
+        return -1;
+    }
+ 
+    n = ( slen / 3 ) * 3;
+    for( i = 0, p = dst; i < n; i += 3 ) {
+        C1 = *src++;
+        C2 = *src++;
+        C3 = *src++;
+ 
+        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
+        *p++ = base64_enc_map[(((C1 &  3) << 4) + (C2 >> 4)) & 0x3F];
+        *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];
+        *p++ = base64_enc_map[C3 & 0x3F];
+    }
+ 
+    if( i < slen ) {
+        C1 = *src++;
+        C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;
+ 
+        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];
+        *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];
+ 
+        if( ( i + 1 ) < slen )
+             *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];
+        else *p++ = '=';
+ 
+        *p++ = '=';
+    }
+    *p = 0;
+ 
+    return (p - dst);
+}
+static int image_to_base64(char *path, buf_t *buf)
+{
+    int r=0,blen;
+    buf_t fbuf;
+
+    r = file_load(path, &fbuf);
+    if(r) {
+        return -1;
+    }
+    blen = base64_len(fbuf.dlen)+100;
+    buf->buf = malloc(blen);
+    if(buf->buf) {
+        buf->blen = blen;
+        buf->dlen = 0;
+
+        strcpy(buf->buf, "data:image/png;base64,");
+        int slen = strlen(buf->buf);
+        buf->dlen = base64_encode((uint8_t*)fbuf.buf, fbuf.blen, (uint8_t*)buf->buf+slen, buf->blen)+slen;
+    }
+    else {
+        r = -1;
+    }
+    free(fbuf.buf);
+
+    return r;
+}
+static int get_base64(buf_t *logo, buf_t *qrcode)
+{
+    char path[200],temp[200];
+    sys_get_path(path, IMAGE_PATH);
+
+    if(logo) {
+        sprintf(temp, "%s/%s", path, LOGO_FILE);
+        image_to_base64(temp, logo);
+    }
+
+    if (qrcode) {
+        sprintf(temp, "%s/%s", path, QRCODE_FILE);
+        image_to_base64(temp, qrcode);
+    }
+
+    return 0;
+}
+
+
 //如果是在一个程序的循环中不断调用这个函数,那么是没有效果的
 //如果是在一个程序的循环中不断调用这个函数,那么是没有效果的
 //虽然也是使用的系统的时间函数来初始化随机数发生器,但程序的
 //虽然也是使用的系统的时间函数来初始化随机数发生器,但程序的
 //执行速度太快了,可能执行1000次循环返回的秒数都是一样的
 //执行速度太快了,可能执行1000次循环返回的秒数都是一样的
@@ -943,6 +1051,8 @@ cJSON* json_to_over_equipment_mintenance(const char* str,_Equipment_Mintenance*
 char* json_to_system_config_info(void)
 char* json_to_system_config_info(void)
 {
 {
     char* str = NULL;
     char* str = NULL;
+    buf_t logo={NULL,0,0};
+
     // 创建 JSON 对象
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     cJSON* root = cJSON_CreateObject();   
     // 添加基本键值对
     // 添加基本键值对
@@ -958,16 +1068,15 @@ char* json_to_system_config_info(void)
     char strIPInfo[64] = "ws://192.168.1.132:6785/websocket/";
     char strIPInfo[64] = "ws://192.168.1.132:6785/websocket/";
     sprintf(strIPInfo,"ws://%s:6785/websocket/", getLocalIpAddress("eth0"));
     sprintf(strIPInfo,"ws://%s:6785/websocket/", getLocalIpAddress("eth0"));
     cJSON_AddStringToObject(data_field,"webSocket",strIPInfo); 
     cJSON_AddStringToObject(data_field,"webSocket",strIPInfo); 
-    //返回websockt
-    cJSON_AddStringToObject(data_field,"logo","");
+    
+    get_base64(&logo, NULL);
+    cJSON_AddStringToObject(data_field,"logo",logo.buf?logo.buf:"");
+    if(logo.buf) free(logo.buf);
 
 
     cJSON_AddItemToObject(root,"data",data_field);
     cJSON_AddItemToObject(root,"data",data_field);
-
-    //添加结果
     cJSON_AddStringToObject(root, "msg", "操作成功");
     cJSON_AddStringToObject(root, "msg", "操作成功");
-    //转换
-    str = cJSON_Print(root);    
-    //释放资源
+
+    str = cJSON_Print(root);
     cJSON_Delete(root);
     cJSON_Delete(root);
     return str;
     return str;
 }
 }
@@ -1146,28 +1255,42 @@ char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo*
     return str;
     return str;
 }
 }
 
 
-
-char* vendor_info_to_json(void)
+char* vendor_info_to_json(GlobalDeviceInfo *dev)
 {
 {
     char* str = NULL;
     char* str = NULL;
+    char temp[100];
+    buf_t logo={NULL,0,0},qrcode={NULL,0,0};
+    char *ptmp=NULL;
     
     
     cJSON* root = cJSON_CreateObject(); 
     cJSON* root = cJSON_CreateObject(); 
     cJSON_AddNumberToObject(root, "code", 200);       
     cJSON_AddNumberToObject(root, "code", 200);       
     
     
-    cJSON* data_field = cJSON_CreateObject();   
-    cJSON_AddNumberToObject(data_field, "productName", nLanguageID);
-
-    cJSON_AddStringToObject(data_field,"productId",strIPInfo); 
-    cJSON_AddStringToObject(data_field,"productNumber",strIPInfo); 
-
-    cJSON_AddStringToObject(data_field,"logo","");          //base64
-    cJSON_AddStringToObject(data_field,"sensorAddr","");
-    cJSON_AddStringToObject(data_field,"website","");
-    cJSON_AddStringToObject(data_field,"serviceTel","");
-    cJSON_AddStringToObject(data_field,"mailbox","");
-    cJSON_AddStringToObject(data_field,"qrCode","");        //base64
-
-    cJSON_AddItemToObject(root,"data",data_field);
+     cJSON* root_array = cJSON_CreateArray();
+    if(root_array) {
+        cJSON* data_field = cJSON_CreateObject();
+        if(data_field) {
+            cJSON_AddStringToObject(data_field, "productName", dev->product_name);
+
+            sprintf(temp, "%d", dev->product_id);
+            cJSON_AddStringToObject(data_field,"productId", temp);
+            cJSON_AddStringToObject(data_field,"productNumber", dev->product_number); 
+            cJSON_AddStringToObject(data_field,"productVersion", dev->product_version); 
+
+            get_base64(&logo, &qrcode);
+            cJSON_AddStringToObject(data_field,"logo", logo.buf?logo.buf:"");          //base64
+            cJSON_AddStringToObject(data_field,"sensorAddr", "wowowow");
+            cJSON_AddStringToObject(data_field,"website", "www.xxxx.com");
+            cJSON_AddStringToObject(data_field,"serviceTel","1345678");
+            cJSON_AddStringToObject(data_field,"mailbox","8888@123.com");
+            cJSON_AddStringToObject(data_field,"qrCode",qrcode.buf?qrcode.buf:"");        //base64
+
+            cJSON_AddItemToArray(root_array, data_field);
+
+            if(logo.buf) free(logo.buf);
+            if(qrcode.buf) free(qrcode.buf);
+        }
+        cJSON_AddItemToObject(root,"data",root_array);
+    }
     cJSON_AddStringToObject(root, "msg", "操作成功");    
     cJSON_AddStringToObject(root, "msg", "操作成功");    
     
     
     str = cJSON_Print(root);
     str = cJSON_Print(root);

+ 1 - 1
pro/src/json_handle.h

@@ -483,7 +483,7 @@ char* over_channel_power_history_to_json(GlobalPowerInfo* _globalPowerInfo,Globa
 cJSON* json_to_overall_pwr_status_monitor(const char* str,_OverAllPwrRequest* _over_all_pwr_request);
 cJSON* json_to_overall_pwr_status_monitor(const char* str,_OverAllPwrRequest* _over_all_pwr_request);
 cJSON* json_to_over_equipment_mintenance(const char* str,_Equipment_Mintenance* _over_equipment_mintenance);
 cJSON* json_to_over_equipment_mintenance(const char* str,_Equipment_Mintenance* _over_equipment_mintenance);
 char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo* _over_back_sts_info,bool curFlag);
 char* over_product_list_info_to_json(GlobalDeviceManager *dm, _OverBackStsInfo* _over_back_sts_info,bool curFlag);
-char* vendor_info_to_json(void);
+char* vendor_info_to_json(GlobalDeviceInfo *dev);
 char* over_all_pwr_monitor_to_json(int phaseType,_OverAllPwrAckInfo* _over_all_pwr_back_info);
 char* over_all_pwr_monitor_to_json(int phaseType,_OverAllPwrAckInfo* _over_all_pwr_back_info);
 char* over_all_pwr_monitor_Tree_AC_to_json(_OverAllPwrAckInfo* _over_all_pwr_back_info_L1,_OverAllPwrAckInfo* _over_all_pwr_back_info_L2,_OverAllPwrAckInfo* _over_all_pwr_back_info_L3);
 char* over_all_pwr_monitor_Tree_AC_to_json(_OverAllPwrAckInfo* _over_all_pwr_back_info_L1,_OverAllPwrAckInfo* _over_all_pwr_back_info_L2,_OverAllPwrAckInfo* _over_all_pwr_back_info_L3);
 char* over_all_total_info_to_json(_OverAllPwrAckInfo* _over_all_pwr_back_info, int total_type);
 char* over_all_total_info_to_json(_OverAllPwrAckInfo* _over_all_pwr_back_info, int total_type);

+ 11 - 11
pro/src/paras.c

@@ -14,7 +14,7 @@ static int do_check(void *para)
 int paras_load(void)
 int paras_load(void)
 {
 {
     int i,r=-1;
     int i,r=-1;
-    file_data_t fdat;
+    buf_t fbuf;
     char path[PATH_MAX];
     char path[PATH_MAX];
     NetworkInfo_t *p=&allParas.dev._network_info;
     NetworkInfo_t *p=&allParas.dev._network_info;
 
 
@@ -22,18 +22,18 @@ int paras_load(void)
     sys_get_path(path, PARAS_FILE);
     sys_get_path(path, PARAS_FILE);
 
 
 #if 1
 #if 1
-    r = file_load(path, &fdat);
+    r = file_load(path, &fbuf);
     if(r==0) {
     if(r==0) {
-        if(fdat.len==sizeof(allParas)) {
-            r = do_check(fdat.buf);
+        if(fbuf.dlen==sizeof(allParas)) {
+            r = do_check(fbuf.buf);
             if(r) {
             if(r) {
                 allParas = DFLT_PARAS;
                 allParas = DFLT_PARAS;
             }
             }
             else {
             else {
-                allParas = *((all_paras_t*)fdat.buf);
+                allParas = *((all_paras_t*)fbuf.buf);
             }
             }
         }
         }
-        free(fdat.buf);
+        free(fbuf.buf);
     }
     }
 #endif
 #endif
 
 
@@ -51,7 +51,7 @@ int paras_load(void)
 int paras_save(void)
 int paras_save(void)
 {
 {
     int r;
     int r;
-    file_data_t fdat;
+    buf_t fbuf;
     char path[PATH_MAX];
     char path[PATH_MAX];
     
     
     r = do_check(&allParas);
     r = do_check(&allParas);
@@ -60,17 +60,17 @@ int paras_save(void)
     }
     }
 
 
     sys_get_path(path, PARAS_FILE);
     sys_get_path(path, PARAS_FILE);
-    r = file_load(path, &fdat);
+    r = file_load(path, &fbuf);
     if(r==0) {
     if(r==0) {
-        if(fdat.len==sizeof(allParas)) {
-            if(memcmp(fdat.buf, &allParas, sizeof(allParas))==0) {
+        if(fbuf.dlen==sizeof(allParas)) {
+            if(memcmp(fbuf.buf, &allParas, sizeof(allParas))==0) {
                 r = -1;
                 r = -1;
             }
             }
             else {
             else {
                 r = file_save(path, &allParas, sizeof(allParas));
                 r = file_save(path, &allParas, sizeof(allParas));
             }
             }
         }
         }
-        free(fdat.buf);
+        free(fbuf.buf);
     }
     }
 
 
     return r;
     return r;

+ 10 - 10
pro/src/sys.c

@@ -629,22 +629,22 @@ static int get_net(NetworkInfo_t *para, int ipv)
     int r;
     int r;
     char *p=NULL;
     char *p=NULL;
     interface_t intf;
     interface_t intf;
-    file_data_t fdat;
+    buf_t fbuf;
 
 
-    r = file_load(FILE_NET, &fdat);
+    r = file_load(FILE_NET, &fbuf);
     if(r) {
     if(r) {
         return -1;
         return -1;
     }
     }
     
     
     memset(&intf, 0, sizeof(intf));
     memset(&intf, 0, sizeof(intf));
-    get_nic(intf.lo, sizeof(intf.lo), "lo",   fdat.buf, fdat.len);
-    get_nic(intf.e0, sizeof(intf.e0), "eth0", fdat.buf, fdat.len);
-    get_nic(intf.e1, sizeof(intf.e1), "eth1", fdat.buf, fdat.len);
+    get_nic(intf.lo, sizeof(intf.lo), "lo",   fbuf.buf, fbuf.dlen);
+    get_nic(intf.e0, sizeof(intf.e0), "eth0", fbuf.buf, fbuf.dlen);
+    get_nic(intf.e1, sizeof(intf.e1), "eth1", fbuf.buf, fbuf.dlen);
 
 
     p = strstr(intf.e0, (ipv==IP_V4)?"inet":"inet6");
     p = strstr(intf.e0, (ipv==IP_V4)?"inet":"inet6");
     if(p==NULL) {
     if(p==NULL) {
         LOGE("___get_net, inet/inet6 not found!\n");
         LOGE("___get_net, inet/inet6 not found!\n");
-        free(fdat.buf); return -1;
+        free(fbuf.buf); return -1;
     }
     }
     
     
     if(strstr(p, "dhcp")) {
     if(strstr(p, "dhcp")) {
@@ -654,19 +654,19 @@ static int get_net(NetworkInfo_t *para, int ipv)
         para->mode = 1;
         para->mode = 1;
     } else {
     } else {
         LOGE("___get_net, dhcp/static not found!\n");
         LOGE("___get_net, dhcp/static not found!\n");
-        free(fdat.buf); return -1;
+        free(fbuf.buf); return -1;
     }
     }
 
 
     get_ip(p, "address", para->ip_address, ipv);
     get_ip(p, "address", para->ip_address, ipv);
     get_ip(p, "netmask", para->mask, ipv);
     get_ip(p, "netmask", para->mask, ipv);
     get_ip(p, "gateway", para->gateway, ipv);
     get_ip(p, "gateway", para->gateway, ipv);
-    free(fdat.buf);
+    free(fbuf.buf);
 
 
-    r = file_load(FILE_DNS, &fdat);
+    r = file_load(FILE_DNS, &fbuf);
     if(r) {
     if(r) {
         return -1;
         return -1;
     }
     }
-    get_dns(fdat.buf, para->dns1, para->dns2);
+    get_dns(fbuf.buf, para->dns1, para->dns2);
 
 
     return 0;
     return 0;
 }
 }

+ 30 - 9
pro/src/websocket_handle.c

@@ -9,6 +9,9 @@
 #include "json_handle.h"
 #include "json_handle.h"
 #include "cascade.h"
 #include "cascade.h"
 
 
+
+//#define USE_BROADCAST
+
 #define WS_MAX    10
 #define WS_MAX    10
 
 
 typedef struct mg_mgr           mg_mgr_t;
 typedef struct mg_mgr           mg_mgr_t;
@@ -22,6 +25,7 @@ typedef struct {
     char      wpath[200];
     char      wpath[200];
     char      root[200];
     char      root[200];
 
 
+    mg_conn_t *c;
     int       inited;
     int       inited;
     int       ws_cnt;
     int       ws_cnt;
 }ws_handle_t;
 }ws_handle_t;
@@ -32,10 +36,17 @@ static int ws_broadcast(ws_handle_t *wh, void *data, int len)
     int r=-1;
     int r=-1;
     mg_conn_t *c;
     mg_conn_t *c;
 
 
+#ifdef USE_BROADCAST
     for (c=wh->mgr.conns; c!=NULL; c=c->next) {
     for (c=wh->mgr.conns; c!=NULL; c=c->next) {
         mg_ws_send(c, data, len, WEBSOCKET_OP_TEXT);
         mg_ws_send(c, data, len, WEBSOCKET_OP_TEXT);
         r = 0;
         r = 0;
     }
     }
+#else
+    if(wh->c) {
+        mg_ws_send(wh->c, data, len, WEBSOCKET_OP_TEXT);
+        r = 0;
+    }
+#endif
 
 
     return r;
     return r;
 }
 }
@@ -61,8 +72,12 @@ static void web_update(ws_handle_t *wh)
     _OverChnPwrAckInfo chInfo;
     _OverChnPwrAckInfo chInfo;
     GlobalDeviceManager* gdm= &__globalDeviceManage;
     GlobalDeviceManager* gdm= &__globalDeviceManage;
     GlobalDeviceManager* gdm2=&__globalDeviceManage2;
     GlobalDeviceManager* gdm2=&__globalDeviceManage2;
-	
+
+#ifdef USE_BROADCAST
     if(wh->ws_cnt>0)
     if(wh->ws_cnt>0)
+#else
+    if(wh->c!=NULL)
+#endif
     {
     {
         //overall info
         //overall info
         if(gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree ||
         if(gdm->_global_device_info->product_pwr_type==SmartPDU_Tree_AC_Tree ||
@@ -72,11 +87,11 @@ static void web_update(ws_handle_t *wh)
             _OverAllPwrAckInfo l1,l2,l3;
             _OverAllPwrAckInfo l1,l2,l3;
             if (cur_dev_addr == 0)
             if (cur_dev_addr == 0)
             {
             {
-                pthread_mutex_lock(&__globalDeviceManage._power_update); 
+                pthread_mutex_lock(&gdm->_power_update); 
                 dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm);
                 dev_search_latest_t_ac_power_statistic_info(0, 0, &l1, gdm);
                 dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm);
                 dev_search_latest_t_ac_power_statistic_info(0, 1, &l2, gdm);
                 dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm);
                 dev_search_latest_t_ac_power_statistic_info(0, 2, &l3, gdm);
-                pthread_mutex_unlock(&__globalDeviceManage._power_update);
+                pthread_mutex_unlock(&gdm->_power_update);
             }
             }
             else
             else
             {
             {
@@ -94,9 +109,9 @@ static void web_update(ws_handle_t *wh)
         else
         else
         {
         {
             if(cur_dev_addr==0) {
             if(cur_dev_addr==0) {
-                pthread_mutex_lock(&__globalDeviceManage._power_update); 
+                pthread_mutex_lock(&gdm->_power_update); 
                 dev_search_latest_power_statistic_info(gdm, &allInfo);
                 dev_search_latest_power_statistic_info(gdm, &allInfo);
-                pthread_mutex_unlock(&__globalDeviceManage._power_update);
+                pthread_mutex_unlock(&gdm->_power_update);
             }
             }
             else {
             else {
                 cascade_lock();
                 cascade_lock();
@@ -114,9 +129,9 @@ static void web_update(ws_handle_t *wh)
             INIT_LIST_HEAD(&chInfo.list);
             INIT_LIST_HEAD(&chInfo.list);
 
 
             if(cur_dev_addr==0) {
             if(cur_dev_addr==0) {
-                pthread_mutex_lock(&__globalDeviceManage._power_update); 
+                pthread_mutex_lock(&gdm->_power_update); 
                 dev_search_latest_power_All_info(gdm,&chInfo);
                 dev_search_latest_power_All_info(gdm,&chInfo);
-                pthread_mutex_unlock(&__globalDeviceManage._power_update);
+                pthread_mutex_unlock(&gdm->_power_update);
             }
             }
             else {
             else {
                 cascade_lock();
                 cascade_lock();
@@ -138,7 +153,7 @@ static void web_update(ws_handle_t *wh)
 
 
         //sensor info
         //sensor info
         {
         {
-            json_str = ws_sensor_status_ack_to_json(&__globalDeviceManage._globalSensorManger);
+            json_str = ws_sensor_status_ack_to_json(&gdm->_globalSensorManger);
             ws_broadcast(wh, json_str, strlen(json_str));
             ws_broadcast(wh, json_str, strlen(json_str));
             cJSON_free(json_str);
             cJSON_free(json_str);
         }
         }
@@ -162,8 +177,12 @@ static void fn(mg_conn_t *c, int ev, void *ev_data)
         if(wh->ws_cnt>0) {
         if(wh->ws_cnt>0) {
             wh->ws_cnt--;
             wh->ws_cnt--;
         }
         }
+
+        if(c==wh->c) {
+            wh->c = NULL;
+        }
       }
       }
-      //log_i("ws upgrade del connection ID:%d\n", c->id);
+      log_i("ws upgrade del connection ID:%d\n", c->id);
     }
     }
     break;
     break;
 
 
@@ -178,6 +197,8 @@ static void fn(mg_conn_t *c, int ev, void *ev_data)
         mg_http_msg_t *hm = (mg_http_msg_t *) ev_data;
         mg_http_msg_t *hm = (mg_http_msg_t *) ev_data;
         if (mg_match(hm->uri, mg_str("/websocket/PDU-WebSocket"), NULL)) {
         if (mg_match(hm->uri, mg_str("/websocket/PDU-WebSocket"), NULL)) {
             mg_ws_upgrade(c, hm, NULL);
             mg_ws_upgrade(c, hm, NULL);
+            wh->c = c;
+            log_i("ws upgrade new connection ID:%d\n", c->id);
         }
         }
         else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
         else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
             mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
             mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);