当前位置: 首页 > news >正文

小智-ESP32的MQTT协议

1、添加文件main/CMakeLists.txt文件里添加mqtt.c文件:

set(SOURCES "audio_codecs/audio_codec.cc""audio_codecs/no_audio_codec.cc""audio_codecs/box_audio_codec.cc""audio_codecs/es8311_audio_codec.cc""audio_codecs/es8374_audio_codec.cc""audio_codecs/es8388_audio_codec.cc""audio_processing/audio_debugger.cc""led/single_led.cc""led/circular_strip.cc""led/gpio_led.cc""display/display.cc""display/lcd_display.cc""display/oled_display.cc""protocols/protocol.cc""protocols/mqtt.cc""protocols/mqtt_protocol.cc""protocols/websocket_protocol.cc""iot/thing.cc""iot/thing_manager.cc""mcp_server.cc""system_info.cc""application.cc""ota.cc""settings.cc""background_task.cc""main.cc")

2、设置MQTT服务器参数

    const esp_mqtt_client_config_t mqtt_config = {.broker.address.uri = CIE_MQTT_URI,//.broker.address.hostname = CIE_MQTT_BROKER,//.broker.address.port = CIE_MQTT_BROKER_PORT,.credentials.client_id = CIE_MQTT_CLIENT_ID,.credentials.username = CIE_MQTT_USERNAME,.credentials.authentication.password = CIE_MQTT_PASSWORD,.session.keepalive = CIE_MQTT_KEEP_ALIVE_SECONDS,};

其中服务器配置如下:

#define MQTT_URI "mqtt://www.test.com:1883/"
#define MQTT_BROKER_PORT 1883
#define MQTT_CLIENT_ID "S94A990300CFC"
#define MQTT_USERNAME "ciejlzk"
#define MQTT_PASSWORD "PO0KY3A9U1EF3UK0"

3、启动服务器

  • esp_mqtt_client_init:初始化客户端;
  • esp_mqtt_client_register_event:注册事件处理函数;
  • esp_mqtt_client_start:启动服务器;
    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_config);/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);esp_mqtt_client_start(client);

4、启动代码

static void mqtt_app_start(void)
{const esp_mqtt_client_config_t mqtt_config = {.broker.address.uri = MQTT_URI,.credentials.client_id = MQTT_CLIENT_ID,.credentials.username = MQTT_USERNAME,.credentials.authentication.password = MQTT_PASSWORD,.session.keepalive = MQTT_KEEP_ALIVE_SECONDS,};/*if (broker_port == 8883) {mqtt_config.broker.address.transport = MQTT_TRANSPORT_OVER_SSL;mqtt_config.broker.verification.crt_bundle_attach = esp_crt_bundle_attach;} else {mqtt_config.broker.address.transport = MQTT_TRANSPORT_OVER_TCP;}mqtt_config.credentials.client_id = CIE_MQTT_CLIENT_ID;mqtt_config.credentials.username = CIE_MQTT_USERNAME;mqtt_config.credentials.authentication.password = CIE_MQTT_PASSWORD;mqtt_config.session.keepalive = CIE_MQTT_KEEP_ALIVE_SECONDS;*/esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_config);/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);esp_mqtt_client_start(client);
}

5、事件处理函数

/** @brief Event handler registered to receive MQTT events**  This function is called by the MQTT client event loop.** @param handler_args user data registered to the event.* @param base Event base for the handler(always MQTT Base in this example).* @param event_id The id for the received event.* @param event_data The data for the event, esp_mqtt_event_handle_t.*/
static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id);esp_mqtt_event_handle_t event = event_data;esp_mqtt_client_handle_t client = event->client;int msg_id;switch ((esp_mqtt_event_id_t)event_id) {case MQTT_EVENT_CONNECTED:ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");// msg_id = esp_mqtt_client_publish(client, CIE_MQTT_PUB_TOPIC, CIE_MQTT_PUB_TOPIC_PAYLOAD, 0, 0, 0);// ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);msg_id = esp_mqtt_client_subscribe(client, CIE_MQTT_SUB_TOPIC, 0);ESP_LOGI(TAG, "sent subscribe successful, sub_topic: %s msg_id=%d", CIE_MQTT_SUB_TOPIC, msg_id);msg_id = esp_mqtt_client_publish(client, CIE_MQTT_PUB_TOPIC, CIE_MQTT_PUB_TOPIC_PAYLOAD, 0, 0, 0);ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);// msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1);// ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);// msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1");// ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id);break;case MQTT_EVENT_DISCONNECTED:ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");break;case MQTT_EVENT_SUBSCRIBED:ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);// msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0);// ESP_LOGI(TAG, "sent publish successful, msg_id=%d", 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");printf("TOPIC=%.*s\r\n", event->topic_len, event->topic);printf("DATA=%.*s\r\n", event->data_len, event->data);OnMqttDataReceive(event->data_len, event->data);break;case MQTT_EVENT_ERROR:ESP_LOGI(TAG, "MQTT_EVENT_ERROR");if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err);log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err);log_error_if_nonzero("captured as transport's socket errno",  event->error_handle->esp_transport_sock_errno);ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno));}break;default:ESP_LOGI(TAG, "Other event id:%d", event->event_id);break;}
}

http://www.dtcms.com/a/335074.html

相关文章:

  • linux设备驱动之字符设备驱动
  • Python-Pandas基础
  • 主从复制+哨兵
  • 移动互联网发展战略
  • Altium Designer 22使用笔记(7)---网表导入,叠层设置
  • Spring框架(IOC)
  • 程序设计|C语言教学——C语言基础4:进阶
  • TOGAF八步一法笔记2
  • day42_2025-08-16
  • TDengine 3.3.7.0 版新功能(BLOB 数据类型)
  • ZYNQ QSPI控制器说明
  • JIT 编译与解释执行机制:Java 性能加速的幕后引擎
  • Linux软件编程-线程(2)
  • Python训练营打卡 DAY 38 Dataset和Dataloader类
  • 《代码重生:杨蓉与62.webp》
  • PowerShell中搜索文件夹
  • 国内代理IP在SEO行业中的应用
  • 云安全 - The Big IAM Challenge
  • 低代码平台能力框架:可复用组件与复杂业务的实现机制
  • 现金流预测模型:12个月精准计算指南
  • 嵌入式硬件篇---电感本质
  • Tomcat架构深度解析:从Server到Servlet的全流程揭秘
  • 【数据分享】上市公司供应链成本分摊数据(2007-2024)
  • 使用Python的defaultdict处理字典中的缺失键
  • C++设计模式:面向对象设计原则
  • 肖臻《区块链技术与应用》第20-22讲 - 以太坊难度调整、权益证明和智能合约
  • Java:File类、递归、字符集、IO流体系及Commons-io框架
  • MySQL锁机制:悲观锁VS乐观锁详解
  • 关于“卷积“
  • 《智能体(Agent)速记指南》