Procházet zdrojové kódy

1、继续完善mqtt
2、解决logo保存失败问题

guohui před 2 roky
rodič
revize
7b2ab09572

+ 13 - 12
pro/src/appweb_handle.c

@@ -157,7 +157,7 @@ static int export_handle(void *conn, int flag)
 
 static int upload_handle(void *conn, char *path)
 {
-    int r=-1;
+    int r=-1,flag=0;
     char name[200];
     struct mg_http_part part;
     mg_stream_t *s=(mg_stream_t*)conn;
@@ -169,13 +169,13 @@ static int upload_handle(void *conn, char *path)
         memcpy(name, part.filename.buf, part.filename.len);
         printf("filename: %s length: %lu bytes\n", name, (unsigned long) part.body.len);
 
-        if (mg_path_is_sane(mg_str(path))) {
-            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;
-            }
+        if(flag==0) {
+            file_remove(path); flag = 1;
+        }
+
+        r = file_append(path, part.body.buf, part.body.len);
+        if (r==0) {
+            total_bytes += part.body.len;
         }
     }
     printf("___ upload file to %s %d\n", path, total_bytes);
@@ -3424,7 +3424,7 @@ static void serviceManagement(void *conn)
     }
     else if(strcmp(_serviceManageRequestInfo.type,"mqttZtQuery")==0)
     {
-        //
+        ack_str = mqtt_status_to_json(1);
     }
     else if(strcmp(_serviceManageRequestInfo.type,"mqttZtSave")==0)
     {
@@ -4852,11 +4852,11 @@ static void equipmentMintenanceUpload(void *conn)
     char* ack_str = NULL ;
     mg_stream_t *s=(mg_stream_t*)conn;
     struct mg_http_message *hm=s->ev_data;
-    char path[200];
+    char path[200],tmp[60];
     
     if(strstr(hm->uri.buf, "uploadType=gjsj")) {        //firmware upload
         sprintf(path, "%s/%s", DOWN_FOLDER, UPG_PKG_NAME);
-        r = upload_handle(conn, path);    
+        r = upload_handle(conn, path);
         if(r==0) {
             printf("_____ upg_start\n");
             upg_start();
@@ -4864,7 +4864,8 @@ static void equipmentMintenanceUpload(void *conn)
     }
     else if(strstr(hm->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);
+        sprintf(tmp, "%s/%s", IMAGE_PATH, LOGO_FILE);
+        sys_get_path(path, tmp);
         upload_handle(conn, path);
     }
 

+ 3 - 3
pro/src/dflt.c

@@ -48,7 +48,7 @@ smtp_send_t DFLT_SMTP_SEND={
     .server = "smtp.163.com",
     .port = "25",
     .account = "rcp064867@163.com",
-    .password = "UODRIFWDFBTJTVLW",
+    .password = "YWKVURARCJXYXQVS",
     .auth = "PLAIN",
 };
 
@@ -58,11 +58,11 @@ mqtt_server_t DFLT_MQTT={
     .mode = 1,
     .cid = "mqtt_928507fe",
 #if 0
-    .server = "192.168.1.12:1883",
+    .server = "192.168.1.12",
     .ip = "",
     .port = "1883",
 #else
-    .server = "gaae4d7b.ala.cn-hangzhou.emqxsl.cn:8883",
+    .server = "gaae4d7b.ala.cn-hangzhou.emqxsl.cn",
     .ip = "",
     .port = "8883",
 #endif

+ 21 - 0
pro/src/file.c

@@ -113,6 +113,27 @@ int file_remove(char *path)
 }
 
 
+int file_append(char *path, void *data, int datalen)
+{
+    int r=-1;
+    FILE* fp;
+
+    fp = fopen(path, "a");
+    if(!fp) {
+        LOGE("file_append, fopen %s failed\n", path);
+        return -1;
+    }
+    r = fwrite(data, 1, datalen, fp);
+    if(r==datalen) {
+        r = 0;
+    }
+    else {
+        LOGE("file_append %s failed, %d, %d\n", path, r, datalen);
+    }
+    fclose(fp);
+
+    return r;
+}
 
 
 

+ 1 - 1
pro/src/file.h

@@ -16,6 +16,6 @@ int file_save(char *path, void *buf, int len);
 int file_load(char* path, buf_t *buf);
 int file_copy(char *dst, char *src);
 int file_remove(char *path);
-
+int file_append(char *path, void *data, int datalen);
 
 #endif

+ 25 - 7
pro/src/json_handle.c

@@ -4957,8 +4957,6 @@ char* service_mqtt_ack_to_json(mqtt_info_t* info)
     cJSON* root = cJSON_CreateObject();
     cJSON_AddNumberToObject(root, "code", 200); 
 
-    cJSON* data_filed = cJSON_CreateObject();
-
 #if 1
     cJSON *tmp,*array=cJSON_CreateArray();
     if(array) {
@@ -4966,7 +4964,7 @@ char* service_mqtt_ack_to_json(mqtt_info_t* info)
         for(int i=0; i<MQTT_SER_MAX; i++) {
             mqtt_server_t *ser=&info->ser[i];
             cJSON *tmp=cJSON_CreateObject();
-            if(tmp) {
+            if(tmp && (ser->id==i)) {
                 sprintf(buf, "%d", ser->id);
                 cJSON_AddStringToObject(tmp,"idx", buf);
 
@@ -4983,13 +4981,33 @@ char* service_mqtt_ack_to_json(mqtt_info_t* info)
                 cJSON_AddItemToArray(array, tmp);
             }
         }
-        cJSON_AddItemToObject(data_filed, "data", array);
+        cJSON_AddItemToObject(root, "data", array);
     }
 #endif
-    //添加汇总
-    cJSON_AddItemToObject(root, "data", data_filed);
-    //添加结果
+
     cJSON_AddStringToObject(root, "msg", "操作成功");
+    str = cJSON_Print(root);    
+    cJSON_Delete(root);
+    return str;
+}
+
+char* mqtt_status_to_json(int mode)
+{
+    char* str = NULL;
+    char buf[20];
+    
+    cJSON* root = cJSON_CreateObject(); 
+
+    cJSON_AddNumberToObject(root, "code", 200);       
+    
+    cJSON* data_filed = cJSON_CreateObject();
+
+    sprintf(buf, "%d", mode);
+    cJSON_AddStringToObject(data_filed, "mode", buf);
+
+    cJSON_AddItemToObject(root, "data", data_filed);
+
+    cJSON_AddStringToObject(root, "msg", "操作成功");    
     //转换
     str = cJSON_Print(root);    
     //释放资源

+ 2 - 0
pro/src/json_handle.h

@@ -609,6 +609,8 @@ char* service_ntp_ack_to_json(NTPManager* __NTPManager_t);
 char* service_snmp_ack_to_json(SNMPManager* __SNMPManager_t);
 char* service_smtp_ack_to_json(smtp_info_t* info);
 char* service_mqtt_ack_to_json(mqtt_info_t* info);
+char* mqtt_status_to_json(int mode);
+
 char* service_group_ack_to_json(GroupInfo* _globalgroupInfo);
 ///请求管理
 cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequest);

+ 1 - 4
pro/src/main.c

@@ -25,14 +25,11 @@ int main(int argc,char* argv[])
         cnt++;
         if(cnt%MEM_PERIOD==0) {
             avaMB = sys_mem_get_available_MB();
-            printf("___@@@___ available:  %dMB, threshold: %dMB\n", avaMB, MEM_THRD);
+            printf("___ available mem:  %dMB, threshold: %dMB\n", avaMB, MEM_THRD);
             if(avaMB<MEM_THRD) {
                 printf("___$$$___ free mem less than %dMB, reboot now ...\n", MEM_THRD);
                 sys_reboot();
             }
-            else {
-                printf("___$$$___ free mem more than %dMB\n", MEM_THRD);
-            }
         }
         sleep(1);
     }

+ 328 - 153
pro/src/mqtt.c

@@ -24,6 +24,8 @@
 #endif
 
 
+#define SEND_PERIOD         5000    //ms
+
 #ifdef USE_MQTT
 
 char *topic_sub[MQTT_SUB_MAX]={
@@ -47,17 +49,20 @@ char *topic_pub[MQTT_PUB_MAX]={
 };
 
 typedef struct mg_mgr mgr_t;
+typedef struct mg_timer mg_timer_t;
 typedef struct mg_mqtt_opts mg_opts_t;
 typedef struct mg_connection mg_conn_t;
 
 typedef struct {
+    int  id;
     char topic[256];
     char content[2048];
 }mqtt_pkt_t;
 typedef struct _mqtt_conn_t{
     mg_conn_t       *c;
     mqtt_server_t   ser;
-    mg_opts_t       opts;
+    //mg_opts_t       opts;
+    uint8_t         flag[MQTT_PUB_MAX];
 }mqtt_conn_t;
 typedef struct {
     int           inited;
@@ -69,10 +74,15 @@ typedef struct {
     mqtt_conn_t   conn[MQTT_SER_MAX];
 
     handle_t      list;
+    mg_timer_t    *timer;
 }mqtt_handle_t;
 static mqtt_handle_t mqHandle={0};
 static int my_recv(char *topic, char *data);
 static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data);
+static void timer_start(mqtt_handle_t *h, int ms);
+static int send_stat(int type, int id);
+static uint32_t get_serv(char *json);
+static void send_once(void);
 
 //emqx serttle
 const char *ca_cert=
@@ -100,6 +110,23 @@ const char *ca_cert=
 "-----END CERTIFICATE-----\r\n";
 
 
+enum {
+    SERV_NTP=0,
+    SERV_SMTP,
+    SERV_MESG,
+    SERV_MQTT,
+    SERV_CLOUD,
+    SERV_TELNET,
+    SERV_SNMP_V1,
+    SERV_SNMP_V2C,
+    SERV_SNMP_V3,
+    SERV_SNMP_TRAP,
+    
+    SERV_MAX
+};
+#define BGET(flag,mask)  ((flag)&(1<<(mask)))
+#define BSET(flag,mask)  ((flag)|=(1<<(mask)))
+
 static int ser_cmp(mqtt_server_t *a, mqtt_server_t *b)
 {
     if(strcmp(a->server, b->server) || 
@@ -198,12 +225,23 @@ static int pub_one(mg_conn_t *c, char *topic, char *data)
 
     return 0;
 }
-static int my_pub(mqtt_handle_t *h, char *topic, char *data)
+static int is_period(int id)
+{
+    if(id==MQTT_PUB_INFO_DEVICE || id==MQTT_PUB_STAT_NETWORK ||
+       id==MQTT_PUB_STAT_SENSOR || id==MQTT_PUB_STAT_SERVICE) {
+        return 0;
+    }
+    return 1;
+}
+static int my_pub(mqtt_handle_t *h, int id, char *topic, char *data)
 {
     int i;
     for(i=0; i<MQTT_SER_MAX; i++) {
         if(h->conn[i].c) {
-            pub_one(h->conn[i].c, topic, data);
+            if(is_period(id) || !h->conn[i].flag[id]) {
+                pub_one(h->conn[i].c, topic, data);
+                h->conn[i].flag[id] = 1;
+            }
         }
     }
     return 0;
@@ -221,11 +259,6 @@ static int my_disconn(mqtt_handle_t *h)
 
     return 0;
 }
-static char *get_url(mqtt_server_t *ser)
-{
-    char *url=ser->server[0]?ser->server:(ser->ip[0]?ser->ip:NULL);
-    return url;
-}
 static GlobalPowerManger* get_power(mqtt_handle_t *h, int ch)
 {
     GlobalPowerManger *tmp=NULL;
@@ -258,64 +291,75 @@ static int set_ch(mqtt_handle_t *h, int ch, int flag)
     }
     return 0;
 }
-static int get_sensor(mqtt_handle_t *h, int type, int id)
+static GlobalSensorManger* get_sensor(mqtt_handle_t *h, int id)
 {
+    GlobalSensorManger *tmp=NULL;
 
+    lock_s_hold(LOCK_ID_SENSOR);
+    list_for_each_entry(tmp, &h->dm->_globalSensorManger.list, list)
+    {
+        if(tmp->sensor_id==id) {
+            return tmp;
+        }
+    }
+    lock_s_release(LOCK_ID_SENSOR);
 
-    return 0;
+    return NULL;
 }
 
-
-
 //////////////////////////////////////////////////////////////
-
-
-static int my_conn(mqtt_handle_t *h, mqtt_info_t *info)
+static int get_url(mqtt_server_t *ser, char *url)
 {
-    int i,j,r=-1;
-    char *url=NULL;
-    mqtt_server_t *ser=info->ser;
+    int port=1883;
+    char *head="mqtts";
 
-    for(i=0; i<MQTT_SER_MAX; i++) {
-        url = get_url(&ser[i]);
-        if(url) {
-            if(h->conn[i].c==NULL) {
-                mg_opts_t opts={
-                    .clean = true,
-                    .qos = 1,
-                    .version = 4,
-                    .keepalive = 60,
-                    //.topic = mg_str("hello"),
-                    //.message = mg_str("bye"),
-                    .client_id = mg_str(ser[i].cid),
-                    .user = mg_str(ser[i].user),
-                    .pass = mg_str(ser[i].password),
-                };
-                char *url=get_url(&ser[i]);
-
-                h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &opts, mqtt_fn, &h->conn[i]);
-                if(h->conn[i].c) {
-                    h->conn[i].ser = ser[i];
-                    h->conn[i].opts = opts;
-                    my_sub(h->conn[i].c, h->prod_id);
-                }
-            }
-        }
+    if((!ser->server[0] && !ser->ip[0]) || !ser->port[0]) {
+        return -1;
     }
 
+    port = atoi(ser->port);
+    if(port==1883) {
+        head = "mqtt";
+    }
+    else if(port==8883) {
+        head = "mqtts";
+    }
+    else if(port==8083) {
+        head = "ws";
+    }
+    else if(port==8884) {
+        head = "wss";
+    }
+
+    char *server=(ser->server[0]?ser->server:ser->ip);
+    sprintf(url, "%s://%s:%d", head, server, port);
     return 0;
 }
-static int my_check(mqtt_handle_t *h)
+static int my_conn(mqtt_handle_t *h)
 {
-    int i,r=-1;
-    char *url=NULL;
+    int i,j,r=-1;
+    char url[1024];
     mqtt_server_t *ser=h->dm->mqttInfo.ser;
 
     for(i=0; i<MQTT_SER_MAX; i++) {
-        url = get_url(&h->conn[i].ser);
-        if(h->conn[i].c==NULL && url) {
-            h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &h->conn[i].opts, mqtt_fn, &h->conn[i]);
+        r = get_url(&ser[i], url);
+        if((r==0) && (!h->conn[i].c)) {
+            mg_opts_t opts={
+                .clean = true,
+                .qos = 1,
+                .version = 4,
+                .keepalive = 60,
+                //.topic = mg_str("hello"),
+                //.message = mg_str("bye"),
+                .client_id = mg_str(ser[i].cid),
+                .user = mg_str(ser[i].user),
+                .pass = mg_str(ser[i].password),
+            };
+
+            h->conn[i].c = mg_mqtt_connect(&h->mgr, url, &opts, mqtt_fn, &h->conn[i]);
             if(h->conn[i].c) {
+                h->conn[i].ser = ser[i];
+                //h->conn[i].opts = opts;
                 my_sub(h->conn[i].c, h->prod_id);
             }
         }
@@ -323,6 +367,7 @@ static int my_check(mqtt_handle_t *h)
 
     return 0;
 }
+
 static int my_send(mqtt_handle_t *h)
 {
     int r=-1;
@@ -331,7 +376,7 @@ static int my_send(mqtt_handle_t *h)
     r = xlist_get_node(h->list, &ln, 0);
     if(r==0) {
         mqtt_pkt_t *pkt=(mqtt_pkt_t*)ln->data.buf;
-        my_pub(h, pkt->topic, pkt->content);
+        my_pub(h, pkt->id, pkt->topic, pkt->content);
     }
 
     return r;
@@ -340,7 +385,7 @@ static int my_send(mqtt_handle_t *h)
 static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
 {
     mqtt_handle_t *h=&mqHandle;
-    mqtt_conn_t *mc=get_conn(h,c);
+    mqtt_conn_t *mc=((mqtt_conn_t*)(c->fn_data));
     
     switch(ev) {
         case MG_EV_OPEN:
@@ -364,13 +409,16 @@ static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
 
         case  MG_EV_MQTT_OPEN:
         {
-            //
+            LOGD("____ MG_EV_MQTT_OPEN\n");
+            //send_once();
         }
         break;
 
         case  MG_EV_POLL:
         {
-            my_send(h);
+            LOGD("____ MG_EV_POLL\n");
+            my_conn(h);
+            send_once();
         }
         break;
         
@@ -386,13 +434,15 @@ static void mqtt_fn(mg_conn_t *c, int ev, void *ev_data)
         case MG_EV_ERROR:
         {
             MG_ERROR(("___MG_EV_ERROR, %p %s", c->fd, (char *) ev_data));
+            memset(mc->flag, 0, sizeof(mc->flag));
         }
         break;
 
         case MG_EV_CLOSE:
         {
             LOGD("____ MG_EV_CLOSE\n");
-            ((mqtt_conn_t *)(c->fn_data))->c = NULL;
+            mc->c = NULL;
+            memset(mc->flag, 0, sizeof(mc->flag));
         }
         break;
     }
@@ -403,19 +453,44 @@ static void* mqtt_thread(void *arg)
     thread_handle_t *th=(thread_handle_t*)arg;
     mqtt_handle_t   *h=(mqtt_handle_t*)th->arg;
     mqtt_info_t     *info=&h->dm->mqttInfo;
-
-    my_conn(h, info);
+    
+    //timer_start(h, SEND_PERIOD);
+    my_conn(h);
     while(th->quit==0) {
-        my_check(h);
-        mg_mgr_poll(&h->mgr, 500);
+        mg_mgr_poll(&h->mgr, 2000);
     }
     my_disconn(h);
+    timer_start(h, 0);
 
     pthread_exit(NULL);
 }
 #endif
 
+static void send_once(void)
+{
+    send_stat(MQTT_PUB_INFO_DEVICE, 0);
+    send_stat(MQTT_PUB_STAT_NETWORK, 0);
+    send_stat(MQTT_PUB_STAT_SENSOR, 0);
+    send_stat(MQTT_PUB_STAT_SERVICE, 0);
+}
+static void send_period(void *arg)
+{
+    send_stat(MQTT_PUB_STAT_POWER_ALL, 0);
+    send_stat(MQTT_PUB_STAT_POWER_CHN, 0);
+}
+
+static void timer_start(mqtt_handle_t *h, int ms)
+{
+    static mg_timer_t t;
+    if(h->timer) {
+        mg_timer_free(&h->timer, &t);
+        h->timer = NULL;
+    }
 
+    if(ms>0) {
+        mg_timer_init(&h->timer, &t, ms, MG_TIMER_REPEAT|MG_TIMER_RUN_NOW, send_period, h);
+    }
+}
 //////////////////////////////////////////////////////////////////////////
 int mqtt_init(void)
 {
@@ -426,6 +501,8 @@ int mqtt_init(void)
     
     memset(h, 0, sizeof(mqtt_handle_t));
     mg_mgr_init(&h->mgr);
+
+    mg_log_set(MG_LL_DEBUG);
     
     h->dm = &__globalDeviceManage;
     h->prod_id = h->dm->_globalDevInfo.product_id;
@@ -445,7 +522,7 @@ int mqtt_init(void)
     r = 0;
 #endif
 
-    mqtt_test();
+    //mqtt_test();
 
     return r;
 }
@@ -469,7 +546,7 @@ int mqtt_deinit(void)
 }
 
 
-int mqtt_post(int type, int id, void *data)
+static int send_stat(int type, int id)
 {
     int r=-1;
 
@@ -643,14 +720,17 @@ int mqtt_post(int type, int id, void *data)
                 cJSON_AddStringToObject(root,"Topic", topic);
                 cJSON* data=cJSON_CreateObject();
                 if(data) {
-                    cJSON_AddStringToObject(data,"name", "temp sensor");
-                    cJSON_AddStringToObject(data,"type", "0");
-                    cJSON_AddStringToObject(data,"modbus_address", "");
-                    cJSON_AddStringToObject(data,"node", "-1");
-                    cJSON_AddStringToObject(data,"status", "1");
-                    cJSON_AddStringToObject(data,"value_num", "");
-                    cJSON_AddStringToObject(data,"value1", "");
-                    cJSON_AddStringToObject(data,"value2", "");
+                    GlobalSensorManger *tmp=get_sensor(h, id);
+                    if(tmp) {
+                        cJSON_AddStringToObject(data,"name", "temp sensor");
+                        cJSON_AddStringToObject(data,"type", get_int_str(tmp->sensor_type));
+                        cJSON_AddStringToObject(data,"modbus_address", get_int_str(tmp->sensor_addr));
+                        cJSON_AddStringToObject(data,"node", get_int_str(tmp->sensor_node_number));
+                        cJSON_AddStringToObject(data,"status", get_int_str(tmp->sensor_status));
+                        cJSON_AddStringToObject(data,"value_num", get_int_str(tmp->sensor_val_count));
+                        cJSON_AddStringToObject(data,"value1", get_float_str(tmp->Cur_sensor_info.val1));
+                        cJSON_AddStringToObject(data,"value2", get_float_str(tmp->Cur_sensor_info.val2));
+                    }
                     cJSON_AddStringToObject(data,"date", date);
                     cJSON_AddStringToObject(data,"time", time);
 
@@ -670,16 +750,18 @@ int mqtt_post(int type, int id, void *data)
                 cJSON_AddStringToObject(root,"Topic", topic);
                 cJSON* data=cJSON_CreateObject();
                 if(data) {
-                    cJSON_AddStringToObject(data,"telnet", "0");
-                    cJSON_AddStringToObject(data,"smtp", "1");
-                    cJSON_AddStringToObject(data,"snmp_v1", "1");
-                    cJSON_AddStringToObject(data,"snmp_v2c", "1");
-                    cJSON_AddStringToObject(data,"snmp_v3", "1");
-                    cJSON_AddStringToObject(data,"snmp_trap", "1");
-                    cJSON_AddStringToObject(data,"message", "");
-                    cJSON_AddStringToObject(data,"mqtt", "1");
-                    cJSON_AddStringToObject(data,"cloud", "1");
-                    cJSON_AddStringToObject(data,"ntp", "1");
+
+                    uint32_t flag = get_serv(NULL);
+                    cJSON_AddStringToObject(data,"telnet", BGET(flag, SERV_TELNET)?"1":"0");
+                    cJSON_AddStringToObject(data,"smtp", BGET(flag, SERV_SMTP)?"1":"0");
+                    cJSON_AddStringToObject(data,"snmp_v1", BGET(flag, SERV_SNMP_V1)?"1":"0");
+                    cJSON_AddStringToObject(data,"snmp_v2c", BGET(flag, SERV_SNMP_V2C)?"1":"0");
+                    cJSON_AddStringToObject(data,"snmp_v3", BGET(flag, SERV_SNMP_V3)?"1":"0");
+                    cJSON_AddStringToObject(data,"snmp_trap", BGET(flag, SERV_SNMP_TRAP)?"1":"0");
+                    cJSON_AddStringToObject(data,"message", BGET(flag, SERV_MESG)?"1":"0");
+                    cJSON_AddStringToObject(data,"mqtt", BGET(flag, SERV_MQTT)?"1":"0");
+                    cJSON_AddStringToObject(data,"cloud", BGET(flag, SERV_CLOUD)?"1":"0");
+                    cJSON_AddStringToObject(data,"ntp", BGET(flag, SERV_NTP)?"1":"0");
                     cJSON_AddStringToObject(data,"date", date);
                     cJSON_AddStringToObject(data,"time", time);
 
@@ -692,6 +774,53 @@ int mqtt_post(int type, int id, void *data)
         }
         break;
 
+        default:
+        return -1;
+    }
+
+    mqtt_pkt_t pkt;
+    snprintf(pkt.topic, sizeof(pkt.topic), "%s", topic);
+    snprintf(pkt.content, sizeof(pkt.content), "%s", content);
+    r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
+    cJSON_free(content);
+#endif
+
+    return r;
+}
+
+
+static int send_alarm(int type, int subtype, char *content, alarm_para_t *para)
+{
+    int r=-1;
+
+#ifdef USE_MQTT
+    char topic[256];
+    mqtt_handle_t *h=&mqHandle;
+    char date[40],time[40];
+    int pub_type;
+    char *json_str=NULL;
+
+    if(!h->inited) {
+        return -1;
+    }
+    
+    if(type==ALARM_TYPE_POWER) {
+        pub_type = MQTT_PUB_ALARM_POWER;
+    }
+    else if(type==ALARM_TYPE_SENSOR) {
+        pub_type = MQTT_PUB_ALARM_SENSOR;
+    }
+    else if(type==ALARM_TYPE_NETWORK) {
+        pub_type = MQTT_PUB_ALARM_NETWORK;
+    }
+    else {
+        return -1;
+    }
+
+    snprintf(topic, sizeof(topic), topic_pub[pub_type], h->prod_id);
+    get_date_time(date, time);
+
+    switch(pub_type) {
         case MQTT_PUB_ALARM_NETWORK:
         case MQTT_PUB_ALARM_SENSOR:
         case MQTT_PUB_ALARM_POWER:
@@ -701,36 +830,41 @@ int mqtt_post(int type, int id, void *data)
                 cJSON_AddStringToObject(root,"Topic", topic);
                 cJSON* data=cJSON_CreateObject();
                 if(data) {
-                    cJSON_AddStringToObject(data,"num", "temp sensor");
-                    cJSON_AddStringToObject(data,"context", "");
-                    cJSON_AddStringToObject(data,"action", "1");
-                    cJSON_AddStringToObject(data,"action_para", "7");
+                    cJSON_AddStringToObject(data,"num", get_int_str(para->nalarm));     //alarm number, how to get?
+                    cJSON_AddStringToObject(data,"context", content);
+                    cJSON_AddStringToObject(data,"action", get_int_str(para->action));
+                    cJSON_AddStringToObject(data,"action_para", get_int_str(para->actionId));
                     cJSON_AddStringToObject(data,"date", date);
                     cJSON_AddStringToObject(data,"time", time);
 
                     cJSON_AddItemToObject(root, "Data", data);
                 }
 
-                content = cJSON_Print(root);    
+                json_str = cJSON_Print(root);    
                 cJSON_Delete(root);
             }
         }
         break;
-
-        default:
-        return -1;
     }
 
     mqtt_pkt_t pkt;
     snprintf(pkt.topic, sizeof(pkt.topic), "%s", topic);
-    snprintf(pkt.content, sizeof(pkt.content), "%s", content);
+    snprintf(pkt.content, sizeof(pkt.content), "%s", json_str);
     r = xlist_append(h->list, 0, &pkt, sizeof(pkt));
-    cJSON_free(content);
+    cJSON_free(json_str);
 #endif
 
     return r;
 }
 
+
+int mqtt_post_alarm(int type, int subtype, char *content, alarm_para_t *para)
+{
+    return send_alarm(type, subtype, content, para);
+}
+
+
+#ifdef USE_MQTT
 //////////////////////////////////////////////////////////
 static int get_cmd(char *json)
 {
@@ -748,21 +882,6 @@ static int get_cmd(char *json)
 
     return cmd;
 }
-
-enum {
-    SERV_NTP=0,
-    SERV_SMTP,
-    SERV_MESG,
-    SERV_MQTT,
-    SERV_CLOUD,
-    SERV_TELNET,
-    SERV_SNMP_V1,
-    SERV_SNMP_V2C,
-    SERV_SNMP_V3,
-    SERV_SNMP_TRAP,
-    
-    SERV_MAX
-};
 const char *serv_str[SERV_MAX]={
     "ntp",
     "smtp",
@@ -775,26 +894,118 @@ const char *serv_str[SERV_MAX]={
     "snmp_v3",
     "snmp_trap",
 };
+
 static uint32_t get_serv(char *json)
 {
     int i;
     cJSON* tmp=NULL;
     uint32_t flag=0;
 
-    cJSON* cjson=cJSON_Parse(json);
-    if(cjson) {
-        for(i=0; i<SERV_MAX; i++) {
-            tmp = cJSON_GetObjectItem(cjson, serv_str[i]);
-            if(tmp && tmp->valuestring) {
-                flag |= (atoi(tmp->valuestring)<<i);
+    if(json) {
+        cJSON* cjson=cJSON_Parse(json);
+        if(cjson) {
+            for(i=0; i<SERV_MAX; i++) {
+                tmp = cJSON_GetObjectItem(cjson, serv_str[i]);
+                if(tmp && tmp->valuestring) {
+                    flag |= (atoi(tmp->valuestring)<<i);
+                }
             }
+
+            cJSON_Delete(cjson);
+        }
+    }
+    else {
+        if(thread_is_running(THREAD_ID_NTP)) {
+            BSET(flag, SERV_NTP);
         }
 
-        cJSON_Delete(cjson);
+        if(thread_is_running(THREAD_ID_SMTP)) {
+            BSET(flag, SERV_SMTP);
+        }
+
+        if(thread_is_running(THREAD_ID_MQTT)) {
+            BSET(flag, SERV_MQTT);
+        }
+
+#if 0
+        if(thread_is_running(SERV_MESG)) {
+            BSET(flag, SERV_MESG);
+        }
+
+        if(thread_is_running(THREAD_ID_CLOUD)) {
+            BSET(flag, SERV_CLOUD);
+        }
+
+        if(thread_is_running(THREAD_ID_TELNET)) {
+            BSET(flag, SERV_TELNET);
+        }
+
+        if(thread_is_running(SERV_SNMP_V1)) {
+            BSET(flag, SERV_NTP);
+        }
+
+        if(thread_is_running(SERV_SNMP_V1)) {
+            BSET(flag, SERV_NTP);
+        }
+#endif
     }
 
     return flag;
 }
+static int set_serv(uint32_t flag)
+{
+    if(BGET(flag,SERV_NTP)) {
+        //
+    }
+    else {
+
+    }
+
+    if(BGET(flag,SERV_SMTP)) {
+
+    }
+    else {
+        
+    }
+
+    if(BGET(flag,SERV_MESG)) {
+
+    }
+    else {
+        
+    }
+
+    if(BGET(flag,SERV_MQTT)) {
+
+    }
+    else {
+        
+    }
+
+    if(BGET(flag,SERV_CLOUD)) {
+
+    }
+    else {
+        
+    }
+
+    if(BGET(flag,SERV_TELNET)) {
+
+    }
+    else {
+        
+    }
+
+    if(BGET(flag,SERV_SNMP_V1) || BGET(flag,SERV_SNMP_V2C) || BGET(flag,SERV_SNMP_V3) || BGET(flag,SERV_SNMP_TRAP)) {
+
+    }
+    else {
+        
+    }
+
+    return 0;
+}
+
 
 
 static int my_recv(char *topic, char *data)
@@ -803,6 +1014,7 @@ static int my_recv(char *topic, char *data)
 
 #ifdef USE_MQTT
     char temp[512];
+    uint32_t flag=0;
     mqtt_handle_t *h=&mqHandle;
 
     for(i=0; i<MQTT_SUB_MAX; i++) {
@@ -887,38 +1099,9 @@ static int my_recv(char *topic, char *data)
 
                 case MQTT_SUB_CMD_SERVICE:
                 {
-                    LOGD("___ MQTT_SUB_CMD_SERVICE\n");
-                    uint32_t flag=get_serv(data);
-                    if(flag&(1<<SERV_NTP)) {
-
-                    }
-                    if(flag&(1<<SERV_SMTP)) {
-
-                    }
-                    if(flag&(1<<SERV_MESG)) {
-
-                    }
-                    if(flag&(1<<SERV_MQTT)) {
-
-                    }
-                    if(flag&(1<<SERV_CLOUD)) {
-
-                    }
-                    if(flag&(1<<SERV_TELNET)) {
-
-                    }
-                    if(flag&(1<<SERV_SNMP_V1)) {
-
-                    }
-                    if(flag&(1<<SERV_SNMP_V2C)) {
-
-                    }
-                    if(flag&(1<<SERV_SNMP_V3)) {
-
-                    }
-                    if(flag&(1<<SERV_SNMP_TRAP)) {
-
-                    }
+                    flag = get_serv(data);
+                    LOGD("___ MQTT_SUB_CMD_SERVICE, 0x%08x\n", flag);
+                    set_serv(flag);
                 }
                 break;
             }
@@ -928,7 +1111,7 @@ static int my_recv(char *topic, char *data)
 
     return 0;
 }
-
+#endif
 
 int mqtt_test(void)
 {
@@ -942,14 +1125,14 @@ int mqtt_test(void)
             .cid = "mqtlx_e92334545tet3465",
 
     #if 0
-            .server = "192.168.1.12:1883",
+            .server = "192.168.1.12",
             .ip = "",
             .port = "1883",
 
             //root
             //root0219107X
     #else
-            .server = "mqtts://gaae4d7b.ala.cn-hangzhou.emqxsl.cn:8883",
+            .server = "mqtts://gaae4d7b.ala.cn-hangzhou.emqxsl.cn",
             .ip = "",
             .port = "8883",
     #endif
@@ -966,14 +1149,6 @@ int mqtt_test(void)
     h->dm->mqttInfo = mInfo;
     //mg_log_set(MG_LL_VERBOSE);
 
-    while(cnt<3) {
-        mqtt_post(MQTT_PUB_INFO_DEVICE, 0, 0);
-        sleep(1);
-        cnt++;
-    }
-
-
-
 #endif
     return 0;
 }

+ 8 - 1
pro/src/mqtt.h

@@ -27,10 +27,17 @@ enum {
     MQTT_PUB_MAX
 };
 
+typedef struct {
+    int id;
+    int nalarm;
+    int action;
+    int actionId;
+}alarm_para_t;
+
 int mqtt_init(void);
 int mqtt_deinit(void);
 
-int mqtt_post(int type, int id, void *data);
+int mqtt_post_alarm(int type, int subtype, char *content, alarm_para_t *para);
 int mqtt_test(void);
 
 #endif

+ 8 - 0
pro/src/netswitch.c

@@ -11,6 +11,7 @@
 #include "smtp.h"
 #include "sqlite_handle.h"
 #include "smtp.h"
+#include "mqtt.h"
 
 
 #if 1
@@ -845,6 +846,13 @@ static int sw_alarm(netswitch_evts_t *evts, netswitch_info_t *old, netswitch_inf
     if(flag) {
         r = dev_insert_alarm_info(get_db(), get_prod_id(), 2, time_str, alarm_str);
         smtp_post_alarm(ALARM_TYPE_NETWORK, 0, NETWORK_MAC_CHANGED, alarm_str);
+
+        alarm_para_t para;
+        para.id = i+1;
+        para.nalarm = 1;
+        para.action = -1;
+        para.actionId = -1;
+        mqtt_post_alarm(ALARM_TYPE_NETWORK, 0, alarm_str, &para);
     }
 
     return r;

+ 60 - 18
pro/src/sqlite_handle.c

@@ -6,6 +6,7 @@
 #include "paras.h"
 #include "cfg.h"
 #include "smtp.h"
+#include "mqtt.h"
 #include "switch_ctrl.h"
 
 #define	TOTAL_COUNT	60//统计总数
@@ -3469,36 +3470,43 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
     int languagesID = 0;
     struct tm *t;
     char CtrlData[64];
+    int alarm_action=-1;
+
     memset(CtrlData, 0, sizeof(CtrlData));
     switch (_AlarmType)
     {
     case WARNING_V_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText,"$通道$|%s |$%s$|$%s$| %s",__globalPowerTemp->product_ch_name,language_alarm_V[languagesID],language_alarm_Up[languagesID],CtrlData);
     }
         break;
     case WARNING_V_DOWN:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText,"$通道$|%s |$%s$|$%s$| %s",__globalPowerTemp->product_ch_name,language_alarm_V[languagesID],language_alarm_Down[languagesID],CtrlData);
     }
         break;
     case WARNING_A_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText,"$通道$|%s |$%s$|$%s$| %s",__globalPowerTemp->product_ch_name,language_alarm_A[languagesID],language_alarm_Up[languagesID],CtrlData);
     }        
         break;
     case WARNING_W_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText,"$通道$|%s |$%s$|$%s$| %s",__globalPowerTemp->product_ch_name,language_alarm_W[languagesID],language_alarm_Up[languagesID],CtrlData);
     }
         break;
     case WARNING_P_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText,"$通道$|%s |$%s$|$%s$| %s",__globalPowerTemp->product_ch_name,language_alarm_P[languagesID],language_alarm_Up[languagesID],CtrlData);
     }
     break;
