Bläddra i källkod

1、修复无法添加多个MQTT服务器问题;2、修复多个MQTT服务器同时发布时,乱码问题

liyuezong 1 år sedan
förälder
incheckning
b601791c76
4 ändrade filer med 127 tillägg och 13 borttagningar
  1. 111 10
      pro/src/appweb_handle.c
  2. 2 1
      pro/src/common.h
  3. 1 0
      pro/src/json_handle.c
  4. 13 2
      pro/src/mqtt.c

+ 111 - 10
pro/src/appweb_handle.c

@@ -4136,19 +4136,120 @@ static void serviceManagement(void *conn)
     {
         int save_flag=0;
         _MQTT_ServerRequestInfo *req=&_serviceManageRequestInfo._mqtt_info;
-        mqtt_server_t *ser=&gdm->mqttInfo.ser[req->idx];
+        if (req->idx >= 0 && req->idx < MQTT_SER_MAX)
+        {
+            mqtt_server_t *ser = &gdm->mqttInfo.ser[req->idx];
+            
+            int change_flag=0;
 
-        if(req->idx |= ser->id) { ser->id = req->idx; save_flag=1; }
-        if(req->name) { strcpy(ser->name, req->name); save_flag=1; }
-        if(req->server) { strcpy(ser->server, req->server); save_flag=1; }
-        if(req->port) { strcpy(ser->port, req->port); save_flag=1; }
-        if(req->user) { strcpy(ser->user, req->user); save_flag=1; }
-        if(req->password) { strcpy(ser->password, req->password); save_flag=1; }
-        if(req->cid) { strcpy(ser->cid, req->cid); save_flag=1; }
+            if (req->idx |= ser->id)
+            {
+                ser->id = req->idx;
+                save_flag = 1;
+            }
+            if (req->name)
+            {
+                strcpy(ser->name, req->name);
+                save_flag = 1;
+            }
+            if (req->server)
+            {
+                if (!strcmp(ser->server, req->server))
+                    change_flag = 1;
+                strcpy(ser->server, req->server);
+                save_flag = 1;
+            }
+            if (req->port)
+            {
+                if (!strcmp(ser->port, req->port))
+                    change_flag = 1;
+                strcpy(ser->port, req->port);
+                save_flag = 1;
+            }
+            if (req->user)
+            {
+                if (!strcmp(ser->user, req->user))
+                    change_flag = 1;
+                strcpy(ser->user, req->user);
+                save_flag = 1;
+            }
+            if (req->password)
+            {
+                if (!strcmp(ser->password, req->password))
+                    change_flag = 1;
+                strcpy(ser->password, req->password);
+                save_flag = 1;
+            }
+            if (req->cid)
+            {
+                if (!strcmp(ser->cid, req->cid))
+                    change_flag = 1;
+                strcpy(ser->cid, req->cid);
+                save_flag = 1;
+            }
 
-        if(save_flag) {
-            dev_mqtt_update_ser(gdm->db, ser);
+            if (save_flag)
+            {
+                if (change_flag)
+                {
+                    ser->mode = 0;
+                }
+                dev_mqtt_update_ser(gdm->db, ser);
+            }
         }
+        else if (req->idx == -1)
+        {
+            for (int i = 0; i < MQTT_SER_MAX; i++)
+            {
+                mqtt_server_t *ser = &gdm->mqttInfo.ser[i];
+
+                if (ser->id<0)
+                {
+                    if (req->idx < 0)
+                    {
+                        ser->id = i;
+                        save_flag = 1;
+                    }
+                    if (req->name)
+                    {
+                        strcpy(ser->name, req->name);
+                        save_flag = 1;
+                    }
+                    if (req->server)
+                    {
+                        strcpy(ser->server, req->server);
+                        save_flag = 1;
+                    }
+                    if (req->port)
+                    {
+                        strcpy(ser->port, req->port);
+                        save_flag = 1;
+                    }
+                    if (req->user)
+                    {
+                        strcpy(ser->user, req->user);
+                        save_flag = 1;
+                    }
+                    if (req->password)
+                    {
+                        strcpy(ser->password, req->password);
+                        save_flag = 1;
+                    }
+                    if (req->cid)
+                    {
+                        strcpy(ser->cid, req->cid);
+                        save_flag = 1;
+                    }
+
+                    if (save_flag)
+                    {
+                        dev_mqtt_update_ser(gdm->db, ser);
+                    }
+                    break;
+                }
+            }
+        }
+
     }
     else if(strcmp(_serviceManageRequestInfo.type,"mqttOpen")==0 ||
             strcmp(_serviceManageRequestInfo.type,"mqttClose")==0)

+ 2 - 1
pro/src/common.h

@@ -112,6 +112,8 @@
 
 #define MAIL_RECV_MAX  10
 
+#define MQTT_SER_MAX   5
+
 enum{
     BREAKER_DIO = 0,
     BREAKER_RS485
@@ -945,7 +947,6 @@ typedef struct {
     int                 status;
 }mqtt_server_t;
 typedef struct {
-    #define MQTT_SER_MAX   5
     mqtt_server_t       ser[MQTT_SER_MAX];
 }mqtt_info_t;
 

+ 1 - 0
pro/src/json_handle.c

@@ -5379,6 +5379,7 @@ cJSON* json_to_service_manage(const char* str,_ServiceManageRequestInfo* _servic
         if(tmp) {
             info->idx = atoi(tmp->valuestring);
         }
+        else info->idx = -1;
 
         tmp = cJSON_GetObjectItem(cjson, "serverName");
         if(tmp) {

+ 13 - 2
pro/src/mqtt.c

@@ -161,13 +161,20 @@ static int  get_status(mqtt_conn_t *conn)
 {
     mqtt_handle_t *h=(mqtt_handle_t*)conn->h;
     int id=conn->ser.id;
-    return h->dm->mqttInfo.ser[id].status;
+    if (id >= 0 && id < MQTT_SER_MAX)
+    {
+        return h->dm->mqttInfo.ser[id].status;
+    }
+    return 0;
 }
 static void set_status(mqtt_conn_t *conn, int flag)
 {
     mqtt_handle_t *h=(mqtt_handle_t*)conn->h;
     int id=conn->ser.id;
-    h->dm->mqttInfo.ser[id].status = flag;
+    if (id >= 0 && id < MQTT_SER_MAX)
+    {
+        h->dm->mqttInfo.ser[id].status = flag;
+    }
 }
 static char *get_int_str(int n)
 {
@@ -454,16 +461,20 @@ static int send_once(mqtt_conn_t *conn)
 }
 static void send_period(mqtt_conn_t *conn)
 {
+    lock_s_hold(LOCK_ID_MQTT);
     send_stat(conn, MQTT_PUB_STAT_POWER_ALL);
     send_stat(conn, MQTT_PUB_STAT_POWER_CHN);
     send_stat(conn, MQTT_PUB_STAT_SENSOR);
+    lock_s_release(LOCK_ID_MQTT);
 }
 
 static void send_period2(mqtt_conn_t *conn)
 {
+    lock_s_hold(LOCK_ID_MQTT);
     send_stat(conn, MQTT_PUB_STAT_SERVICE);
     send_stat(conn, MQTT_PUB_INFO_DEVICE);
     send_stat(conn, MQTT_PUB_STAT_NETWORK);
+    lock_s_release(LOCK_ID_MQTT);
 }