164 lines
4.9 KiB
C
164 lines
4.9 KiB
C
/* MQTT (over TCP) Example
|
|
|
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
|
|
|
Unless required by applicable law or agreed to in writing, this
|
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
CONDITIONS OF ANY KIND, either express or implied.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <inttypes.h>
|
|
#include <string.h>
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "freertos/event_groups.h"
|
|
#include "freertos/message_buffer.h"
|
|
#include "esp_log.h"
|
|
#include "esp_event.h"
|
|
#include "esp_mac.h" // esp_base_mac_addr_get
|
|
#include "mqtt_client.h"
|
|
|
|
#if CONFIG_RECEIVER
|
|
|
|
static const char *TAG = "PUB";
|
|
|
|
EventGroupHandle_t mqtt_status_event_group;
|
|
#define MQTT_CONNECTED_BIT BIT2
|
|
|
|
extern MessageBufferHandle_t xMessageBufferTrans;
|
|
extern size_t xItemSize;
|
|
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
|
|
#else
|
|
static esp_err_t mqtt_event_handler(esp_mqtt_event_handle_t event)
|
|
#endif
|
|
{
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
esp_mqtt_event_handle_t event = event_data;
|
|
#endif
|
|
switch (event->event_id) {
|
|
case MQTT_EVENT_CONNECTED:
|
|
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
|
|
xEventGroupSetBits(mqtt_status_event_group, MQTT_CONNECTED_BIT);
|
|
break;
|
|
case MQTT_EVENT_DISCONNECTED:
|
|
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
|
|
xEventGroupClearBits(mqtt_status_event_group, MQTT_CONNECTED_BIT);
|
|
break;
|
|
case MQTT_EVENT_SUBSCRIBED:
|
|
ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->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");
|
|
break;
|
|
case MQTT_EVENT_ERROR:
|
|
ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
|
|
break;
|
|
default:
|
|
ESP_LOGI(TAG, "Other event id:%d", event->event_id);
|
|
break;
|
|
}
|
|
#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
return ESP_OK;
|
|
#endif
|
|
}
|
|
|
|
esp_err_t query_mdns_host(const char * host_name, char *ip);
|
|
void convert_mdns_host(char * from, char * to);
|
|
|
|
void mqtt_pub(void *pvParameters)
|
|
{
|
|
ESP_LOGI(TAG, "Start Publish Broker:%s", CONFIG_MQTT_BROKER);
|
|
|
|
// Create Event Group
|
|
mqtt_status_event_group = xEventGroupCreate();
|
|
configASSERT( mqtt_status_event_group );
|
|
xEventGroupClearBits(mqtt_status_event_group, MQTT_CONNECTED_BIT);
|
|
|
|
// Set client id from mac
|
|
uint8_t mac[8];
|
|
ESP_ERROR_CHECK(esp_base_mac_addr_get(mac));
|
|
for(int i=0;i<8;i++) {
|
|
ESP_LOGD(TAG, "mac[%d]=%x", i, mac[i]);
|
|
}
|
|
char client_id[64];
|
|
sprintf(client_id, "pub-%02x%02x%02x%02x%02x%02x", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
|
|
ESP_LOGI(TAG, "client_id=[%s]", client_id);
|
|
|
|
// Resolve mDNS host name
|
|
char ip[128];
|
|
ESP_LOGI(TAG, "CONFIG_MQTT_BROKER=[%s]", CONFIG_MQTT_BROKER);
|
|
convert_mdns_host(CONFIG_MQTT_BROKER, ip);
|
|
ESP_LOGI(TAG, "ip=[%s]", ip);
|
|
char uri[138];
|
|
sprintf(uri, "mqtt://%s", ip);
|
|
ESP_LOGI(TAG, "uri=[%s]", uri);
|
|
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
esp_mqtt_client_config_t mqtt_cfg = {
|
|
.broker.address.uri = uri,
|
|
.broker.address.port = 1883,
|
|
#if CONFIG_BROKER_AUTHENTICATION
|
|
.credentials.username = CONFIG_AUTHENTICATION_USERNAME,
|
|
.credentials.authentication.password = CONFIG_AUTHENTICATION_PASSWORD,
|
|
#endif
|
|
.credentials.client_id = client_id
|
|
};
|
|
#else
|
|
esp_mqtt_client_config_t mqtt_cfg = {
|
|
.uri = uri,
|
|
.port = 1883,
|
|
.event_handle = mqtt_event_handler,
|
|
#if CONFIG_BROKER_AUTHENTICATION
|
|
.username = CONFIG_AUTHENTICATION_USERNAME,
|
|
.password = CONFIG_AUTHENTICATION_PASSWORD,
|
|
#endif
|
|
.client_id = client_id
|
|
};
|
|
#endif
|
|
|
|
esp_mqtt_client_handle_t mqtt_client = esp_mqtt_client_init(&mqtt_cfg);
|
|
|
|
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
|
|
esp_mqtt_client_register_event(mqtt_client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
|
|
#endif
|
|
|
|
esp_mqtt_client_start(mqtt_client);
|
|
xEventGroupWaitBits(mqtt_status_event_group, MQTT_CONNECTED_BIT, false, true, portMAX_DELAY);
|
|
ESP_LOGI(TAG, "Connected to MQTT Broker");
|
|
|
|
char buffer[xItemSize];
|
|
while (1) {
|
|
size_t received = xMessageBufferReceive(xMessageBufferTrans, buffer, sizeof(buffer), portMAX_DELAY);
|
|
ESP_LOGI(TAG, "xMessageBufferReceive received=%d", received);
|
|
if (received > 0) {
|
|
ESP_LOGI(TAG, "xMessageBufferReceive buffer=[%.*s]",received, buffer);
|
|
EventBits_t EventBits = xEventGroupGetBits(mqtt_status_event_group);
|
|
ESP_LOGI(TAG, "EventBits=0x%"PRIx32, EventBits);
|
|
if (EventBits & MQTT_CONNECTED_BIT) {
|
|
int msg_id = esp_mqtt_client_publish(mqtt_client, CONFIG_MQTT_PUB_TOPIC, buffer, received, 1, 0);
|
|
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
|
|
} else {
|
|
ESP_LOGW(TAG, "Disconnect to MQTT Broker. Skip to send");
|
|
}
|
|
} else {
|
|
ESP_LOGE(TAG, "xMessageBufferReceive fail");
|
|
break;
|
|
}
|
|
} // end while
|
|
|
|
// Stop connection
|
|
ESP_LOGI(TAG, "Task Delete");
|
|
esp_mqtt_client_stop(mqtt_client);
|
|
vTaskDelete(NULL);
|
|
}
|
|
#endif
|