C语言 检查ESP-IDF上MQTT主题的名称

3qpi33ja  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(132)

我遇到了一个问题。我需要检查我的MQTT主题是否等于一个确定的字符串。我需要这样做来做一个if/else结构,在那里我将停止我的mqtt服务或启动它,如果我想要的话。我会从我的移动的电话写主题,它被ESP 32接收得很好。
问题在于检查主题名称是否带有“ESP_control/...”

ESP_LOGI(TAG, "MQTT_EVENT_DATA");
    printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
    printf("DATA=%.*s\r\n", event->data_len, event->data);

    if(strncmp(event->topic, "ESP_control/run", strlen(event->topic)) == 0) {
        if(strncmp(event->data, "STOP", strlen(event->topic)) == 0) {
            ret = esp_mqtt_client_publish(client, "ESP_control", "MQTT SERVICE STOPPED", 0, 1, 0);
                if(ret == -1) {
                    printf("ERROR sending 'MQTT SERVICE STOPPED' to topic 'ESP_control'\n");
                }
            ESP_LOGI(TAG, "MQTT SERVICE STOPPED");

            esp_mqtt_client_stop(client);
        }
        else if (strncmp(event->data, "START", strlen(event->topic)) == 0) {
            esp_mqtt_client_start(client);

            ret = esp_mqtt_client_publish(client, "ESP_control", "MQTT SERVICE STARTED", 0, 1, 0);
                if(ret == -1) {
                    printf("ERROR sending 'MQTT SERVICE STARTED' to topic 'ESP_control'\n");
                }
            ESP_LOGI(TAG, "MQTT SERVICE STARTED");
        }
    }
    else if(strncmp(event->topic, "ESP_control/delay", strlen(event->topic)) == 0) {
        GLOBAL_DELAY = atoi(event->data);   //  convert char* to float variable

        if(GLOBAL_DELAY > MAX_DELAY) {
            GLOBAL_DELAY = MAX_DELAY;
        }
        else if(GLOBAL_DELAY < MIN_DELAY) {
            GLOBAL_DELAY = MIN_DELAY;
        }
    }

有人能帮帮我吗?

gg0vcinb

gg0vcinb1#

我昨天找到了解决方案,基本上就是使用for循环写一个新的数组,用client->event_len作为条件。

ESP_LOGI(TAG, "MQTT_EVENT_DATA");
    printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
    printf("DATA=%.*s\r\n", event->data_len, event->data);

    for(i = 0; i <= event->topic_len; i++) {
        if(i == event->topic_len) read_topic[i] = '\0';
        else read_topic[i] = event->topic[i];
    }

    for(i = 0; i <= event->data_len; i++) {
        if(i == event->data_len) read_data[i] = '\0';
        else read_data[i] = event->data[i];
    }

    //printf("%s\n%.*s\n\n%s\n%.*s\n\n", read_topic, event->topic_len, event->topic, read_data, event->data_len, event->data);

    if(strcmp(read_topic, "ESP_control/run") == 0) {
        if(strcmp(read_data, "STOP") == 0) {
            ret = esp_mqtt_client_publish(client, "ESP_control", "MQTT SERVICE STOPPED", 0, 1, 0);
                if(ret == -1) {
                    printf("ERROR sending 'MQTT SERVICE STOPPED' to topic 'ESP_control'\n");
                }
            ESP_LOGI(TAG, "MQTT SERVICE STOPPED");

            ret = esp_mqtt_client_stop(client);
            printf("ERROR stopping MQTT client: %x\n", ret);
        }
        else if (strcmp(read_data, "START") == 0) {
            ret = esp_mqtt_client_start(client);
            if(ret != ESP_OK) {
                ret = esp_mqtt_client_reconnect(client);
                if(ret != ESP_OK) {
                    ESP_LOGE(TAG, "ERROR reconnecting MQTT client!!!");
                }
            }

            ret = esp_mqtt_client_publish(client, "ESP_control", "MQTT SERVICE STARTED", 0, 1, 0);
                if(ret == -1) {
                    printf("ERROR sending 'MQTT SERVICE STARTED' to topic 'ESP_control'\n");
                }
            ESP_LOGI(TAG, "MQTT SERVICE STARTED");
        }
    }
voj3qocg

voj3qocg2#

另一种方法是使用sprintf()代替for()。

....
sprintf(read_topic, "%.*s", event->topic_len, event->topic);
sprintf(read_data, "%.*s", event->data_len, event->data);
....

相关问题