@@ -3529,9 +3537,15 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
     dev_insert_alarm_info(globalDeviceManger->db,__globalPowerTemp->product_id,0,buffer,AlarmText);
 
-
-    // 超限动作
     smtp_post_alarm(ALARM_TYPE_POWER, 0, _AlarmType, AlarmText);
+
+    alarm_para_t para;
+    //dev_search_last_Index(globalDeviceManger->db, );
+    para.id = __globalPowerTemp->product_ch_id;
+    para.nalarm = 1;
+    para.action = alarm_action;
+    para.actionId = -1;
+    mqtt_post_alarm(ALARM_TYPE_POWER, 0, AlarmText, &para);
     
     int ret = -1 ;
     int nchID = __globalPowerTemp->product_ch_id;
@@ -3614,40 +3628,47 @@ int dev_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,GlobalPowerMa
  */
 int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeACManager* __globalPowerTemp,int _AlarmType)
 {
-        char AlarmText[256];
+    char AlarmText[256];
     int languagesID=0;
     struct tm *t;
     char CtrlData[64];
+    int alarm_action=-1;
+
     memset(CtrlData,0,sizeof(CtrlData));
     switch (_AlarmType)
     {
     case ENABLE_TAC_V_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_vol_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText, "$通道$|CH%d%c |$%s$|$%s$| %s", __globalPowerTemp->product_ch_id, 'A' + __globalPowerTemp->product_ph_type, language_alarm_V[languagesID], language_alarm_Up[languagesID],CtrlData);
     }
     break;
     case ENABLE_TAC_V_DOWN:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_vol_over_lower_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText, "$通道$|CH%d%c |$%s$|$%s$| %s", __globalPowerTemp->product_ch_id, 'A' + __globalPowerTemp->product_ph_type, language_alarm_V[languagesID], language_alarm_Down[languagesID],CtrlData);
     }
     break;
     case ENABLE_TAC_A_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_cur_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText, "$通道$|CH%d%c |$%s$|$%s$| %s", __globalPowerTemp->product_ch_id, 'A' + __globalPowerTemp->product_ph_type, language_alarm_A[languagesID], language_alarm_Up[languagesID],CtrlData);
     }
     break;
     case ENABLE_TAC_W_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_pwr_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText, "$通道$|CH%d%c |$%s$|$%s$| %s", __globalPowerTemp->product_ch_id, 'A' + __globalPowerTemp->product_ph_type, language_alarm_W[languagesID], language_alarm_Up[languagesID],CtrlData);
     }
     break;
     case ENABLE_TAC_P_UP:
     {
-        get_message_CtrlType(__globalPowerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl,CtrlData);
+        alarm_action = __globalPowerTemp->global_over_manager->product_pwrcon_over_upper_threshold_ctrl;
+        get_message_CtrlType(alarm_action,CtrlData);
         sprintf(AlarmText, "$通道$|CH%d%c |$%s$|$%s$| %s", __globalPowerTemp->product_ch_id, 'A' + __globalPowerTemp->product_ph_type, language_alarm_P[languagesID], language_alarm_Up[languagesID],CtrlData);
     }
     break;
