ESP32 Native version of Blinky, featureful controller code for WS2811/WS2812/NeoPixels
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

114 Zeilen
4.0KB

  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=%ld", 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. switch ((esp_mqtt_event_id_t)event_id) {
  16. case MQTT_EVENT_CONNECTED:
  17. ESP_LOGD(TAG, "MQTT_EVENT_CONNECTED");
  18. if (client_data && client_data->connect) {
  19. client_data->connect(client, client_data->data);
  20. }
  21. break;
  22. case MQTT_EVENT_DISCONNECTED:
  23. ESP_LOGD(TAG, "MQTT_EVENT_DISCONNECTED");
  24. break;
  25. case MQTT_EVENT_SUBSCRIBED:
  26. ESP_LOGD(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
  27. break;
  28. case MQTT_EVENT_UNSUBSCRIBED:
  29. ESP_LOGD(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
  30. break;
  31. case MQTT_EVENT_PUBLISHED:
  32. ESP_LOGD(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
  33. break;
  34. case MQTT_EVENT_DATA:
  35. ESP_LOGD(TAG, "MQTT_EVENT_DATA");
  36. ESP_LOGD(TAG, "TOPIC=%.*s\r\n", event->topic_len, event->topic);
  37. ESP_LOGD(TAG, "DATA=%.*s\r\n", event->data_len, event->data);
  38. if (client_data && client_data->message) {
  39. client_data->message(client, event, client_data->data);
  40. }
  41. break;
  42. case MQTT_EVENT_ERROR:
  43. ESP_LOGD(TAG, "MQTT_EVENT_ERROR");
  44. if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
  45. ESP_LOGW(TAG, "Last error code reported from esp-tls: 0x%x", event->error_handle->esp_tls_last_esp_err);
  46. ESP_LOGW(TAG, "Last tls stack error number: 0x%x", event->error_handle->esp_tls_stack_err);
  47. ESP_LOGW(TAG, "Last captured errno : %d (%s)", event->error_handle->esp_transport_sock_errno,
  48. strerror(event->error_handle->esp_transport_sock_errno));
  49. } else if (event->error_handle->error_type == MQTT_ERROR_TYPE_CONNECTION_REFUSED) {
  50. ESP_LOGW(TAG, "Connection refused error: 0x%x", event->error_handle->connect_return_code);
  51. } else {
  52. ESP_LOGW(TAG, "Unknown error type: 0x%x", event->error_handle->error_type);
  53. }
  54. break;
  55. /*
  56. case MQTT_USER_EVENT:
  57. event->data = (char*)handler_args;
  58. break;
  59. */
  60. default:
  61. ESP_LOGD(TAG, "Other event id:%d", event->event_id);
  62. break;
  63. }
  64. }
  65. esp_mqtt_client_handle_t start_mqtt_client(
  66. mqtt_connect_handler connect,
  67. mqtt_message_handler message,
  68. void* data
  69. ) {
  70. ESP_LOGI(TAG, "Starting MQTT client");
  71. mqtt_client_data* client_data = (mqtt_client_data*)malloc(sizeof(*client_data));
  72. client_data->connect = connect;
  73. client_data->message = message;
  74. client_data->data = data;
  75. const esp_mqtt_client_config_t mqtt_cfg = {
  76. .broker = {
  77. .address = {.uri = CONFIG_BROKER_URI},
  78. .verification = {.certificate = (const char *)broker_pem_start},
  79. },
  80. .credentials = {
  81. .username = CONFIG_BROKER_USER,
  82. .authentication = {.password = CONFIG_BROKER_PASSWORD},
  83. },
  84. .buffer = {.size = 4096},
  85. };
  86. esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
  87. esp_mqtt_client_register_event(client, MQTT_EVENT_ANY, mqtt_event_handler, client_data);
  88. esp_mqtt_client_start(client);
  89. return client;
  90. }
  91. void stop_mqtt_client(esp_mqtt_client_handle_t client) {
  92. /*
  93. // Hijack the user event to grab the client data on the heap
  94. esp_mqtt_event_t event;
  95. esp_mqtt_dispatch_custom_event(client, &event);
  96. esp_mqtt_client_stop(client);
  97. free((mqtt_client_data*)event->data)
  98. */
  99. }