修改逻辑设备属性下发
authord15521469561 <1731678236@qq.com>
Thu, 30 Apr 2026 01:01:10 +0000 (09:01 +0800)
committerd15521469561 <1731678236@qq.com>
Thu, 30 Apr 2026 01:01:10 +0000 (09:01 +0800)
main/uart.c
main/user_mqtt.c

index 0d612f2..d0694fe 100644 (file)
@@ -43,9 +43,9 @@ void Uart_Tx_Queue_Process(void)
     static UART_RECV_DATA_T uart_tx_data = {0};
     if(xQueueReceive(uart_tx_queue_handle, &uart_tx_data, 0) == pdTRUE)
     {
-        taskENTER_CRITICAL(1);
+        // taskENTER_CRITICAL(1);
         uart_write_bytes(UART_NUM_1, uart_tx_data.buffer, uart_tx_data.size);
-        taskEXIT_CRITICAL(1);
+        // taskEXIT_CRITICAL(1);
 
         // ESP_LOGI(UART_TAG, "Send %d bytes: ", uart_tx_data.size);
         // ESP_LOG_BUFFER_HEX(UART_TAG, uart_tx_data.buffer, uart_tx_data.size);
index a16757f..7f649d5 100644 (file)
@@ -379,7 +379,8 @@ void Mqtt_Get_Key_Led_Color(uint8_t *color_data,uint16_t color_len)
             data_len=32-1;
         }
         memset(value,0,sizeof(value));
-        memcpy(value,&color_data[i*11+5],data_len);
+        sprintf(&value[0],"%s","#");
+        memcpy(&value[1],&color_data[i*11+5],data_len);
         value[data_len]='\0';
         snprintf(key,sizeof(key),"%d",dpid);
         cJSON_AddStringToObject(pRoot, key, value);
@@ -600,7 +601,7 @@ void Mqtt_Recv_Data(char *topic, int topic_len, char *data, int data_len)
     // 1. 长度判断
     
     if (topic_len > MQTT_TOPIC_LEN || data_len > MQTT_DATA_BUF_SIZE || data_len <= 0 || topic_len <= 0) {
-        ESP_LOGI(MQTT_TAG, "len large\n");
+        ESP_LOGI(MQTT_TAG, "len large :%d\n",data_len);
         return;
     }
 
@@ -623,7 +624,6 @@ void Mqtt_Recv_Data(char *topic, int topic_len, char *data, int data_len)
         ESP_LOGI(MQTT_TAG,"QUEUE is NULL");
     }
 }