@@ -3682,6 +3703,13 @@ int dev_Alarm_T_AC_message(GlobalDeviceManager* globalDeviceManger, GlobalTreeAC
 
     smtp_post_alarm(ALARM_TYPE_POWER, 1, _AlarmType, AlarmText);
 
+    alarm_para_t para;
+    para.id = __globalPowerTemp->product_ch_id;
+    para.nalarm = 1;
+    para.action = alarm_action;
+    para.actionId = -1;
+    mqtt_post_alarm(ALARM_TYPE_POWER, 1, AlarmText, &para);
+
     return 0;
 }
 /**
@@ -3767,6 +3795,13 @@ int dev_sensor_Alarm_send_message(GlobalDeviceManager* globalDeviceManger,Global
     int subtype=__globalPowerTemp->sensor_type;
     smtp_post_alarm(ALARM_TYPE_SENSOR, subtype, _AlarmType, AlarmText);
 
+    alarm_para_t para;
+    para.id = __globalPowerTemp->sensor_id;
+    para.nalarm = 1;
+    para.action = -1;
+    para.actionId = -1;
+    mqtt_post_alarm(ALARM_TYPE_POWER, subtype, AlarmText, &para);
+
     return 0;
 }
 int dev_Alarm_Run_message(GlobalDeviceManager* globalDeviceManger, const char* strRunMSG, const char *strOther)
@@ -4253,9 +4288,12 @@ int dev_mqtt_init(sqlite3 *db, mqtt_server_t *ser)
     return 0;
 }
 
+
+#include "sys.h"
 int dev_mqtt_update(sqlite3 *db, mqtt_server_t *ser)
 {
     int i,r=0,exist=0,cnt=0;
+    char mac[10];
 
 #ifdef USE_MQTT
     char temp[1024];
@@ -4263,13 +4301,17 @@ int dev_mqtt_update(sqlite3 *db, mqtt_server_t *ser)
     char *errmsg=NULL;
     char *table=MQTT_MANAGER_TABLE;
 
+    if(sys_get_mac(mac, sizeof(mac))==0) {
+        sprintf(ser->cid, "smartPDU_%s", mac);
+    }
+
     cnt = get_count(db, table);
     if(cnt>0) {
         sprintf(temp, "UPDATE %s SET id=%d, mode=%d, server='%s', ip='%s', port='%s', cid='%s', user='%s', password='%s', WHERE id=%d;", 
                 table, ser->id, ser->mode, ser->server, ser->ip, ser->port, ser->cid, ser->user, ser->password, ser->id);
         r = sqlite3_exec(db, temp, NULL, 0, &errmsg);
         if(r != SQLITE_OK) {
-            log_e("___sw_update_port failed, %s, %s\n\n", temp, errmsg);
+            log_e("___dev_mqtt_update, sqlite3_exec failed, %s, %s\n\n", temp, errmsg);
             sqlite3_free(errmsg);
         }
         else {
@@ -4281,15 +4323,15 @@ int dev_mqtt_update(sqlite3 *db, mqtt_server_t *ser)
         sprintf(temp, "INSERT INTO %s (id,mode,server,ip,port,cid,user,password) VALUES (?,?,?,?,?,?,?,?);", table);
         r = sqlite3_prepare_v2(db, temp, -1, &stmt, 0);
         if (r != SQLITE_OK) {
-            log_e("___dev_smtp_update_man, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
+            log_e("___dev_mqtt_update, sqlite3_prepare_v2 failed, %s\n", sqlite3_errmsg(db));
             r = -1; goto quit;
         }
 
         sqlite3_bind_int(stmt,  1, ser->id);
         sqlite3_bind_int(stmt,  2, ser->mode);
         sqlite3_bind_text(stmt, 3, ser->server,   -1, NULL);
-        sqlite3_bind_text(stmt, 4, ser->port,     -1, NULL);
-        sqlite3_bind_text(stmt, 5, ser->ip,       -1, NULL);
+        sqlite3_bind_text(stmt, 4, ser->ip,       -1, NULL);
+        sqlite3_bind_text(stmt, 5, ser->port,     -1, NULL);
         sqlite3_bind_text(stmt, 6, ser->cid,      -1, NULL);
         sqlite3_bind_text(stmt, 7, ser->user,     -1, NULL);
         sqlite3_bind_text(stmt, 8, ser->password, -1, NULL);
@@ -4298,7 +4340,7 @@ int dev_mqtt_update(sqlite3 *db, mqtt_server_t *ser)
         sqlite3_finalize(stmt);
 
         if (r != SQLITE_DONE) {
-            log_e("___sw_update_all, sqlite3_step failed\n");
+            log_e("___dev_mqtt_update, sqlite3_step failed\n");
             r = -1;
         }
     }

+ 26 - 0
pro/src/sys.c

@@ -1068,6 +1068,32 @@ int sys_mem_get_available_MB(void)
 }
 
 
+int sys_get_mac(char *mac, int maclen)
+{
+    int sock;
+    struct ifreq ifr;
+
+    if(!mac || maclen<6) {
+        return -1;
+    }
+
+    sock = socket(AF_INET, SOCK_DGRAM, 0);
+    if (sock == -1){
+        return -1;
+    }
+
+    strcpy(ifr.ifr_name, "eth0");
+    if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
+        close(sock); return -1;
+    }
+    close(sock);
+
+    uint8_t *p = (uint8_t*)ifr.ifr_hwaddr.sa_data;
+    snprintf(mac, maclen, "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]);
+
+    return 0;
+}
+
 
 int sys_init(void)
 {

+ 1 - 1
pro/src/sys.h

@@ -27,6 +27,6 @@ int sys_is_running(char *prog);
 int sys_get_path(char *path, char *name);
 int sys_get_net(NetworkInfo_t *para, int ipVersion);
 int sys_set_net(NetworkInfo_t *para, int ipVersion);
-
+int sys_get_mac(char *mac, int maclen);
 
 #endif

+ 10 - 10
pro/src/thread.c

@@ -39,14 +39,16 @@ int thread_start(int id, thread_fn fn, void *arg, int stksize, int prio)
 #endif
     
     r = pthread_create(&h->tid, &attr, fn, h);
-#if 0
     if(r==0) {
+        h->running = 1;
+#if 0
         r = pthread_setschedprio(h->tid, prio);
         if(r) {
             printf("____ set thread prio %d failed\n", prio);
         }
-    }
 #endif
+    }
+
 
     pthread_attr_destroy(&attr);
 
@@ -63,6 +65,7 @@ int thread_stop(int id)
     h->quit = 1;
     pthread_join(h->tid, NULL);
     h->tid = 0;
+    h->running = 0;
     h->arg = NULL;
     h->fn  = NULL;
     
@@ -84,15 +87,12 @@ int thread_stop_all(void)
 
 int thread_is_running(int id)
 {
-    //if(pthread_kill(0, 0)==0)
-    if(1)
-    {
-        //exist
-    }
-    else {
-        //not exist
+    if(id>=THREAD_ID_MAX) {
+        return 0;
     }
-    return 0;
+    
+    thread_handle_t *h=&myThdHandles[id];
+    return h->running;
 }
 
 

+ 2 - 0
pro/src/thread.h

@@ -38,6 +38,7 @@ typedef void *(*thread_fn)(void *arg);
 typedef struct {
     pthread_t  tid;
     int        quit;
+    int        running;
     void       *arg;
     thread_fn  fn;
     void       *stk;
@@ -48,6 +49,7 @@ int thread_start(int id, thread_fn fn, void *arg, int stksize, int prio);
 int thread_stop(int id);
 int thread_stop_all(void);
 
+int thread_is_running(int id);
 int thread_start_simp(thread_fn fn, void *arg, int stksize);
 int thread_print_stacksize(void);