WIP meteostation with ESP8266
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
esp8266-meteo/main/mqttpub.c

128 lines
3.8 KiB

/**
* TODO file description
*/
#include <mqtt_client.h>
#include <nvs.h>
#include <esp_log.h>
#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);
}