-
 void Mqtt_Connect_Status_Check(void)
 {
     if((xEventGroupWaitBits(common_event_group, COMMON_MQTT_CONNECT_BIT, pdFALSE, pdFALSE, 0) & COMMON_MQTT_CONNECT_BIT) != 0 && common_setting.ble_status.ble_state == 0\
@@ -695,6 +695,7 @@ void Mqtt_Disconnect(void)
 }
 // 解析 MQTT 下发的 JSON 数据
 // 是否是纯数字
+#define UART_REPLY_MAX_PAYLOAD_MQTT     UART_REPLY_MAX_PAYLOAD-4
 bool is_pure_number(const char *str) 
 {
     // 
@@ -732,10 +733,10 @@ static void mqtt_parse_recv_data(char *data, int data_len)
      cJSON *productId = cJSON_GetObjectItem(root, "productId");//清除配网标识字符串 int
     if (productId != NULL && cJSON_IsString(productId)) {
         
-        char cur_pid[6]={0};
+        char cur_pid[7]={0};
         snprintf(cur_pid,sizeof(cur_pid)-1,"%04X",common_setting.mcu_info.pid);
         ESP_LOGI(MQTT_TAG, "productId: %s %s\n", productId->valuestring,cur_pid);
-        if (strcasecmp(cur_pid, cur_pid) != 0) {//和当前PID不一致
+        if (strcasecmp(cur_pid, productId->valuestring) != 0) {//和当前PID不一致
             return;
         }
         
@@ -769,8 +770,8 @@ static void mqtt_parse_recv_data(char *data, int data_len)
         //开启ota线程
         const char *ota_url = filePath->valuestring;
         // static const char *filePath="https://pxn-iot.s3.us-east-2.amazonaws.com/iot01/2026/04/27/69ef076479113dba3ec8e375.bin";//https://pxn-iot.s3.us-east-2.amazonaws.com/iot01/2026/04/20/69e589eb7a67c1057c3d452e.bin";
-        uint8_t filePath_Len = 0;
-        if(sizeof(ota_url) > sizeof(https_ota_url)-1)
+        uint8_t filePath_Len = strlen(ota_url);
+        if(filePath_Len > sizeof(https_ota_url)-1)
         {   
             filePath_Len = sizeof(https_ota_url)-1;
         }
@@ -793,7 +794,7 @@ static void mqtt_parse_recv_data(char *data, int data_len)
     // }
     // 示例 3:设备属性行解析
     cJSON *prot_array = cJSON_GetObjectItem(root, "prot");
-    if (prot_array != NULL || cJSON_IsArray(prot_array)) {
+    if (prot_array != NULL && cJSON_IsArray(prot_array)) {
         
         int prot_array_size = cJSON_GetArraySize(prot_array);
         if(prot_array_size == 0)
@@ -806,19 +807,17 @@ static void mqtt_parse_recv_data(char *data, int data_len)
         uint16_t dpid = 0;
         int value  = 0;
         int type_len = 0;
-        uint8_t send_data[UART_REPLY_MAX_PAYLOAD];
-        memset(send_data,0,UART_REPLY_MAX_PAYLOAD);
+        uint8_t send_data[UART_REPLY_MAX_PAYLOAD_MQTT];
+        memset(send_data,0,UART_REPLY_MAX_PAYLOAD_MQTT);
         ESP_LOGI(MQTT_TAG,"prot_array_size:%d",prot_array_size);
         for (int i = 0; i < prot_array_size; i++)
         {
             // 取数组第i个元素(是一个对象)
             cJSON *pro_item = cJSON_GetArrayItem(prot_array, i);
             if (pro_item == NULL || !cJSON_IsObject(pro_item)) {
-                printf("%d不是对象\n", i);
+                ESP_LOGI(MQTT_TAG,"%d not object\n", i);
                 continue;
             }
-            // int dpid = atoi(dpid_str);                             // 字符串转整数DPID
-            // int value = atoi(key_node->valuestring);               // 字符串转数值(如"50"→50)
             cJSON *item = pro_item->child;
             if (item == NULL) continue;
 
@@ -829,15 +828,19 @@ static void mqtt_parse_recv_data(char *data, int data_len)
             if(cJSON_IsString(item) && item->valuestring != NULL && key_str != NULL) //如果是字符串是不定长度 长度为
             {
                 type = 5;
-                type_len= strlen(item->valuestring);
+                type_len= strlen(item->valuestring);//字符串长度
+                if(type_len > 32-1)
+                {
+                    type_len=32-1;
+                }
                 if(type_len == 0) //内容是空的
                 {
                     continue;
                 }
-                if (is_pure_number(key_str))
+                if (is_pure_number(key_str)) 
                 {
-                    dpid = atoi(key_str);
-                    ESP_LOGI(MQTT_TAG,"dpid %u\n",dpid);
+                    dpid = atoi(key_str);//将key转换成纯数字不能有字母
+                    // ESP_LOGI(MQTT_TAG,"dpid %u\n",dpid);
                 }else{
                     ESP_LOGI(MQTT_TAG,"dpid is zero\n");
                     continue;
@@ -867,7 +870,7 @@ static void mqtt_parse_recv_data(char *data, int data_len)
                         type = 4;
                         type_len = 4;
                     }
-                    ESP_LOGI(MQTT_TAG,"dpid %u value:%u\n",dpid,value);
+                    // ESP_LOGI(MQTT_TAG,"dpid %u value:%u\n",dpid,value);
                 }else{
                     ESP_LOGI(MQTT_TAG,"is number but dpid is zero\n");
                     continue;
@@ -880,14 +883,59 @@ static void mqtt_parse_recv_data(char *data, int data_len)
                 continue;
             }
             //总的长度加上4+当前数据类型的长度
-            if(total_data_len + 4 + type_len > UART_REPLY_MAX_PAYLOAD-4)
+            if(total_data_len + 5 + type_len > UART_REPLY_MAX_PAYLOAD_MQTT) //去掉header+cmd+len+crc
             {
+                ESP_LOGI(MQTT_TAG,"i:%d UART_REPLY_MAX_PAYLOAD_MQTT-5 %d len:%d",i,UART_REPLY_MAX_PAYLOAD_MQTT,total_data_len + 5 + type_len);
                 Uart_Reply_Send(COMMON_UART_PROPERTY_SET_CMD,send_data, total_data_len,HOST_TYPE_UART);
-                type_len = 0;
                 total_data_len=0;
-                memset(send_data,0,UART_REPLY_MAX_PAYLOAD);
+                memset(send_data,0,UART_REPLY_MAX_PAYLOAD_MQTT);
 
             }
+
+            // {
+            //     "serialNumber": "PXN1LJ1QUR078E",
+            //     "prot": [
+            //         { "335": "#ffffff"},
+            //         { "336": "#ff00ff"},
+            //         { "337": "#ff0000"},
+            //         { "338": "#00ff00"},
+            //         { "339": "#00ff00"},
+            //         { "340": "#00ff00"},
+            //         { "341": "#00ff00"},
+            //         { "342": "#00ff00"},
+            //         { "343": "#00ff00"},
+            //         { "344": "#00ff00"},
+            //         { "345": "#00ff00"},
+                    
+            //         { "271": "#ffffff"},
+            //         { "272": "#00ff00"},
+            //         { "273": "#00ff00"},
+            //         { "274": "#00ff00"},
+            //         { "275": "#ffffff"},
+            //         { "276": "#00ff00"},
+            //         { "277": "#00ff00"},
+            //         { "278": "#00ff00"},
+            //         { "279": "#ffffff"},
+            //         { "280": "#00ff00"},
+            //         { "281": "#00ff00"},
+            //         { "282": "#00ff00"},
+            //         { "283": "#ffffff"},
+            //         { "284": "#00ff00"},
+            //         { "285": "#00ff00"},
+            //         {"735":80},
+            //         {"736":70},
+            //         {"737":60},
+                    // {"399":"#ff0000"},
+                    // {"400":"#00ff00"},
+                    // {"401":"#0000ff"},
+
+                    // {"412":"00ff00"},
+                    // {"413":"ffffff"},
+                    // {"414":"ff0000"}
+
+
+            //     ]
+            // }
             // 737 10 738 50 739 70
             // total_data_len = 0 0 1 2 3 4 5
             // total_data_len = 0+5+1=6 6 7 8 9 10 11
@@ -904,23 +952,32 @@ static void mqtt_parse_recv_data(char *data, int data_len)
             {
                 memcpy(&send_data[total_data_len+5],&value,type_len);
             }else{ //copy字符串
-                snprintf((char *)&send_data[total_data_len+5],type_len,"%s",item->valuestring);
-                // memcpy((char *)&send_data[total_data_len+5],item->valuestring,type_len);
+                strncpy((char *)&send_data[total_data_len+5], item->valuestring, type_len);
+                // snprintf((char *)&send_data[total_data_len+5],type_len+1,"%s",item->valuestring);
             }
             
-            total_data_len=total_data_len+5+type_len;
-            ESP_LOGI(MQTT_TAG,"i:%d total_data_len:%d dpid:%u value:%u type:%d type_len:%u\n",i,total_data_len,dpid,value,type,type_len);
+            total_data_len=total_data_len+5+type_len;   //12+1+5=18 18+6=24 24+6=30 30+6=36
+            
             if(i == prot_array_size - 1)//到最后一个发送
             {
+                
+                vTaskDelay(2); // 必须加!让UART发送完成
+                ESP_LOGI(MQTT_TAG,"i:%d total_data_len:%d dpid:%u value:%u type:%d type_len:%u\n",i,total_data_len,dpid,value,type,type_len);
                 Uart_Reply_Send(COMMON_UART_PROPERTY_SET_CMD,send_data, total_data_len,HOST_TYPE_UART);
                 type_len = 0;
                 total_data_len=0;
-                memset(send_data,0,UART_REPLY_MAX_PAYLOAD);
+                memset(send_data,0,UART_REPLY_MAX_PAYLOAD_MQTT);
+                ESP_LOGI(MQTT_TAG,"send end\n");
             }
         }
     }
     // 释放!!!
-    cJSON_Delete(root);
+    if(root != NULL)
+    {
+        cJSON_Delete(root);
+        root=NULL;
+    }
+    
 }
 static void Mqtt_Init_Task_Cb(void *p)
 {
@@ -932,8 +989,8 @@ static void Mqtt_Init_Task_Cb(void *p)
             if(xQueueReceive(mqtt_recv_queue_handle, &recv_msg, 0) == pdTRUE)
             {
                 ESP_LOGI(MQTT_TAG, "mqtt recv data");
-                ESP_LOGI(MQTT_TAG, "主题:%.*s", recv_msg.topic_len, recv_msg.topic);
-                ESP_LOGI(MQTT_TAG, "数据:%.*s", recv_msg.data_len, recv_msg.data);
+                ESP_LOGI(MQTT_TAG, "主题:%d", recv_msg.topic_len);
+                ESP_LOGI(MQTT_TAG, "数据:%d", recv_msg.data_len);
                 mqtt_parse_recv_data(recv_msg.data,recv_msg.data_len);
                 // =============================================
 
@@ -963,19 +1020,11 @@ void Mqtt_Init_Task(void)
     }
     mqtt_init_task_flag=1;
 
-    // mqtt_recv_queue_handle = xQueueCreate(MQTT_RECV_QUEUE_LENGTH,sizeof(mqtt_recv_msg_t));
-    // if(mqtt_recv_queue_handle == NULL){
-    //     ESP_LOGI(MQTT_TAG,"mqtt_recv_queue_handle ERROR");
-    // }
-    // mqtt_send_queue_handle = xQueueCreate(MQTT_SEND_QUEUE_LENGTH,sizeof(mqtt_send_msg_t));
-    // if(mqtt_send_queue_handle == NULL){
-    //     ESP_LOGI(MQTT_TAG,"mqtt_send_queue_handle ERROR");
-    // }
     mqtt_recv_queue_handle = xQueueCreateStatic(MQTT_RECV_QUEUE_LENGTH, MQTT_RECV_QUEUE_ITEM_SIZE, mqtt_recv_queue_storage, &mqtt_recv_queue_buffer);
     mqtt_send_queue_handle = xQueueCreateStatic(MQTT_SEND_QUEUE_LENGTH, MQTT_SEND_QUEUE_ITEM_SIZE, mqtt_send_queue_storage, &mqtt_send_queue_buffer);
     
     
-    mqtt_connect_task_handler = xTaskCreateStatic(Mqtt_Init_Task_Cb, "mqtt_task", MQTT_CONNECT_TASK_STACK, NULL, 2, mqtt_connect_task_stack, &mqtt_connect_task_tcb);
+    mqtt_connect_task_handler = xTaskCreateStatic(Mqtt_Init_Task_Cb, "mqtt_task", MQTT_CONNECT_TASK_STACK, NULL, 1, mqtt_connect_task_stack, &mqtt_connect_task_tcb);
      
 }