ESP32 Native version of Blinky, featureful controller code for WS2811/WS2812/NeoPixels
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.

108 line
3.9KB

  1. static const char *TAG = "mqtt";
  2. #include <esp_log.h>
  3. #include "mqtt.hpp"
  4. extern const uint8_t broker_pem_start[] asm("_binary_broker_pem_start");
  5. typedef struct {
  6. mqtt_connect_handler connect;
  7. mqtt_message_handler message;
  8. void* data;
  9. } mqtt_client_data;
  10. static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
  11. mqtt_client_data *client_data = (mqtt_client_data*)handler_args;
  12. ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%d", base, event_id);
  13. esp_mqtt_event_handle_t event = (esp_mqtt_event_handle_t)event_data;
  14. esp_mqtt_client_handle_t client = event->client;
  15. int msg_id;
  16. switch ((esp_mqtt_event_id_t)event_id) {
  17. case MQTT_EVENT_CONNECTED:
  18. ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
  19. if (client_data && client_data->connect) {
  20. client_data->connect(client, client_data->data);
  21. }
  22. break;
  23. case MQTT_EVENT_DISCONNECTED:
  24. ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
  25. break;
  26. case MQTT_EVENT_SUBSCRIBED:
  27. ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
  28. break;
  29. case MQTT_EVENT_UNSUBSCRIBED:
  30. ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
  31. break;
  32. case MQTT_EVENT_PUBLISHED:
  33. ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
  34. break;
  35. case MQTT_EVENT_DATA:
  36. ESP_LOGI(TAG, "MQTT_EVENT_DATA");
  37. printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);
  38. printf("DATA=%.*s\r\n", event->data_len, event->data);
  39. if (client_data && client_data->message) {
  40. client_data->message(client, event, client_data->data);
  41. }
  42. break;
  43. case MQTT_EVENT_ERROR:
  44. ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
  45. if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
  46. ESP_LOGI(TAG, "Last error code reported from esp-tls: 0x%x", event->error_handle->esp_tls_last_esp_err);
  47. ESP_LOGI(TAG, "Last tls stack error number: 0x%x", event->error_handle->esp_tls_stack_err);
  48. ESP_LOGI(TAG, "Last captured errno : %d (%s)", event->error_handle->esp_transport_sock_errno,
  49. strerror(event->error_handle->esp_transport_sock_errno));
  50. } else if (event->error_handle->error_type == MQTT_ERROR_TYPE_CONNECTION_REFUSED) {
  51. ESP_LOGI(TAG, "Connection refused error: 0x%x", event->error_handle->connect_return_code);
  52. } else {
  53. ESP_LOGW(TAG, "Unknown error type: 0x%x", event->error_handle->error_type);
  54. }
  55. break;
  56. /*
  57. case MQTT_USER_EVENT:
  58. event->data = (char*)handler_args;
  59. break;
  60. */
  61. default:
  62. ESP_LOGI(TAG, "Other event id:%d", event->event_id);
  63. break;
  64. }
  65. }
  66. esp_mqtt_client_handle_t start_mqtt_client(
  67. mqtt_connect_handler connect,
  68. mqtt_message_handler message,
  69. void* data
  70. ) {
  71. ESP_LOGI(TAG, "Starting MQTT client");
  72. mqtt_client_data* client_data = (mqtt_client_data*)malloc(sizeof(*client_data));
  73. client_data->connect = connect;
  74. client_data->message = message;
  75. client_data->data = data;
  76. const esp_mqtt_client_config_t mqtt_cfg = {
  77. .uri = CONFIG_BROKER_URI,
  78. .cert_pem = (const char *)broker_pem_start,
  79. .username = CONFIG_BROKER_USER,
  80. .password = CONFIG_BROKER_PASSWORD,
  81. };
  82. esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
  83. esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, mqtt_event_handler, client_data);
  84. esp_mqtt_client_start(client);
  85. return client;
  86. }
  87. void stop_mqtt_client(esp_mqtt_client_handle_t client) {
  88. /*
  89. // Hijack the user event to grab the client data on the heap
  90. esp_mqtt_event_t event;
  91. esp_mqtt_dispatch_custom_event(client, &event);
  92. esp_mqtt_client_stop(client);
  93. free((mqtt_client_data*)event->data)
  94. */
  95. }