aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/src/mqtt.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/src/mqtt.c')
-rw-r--r--firmware/src/mqtt.c67
1 files changed, 31 insertions, 36 deletions
diff --git a/firmware/src/mqtt.c b/firmware/src/mqtt.c
index 90451bc..b171437 100644
--- a/firmware/src/mqtt.c
+++ b/firmware/src/mqtt.c
@@ -8,24 +8,12 @@
8#include <stdlib.h> 8#include <stdlib.h>
9#include <string.h> 9#include <string.h>
10 10
11#ifndef BUFFER_SIZE 11static const char *TAG = "mqtt";
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
27static esp_mqtt_client_handle_t client; 12static esp_mqtt_client_handle_t client;
28 13
14/**
15 * @brief Obsługa zdarzeń MQTT
16 */
29static void mqtt_event_handler(void *handler_args, esp_event_base_t base, 17static void mqtt_event_handler(void *handler_args, esp_event_base_t base,
30 int32_t event_id, void *event_data) 18 int32_t event_id, void *event_data)
31{ 19{
@@ -33,56 +21,63 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base,
33 21
34 switch (event->event_id) { 22 switch (event->event_id) {
35 case MQTT_EVENT_CONNECTED: 23 case MQTT_EVENT_CONNECTED:
36 printf("MQTT connected!\n"); 24 ESP_LOGI(TAG, "MQTT connected!");
37 esp_mqtt_client_subscribe(event->client, SUB_TOPIC, 1); 25 esp_mqtt_client_subscribe(event->client, SUB_TOPIC, 1);
38 break; 26 break;
39 27
40 case MQTT_EVENT_DATA: { 28 case MQTT_EVENT_DATA: {
41 char topic[event->topic_len + 1]; 29 char topic[event->topic_len + 1];
42 char data[event->data_len + 1]; 30 char data[event->data_len + 1];
31
43 memcpy(topic, event->topic, event->topic_len); 32 memcpy(topic, event->topic, event->topic_len);
44 topic[event->topic_len] = '\0'; 33 topic[event->topic_len] = '\0';
45 memcpy(data, event->data, event->data_len); 34 memcpy(data, event->data, event->data_len);
46 data[event->data_len] = '\0'; 35 data[event->data_len] = '\0';
47 36
48 printf("MQTT Msg received\nTopic: %s\nData: %s\n", topic, data); 37 ESP_LOGI(TAG, "MQTT Msg received | Topic: %s | Data: %s", topic,
38 data);
49 39
40 // Echo wiadomości do PUB_TOPIC tylko jeśli timestamp jest
41 // sensowny
50 char *endptr; 42 char *endptr;
51 long long sent = strtoll(data, &endptr, 10); 43 long long ts = strtoll(data, &endptr, 10);
52 if (endptr != data) { 44 if (endptr != data && *endptr == '\0' && ts > 0 && ts < 1e13) {
53 long long now = esp_timer_get_time() / 1000ULL; 45 esp_mqtt_client_publish(event->client, PUB_TOPIC, data,
54 long long rtt = now - sent; 46 0, 1, 0);
55 printf("RTT: %lld ms\n", rtt); 47 } else {
48 ESP_LOGW(TAG, "Nieprawidłowe dane, ignorowane: %s",
49 data);
56 } 50 }
51
57 break; 52 break;
58 } 53 }
59 54
60 default: 55 case MQTT_EVENT_DISCONNECTED:
56 ESP_LOGW(TAG, "MQTT disconnected");
61 break; 57 break;
62 }
63}
64 58
65static void publisher_task(void *pvParameters) 59 case MQTT_EVENT_ERROR:
66{ 60 ESP_LOGE(TAG, "MQTT error occurred");
67 while (1) { 61 break;
68 char buf[BUFFER_SIZE]; 62
69 snprintf(buf, BUFFER_SIZE, "%lld", 63 default:
70 (long long)(esp_timer_get_time() / 1000ULL)); 64 break;
71 esp_mqtt_client_publish(client, PUB_TOPIC, buf, 0, 1, 0);
72 vTaskDelay(pdMS_TO_TICKS(PUBLISH_INTERVAL_MS));
73 } 65 }
74} 66}
75 67
68/**
69 * @brief Uruchamia klienta MQTT
70 */
76void mqtt_app_start(void) 71void mqtt_app_start(void)
77{ 72{
78 esp_mqtt_client_config_t mqtt_cfg = { 73 esp_mqtt_client_config_t mqtt_cfg = {
79 .broker.address.uri = MQTT_URI, 74 .broker.address.uri = MQTT_URI,
80 }; 75 };
76
81 client = esp_mqtt_client_init(&mqtt_cfg); 77 client = esp_mqtt_client_init(&mqtt_cfg);
82 esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, 78 esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID,
83 mqtt_event_handler, NULL); 79 mqtt_event_handler, NULL);
84 esp_mqtt_client_start(client); 80 esp_mqtt_client_start(client);
85 81
86 xTaskCreate(publisher_task, "publisher_task", PUBLISHER_TASK_STACK_SIZE, 82 ESP_LOGI(TAG, "MQTT client started");
87 NULL, PUBLISHER_TASK_PRIORITY, NULL);
88} 83}