ESP32订阅MQTT Broker多主题失败问题求助
问题分析与解决
问题根源
你遇到的E (2594) mqtt_client: Subscribe message cannot be created错误,核心原因是MQTT客户端的收发缓冲区设置过小,无法容纳3个主题的订阅请求报文。
查看你的配置:
.buffer.size = 32, .buffer.out_size = 32
32字节的缓冲区仅能处理极短的单主题订阅,当订阅多个主题时,订阅报文的总长度(包含所有主题字符串、QoS标识、MQTT协议头)远超32字节,导致客户端无法创建完整的订阅消息。
解决方案
修改esp_mqtt_client_config_t中的缓冲区配置,将buffer.size和buffer.out_size调整为足够大的值。根据你的3个主题长度,建议设置为至少256字节(若后续增加主题或主题更长,可进一步调至512或1024)。
修改后的配置示例:
esp_mqtt_client_config_t cfg = { .broker.address.hostname = ip, .broker.address.port = port, .broker.address.transport = MQTT_TRANSPORT_OVER_TCP, .credentials.set_null_client_id = true, .session.protocol_ver = MQTT_PROTOCOL_V_3_1_1, .task.priority = 1, .task.stack_size = 4096, .buffer.size = 256, // 增大接收缓冲区 .buffer.out_size = 256 // 增大发送缓冲区 };
补充说明
你之前尝试动态分配主题列表无效,是因为问题并非出在主题列表的内存分配,而是MQTT客户端内部用于构建和发送订阅请求的缓冲区不足。调整缓冲区大小后,多主题订阅即可正常工作。
内容的提问来源于stack exchange,提问作者xicobski
相关产品推荐
相关产品推荐

