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);
// 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;
}
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\
}
// 解析 MQTT 下发的 JSON 数据
// 是否是纯数字
+#define UART_REPLY_MAX_PAYLOAD_MQTT UART_REPLY_MAX_PAYLOAD-4
bool is_pure_number(const char *str)
{
//
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;
}
//开启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;
}
// }
// 示例 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)
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;
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;
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;
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
{
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)
{
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);
// =============================================
}
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);
}