diff options
Diffstat (limited to 'src/mqtt.c')
| -rw-r--r-- | src/mqtt.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/mqtt.c b/src/mqtt.c new file mode 100644 index 0000000..716feec --- /dev/null +++ b/src/mqtt.c | |||
| @@ -0,0 +1,85 @@ | |||
| 1 | #include "mqtt.h" | ||
| 2 | #include "config.h" | ||
| 3 | #include "esp_log.h" | ||
| 4 | #include "esp_timer.h" | ||
| 5 | #include "freertos/FreeRTOS.h" | ||
| 6 | #include "freertos/task.h" | ||
| 7 | #include <stdio.h> | ||
| 8 | #include <stdlib.h> | ||
| 9 | #include <string.h> | ||
| 10 | |||
| 11 | #ifndef BUFFER_SIZE | ||
| 12 | #define BUFFER_SIZE 64 | ||
| 13 | #endif | ||
| 14 | |||
| 15 | #ifndef PUBLISH_INTERVAL_MS | ||
| 16 | #define PUBLISH_INTERVAL_MS 1000 | ||
| 17 | #endif | ||
| 18 | |||
| 19 | #ifndef PUBLISHER_TASK_STACK_SIZE | ||
| 20 | #define PUBLISHER_TASK_STACK_SIZE 4096 | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #ifndef PUBLISHER_TASK_PRIORITY | ||
| 24 | #define PUBLISHER_TASK_PRIORITY 5 | ||
| 25 | #endif | ||
| 26 | |||
| 27 | static esp_mqtt_client_handle_t client; | ||
| 28 | |||
| 29 | static void mqtt_event_handler(void *handler_args, esp_event_base_t base, | ||
| 30 | int32_t event_id, void *event_data) { | ||
| 31 | esp_mqtt_event_handle_t event = event_data; | ||
| 32 | |||
| 33 | switch (event->event_id) { | ||
| 34 | case MQTT_EVENT_CONNECTED: | ||
| 35 | printf("MQTT connected!\n"); | ||
| 36 | esp_mqtt_client_subscribe(event->client, SUB_TOPIC, 1); | ||
| 37 | break; | ||
| 38 | |||
| 39 | case MQTT_EVENT_DATA: { | ||
| 40 | char topic[event->topic_len + 1]; | ||
| 41 | char data[event->data_len + 1]; | ||
| 42 | memcpy(topic, event->topic, event->topic_len); | ||
| 43 | topic[event->topic_len] = '\0'; | ||
| 44 | memcpy(data, event->data, event->data_len); | ||
| 45 | data[event->data_len] = '\0'; | ||
| 46 | |||
| 47 | printf("MQTT Msg received\nTopic: %s\nData: %s\n", topic, data); | ||
| 48 | |||
| 49 | char *endptr; | ||
| 50 | long long sent = strtoll(data, &endptr, 10); | ||
| 51 | if (endptr != data) { | ||
| 52 | long long now = esp_timer_get_time() / 1000ULL; | ||
| 53 | long long rtt = now - sent; | ||
| 54 | printf("RTT: %lld ms\n", rtt); | ||
| 55 | } | ||
| 56 | break; | ||
| 57 | } | ||
| 58 | |||
| 59 | default: | ||
| 60 | break; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 64 | static void publisher_task(void *pvParameters) { | ||
| 65 | while (1) { | ||
| 66 | char buf[BUFFER_SIZE]; | ||
| 67 | snprintf(buf, BUFFER_SIZE, "%lld", | ||
| 68 | (long long)(esp_timer_get_time() / 1000ULL)); | ||
| 69 | esp_mqtt_client_publish(client, PUB_TOPIC, buf, 0, 1, 0); | ||
| 70 | vTaskDelay(pdMS_TO_TICKS(PUBLISH_INTERVAL_MS)); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | |||
| 74 | void mqtt_app_start(void) { | ||
| 75 | esp_mqtt_client_config_t mqtt_cfg = { | ||
| 76 | .broker.address.uri = MQTT_URI, | ||
| 77 | }; | ||
| 78 | client = esp_mqtt_client_init(&mqtt_cfg); | ||
| 79 | esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, | ||
| 80 | NULL); | ||
| 81 | esp_mqtt_client_start(client); | ||
| 82 | |||
| 83 | xTaskCreate(publisher_task, "publisher_task", PUBLISHER_TASK_STACK_SIZE, NULL, | ||
| 84 | PUBLISHER_TASK_PRIORITY, NULL); | ||
| 85 | } | ||
