RCM — ESP32 Room Controller
WT32-ETH01 firmware
Loading...
Searching...
No Matches
mqtt_app.c
Go to the documentation of this file.
1
6#include "mqtt_app.h"
7
8#include <stdio.h>
9
10#include "esp_check.h"
11#include "esp_crt_bundle.h"
12#include "esp_log.h"
13#include "esp_mac.h"
14#include "mqtt_client.h"
15
16static const char *TAG = "mqtt_app";
17
19#define MQTT_BROKER_URI "mqtts://microtec-lab.ru:8883"
20
22#define MQTT_USERNAME "ozlocks_mqtt"
23#define MQTT_PASSWORD "Tr0cK's_57$Y74"
24
26#define MQTT_CLIENT_ID_PREFIX "ozl-mb"
27
28static esp_mqtt_client_handle_t s_mqtt_client;
29static bool s_mqtt_connected;
30static char s_client_id[24];
31
35static void build_client_id(void)
36{
37 uint8_t mac[6];
38 esp_read_mac(mac, ESP_MAC_ETH);
39 snprintf(s_client_id, sizeof(s_client_id),
40 MQTT_CLIENT_ID_PREFIX "-%02X%02X%02X%02X%02X%02X",
41 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
42 ESP_LOGI(TAG, "Client ID: %s", s_client_id);
43}
44
45const char *mqtt_app_get_client_id(void)
46{
47 if (s_client_id[0] == '\0') {
49 }
50 return s_client_id;
51}
52
56static void mqtt_event_handler(void *handler_args, esp_event_base_t base,
57 int32_t event_id, void *event_data)
58{
59 esp_mqtt_event_handle_t event = event_data;
60 // esp_mqtt_client_handle_t client = event->client;
61
62 switch ((esp_mqtt_event_id_t)event_id) {
63 case MQTT_EVENT_CONNECTED:
64 s_mqtt_connected = true;
65 ESP_LOGI(TAG, "Connected to broker");
66 break;
67
68 case MQTT_EVENT_DISCONNECTED:
69 s_mqtt_connected = false;
70 ESP_LOGI(TAG, "Disconnected from broker");
71 break;
72
73 case MQTT_EVENT_PUBLISHED:
74 ESP_LOGD(TAG, "Message published, msg_id=%d", event->msg_id);
75 break;
76
77 case MQTT_EVENT_ERROR:
78 ESP_LOGE(TAG, "MQTT error");
79 if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
80 ESP_LOGE(TAG, "Transport error: esp_tls=%d, tls_stack=%d, sock_errno=%d",
81 event->error_handle->esp_tls_last_esp_err,
82 event->error_handle->esp_tls_stack_err,
83 event->error_handle->esp_transport_sock_errno);
84 }
85 break;
86
87 default:
88 break;
89 }
90}
91
92esp_err_t mqtt_app_start(void)
93{
94 if (s_mqtt_client != NULL) {
95 ESP_LOGW(TAG, "MQTT client already running");
96 return ESP_OK;
97 }
98
100
101 esp_mqtt_client_config_t mqtt_cfg = {
102 .broker.address.uri = MQTT_BROKER_URI,
103 .broker.verification.crt_bundle_attach = esp_crt_bundle_attach,
104 .credentials.client_id = s_client_id,
105 .credentials.username = MQTT_USERNAME,
106 .credentials.authentication.password = MQTT_PASSWORD,
107 };
108
109 s_mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
110 ESP_RETURN_ON_FALSE(s_mqtt_client, ESP_ERR_NO_MEM, TAG, "mqtt init failed");
111
112 ESP_RETURN_ON_ERROR(esp_mqtt_client_register_event(s_mqtt_client, ESP_EVENT_ANY_ID,
113 mqtt_event_handler, NULL),
114 TAG, "event register failed");
115
116 ESP_RETURN_ON_ERROR(esp_mqtt_client_start(s_mqtt_client), TAG, "mqtt start failed");
117
118 ESP_LOGI(TAG, "Connecting to %s, client_id=%s, user=%s",
120 return ESP_OK;
121}
122
123esp_err_t mqtt_app_stop(void)
124{
125 if (s_mqtt_client == NULL) {
126 return ESP_OK;
127 }
128
129 ESP_LOGI(TAG, "Stopping MQTT client");
130 esp_mqtt_client_stop(s_mqtt_client);
131 esp_mqtt_client_destroy(s_mqtt_client);
132 s_mqtt_client = NULL;
133 s_mqtt_connected = false;
134
135 return ESP_OK;
136}
137
139{
140 return s_mqtt_connected;
141}
142
143esp_err_t mqtt_app_publish(const char *topic, const char *data, int qos, int retain)
144{
145 if (!s_mqtt_connected || s_mqtt_client == NULL) {
146 return ESP_ERR_INVALID_STATE;
147 }
148
149 int msg_id = esp_mqtt_client_publish(s_mqtt_client, topic, data, 0, qos, retain);
150 if (msg_id < 0) {
151 return ESP_FAIL;
152 }
153
154 ESP_LOGI(TAG, "Published to %s: %s", topic, data);
155 return ESP_OK;
156}
static void build_client_id(void)
Формирует Client ID вида wt32-eth02-AABBCCDDEEFF из MAC Ethernet.
Definition mqtt_app.c:35
#define MQTT_PASSWORD
Definition mqtt_app.c:23
const char * mqtt_app_get_client_id(void)
Возвращает Client ID устройства (префикс + MAC Ethernet).
Definition mqtt_app.c:45
#define MQTT_BROKER_URI
URI облачного MQTT-брокера
Definition mqtt_app.c:19
static const char * TAG
Definition mqtt_app.c:16
esp_err_t mqtt_app_start(void)
Запускает MQTT-клиент и подключается к брокеру.
Definition mqtt_app.c:92
static char s_client_id[24]
Definition mqtt_app.c:30
esp_err_t mqtt_app_publish(const char *topic, const char *data, int qos, int retain)
Публикует сообщение в MQTT, если клиент подключён.
Definition mqtt_app.c:143
esp_err_t mqtt_app_stop(void)
Останавливает MQTT-клиент и освобождает ресурсы.
Definition mqtt_app.c:123
#define MQTT_CLIENT_ID_PREFIX
Префикс Client ID; суффикс — MAC Ethernet (уникален для каждого устройства)
Definition mqtt_app.c:26
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
Обработчик событий MQTT (подключение, ошибки, публикация).
Definition mqtt_app.c:56
bool mqtt_app_is_connected(void)
Проверяет, установлено ли соединение с MQTT-брокером.
Definition mqtt_app.c:138
#define MQTT_USERNAME
Учётные данные брокера
Definition mqtt_app.c:22
static bool s_mqtt_connected
Definition mqtt_app.c:29
static esp_mqtt_client_handle_t s_mqtt_client
Definition mqtt_app.c:28
Публичный интерфейс MQTT-клиента.