/** * TODO file description */ #include #include #include #include "mqttpub.h" #define TAG "mq" static bool mqtt_inited = false; esp_mqtt_client_handle_t s_client; static char s_basetopic[128]; static char s_topicbuf[256]; static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) { esp_mqtt_client_handle_t client = event->client; int msg_id; // your_context_t *context = event->context; switch (event->event_id) { case MQTT_EVENT_CONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); // msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); // ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); // // msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); // ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); // // msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); // ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); // // msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); // ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); break; case MQTT_EVENT_DISCONNECTED: ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); break; case MQTT_EVENT_SUBSCRIBED: ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); // msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); // ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); break; case MQTT_EVENT_UNSUBSCRIBED: ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); break; case MQTT_EVENT_PUBLISHED: ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); break; case MQTT_EVENT_DATA: 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); break; case MQTT_EVENT_ERROR: ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); break; default: ESP_LOGI(TAG, "Other event id:%d", event->event_id); break; } return ESP_OK; } static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id); mqtt_event_handler_cb(event_data); } void initialize_mqttpub() { char brokerurl[128]; size_t len; esp_err_t rv; nvs_handle_t hnvs; ESP_ERROR_CHECK( nvs_open("mqtt", NVS_READWRITE, &hnvs) ); len = 128; brokerurl[0] = 0; rv = nvs_get_str(hnvs, "broker", brokerurl, &len); if (rv != ESP_OK || brokerurl[0] == 0) { ESP_LOGW(TAG, "Missing MQTT broker!"); return; } len = 128; s_basetopic[0] = 0; rv = nvs_get_str(hnvs, "topic", s_basetopic, &len); if (rv != ESP_OK) { ESP_LOGW(TAG, "Bad MQTT topic!"); return; } ESP_LOGI(TAG, "mqtt.topic = %s", s_basetopic); nvs_close(hnvs); esp_mqtt_client_config_t mqtt_cfg = { .uri = brokerurl, }; s_client = esp_mqtt_client_init(&mqtt_cfg); ESP_ERROR_CHECK(esp_mqtt_client_register_event(s_client, ESP_EVENT_ANY_ID, mqtt_event_handler, s_client)); ESP_ERROR_CHECK(esp_mqtt_client_start(s_client)); mqtt_inited = true; } void mqtt_publish(const char *topic, const char *payload) { if (!mqtt_inited) { ESP_LOGE(TAG, "MQTT not inited"); return; } snprintf(s_topicbuf, 256, "%s%s", s_basetopic, topic); ESP_LOGI(TAG, "MQTT pub to %s: %s", s_topicbuf, payload); esp_mqtt_client_publish(s_client, s_topicbuf, payload, (int) strlen(payload), 1, 0); }