ESP32接入Azure IoT Hub后MQTT_EVENT_DATA事件不触发问题排查求助
根因分析
你的代码仅实现了Azure IoT Hub的遥测上行逻辑,没有遵循MQTT协议要求主动订阅云到设备(C2D)下行消息的对应主题,因此云端下发的消息无法被设备接收,不会触发MQTT_EVENT_DATA事件。
修复方案
需要在MQTT连接成功后,调用Azure IoT C SDK提供的API获取C2D消息的订阅主题,完成订阅操作即可。具体修改如下:
- 先在全局变量区新增C2D主题存储变量:
static char telemetry_topic[128]; static char c2d_topic[128]; // 新增这一行 static uint8_t telemetry_payload[100];
- 修改
mqtt_event_handler回调中的MQTT_EVENT_CONNECTED分支,添加订阅逻辑:
case MQTT_EVENT_CONNECTED: Logger.Info("MQTT event MQTT_EVENT_CONNECTED"); // 新增:获取C2D消息订阅主题 if (az_result_failed(az_iot_hub_client_c2d_get_subscribe_topic( &client, c2d_topic, sizeof(c2d_topic), NULL))) { Logger.Error("获取C2D订阅主题失败"); break; } // 订阅主题 int sub_result = esp_mqtt_client_subscribe(mqtt_client, c2d_topic, MQTT_QOS1); if (sub_result == -1) { Logger.Error("C2D主题订阅失败"); } else { Logger.Info("C2D主题订阅成功"); } break;
- (可选)修改
MQTT_EVENT_DATA分支,调用你已定义的回调处理收到的消息:
case MQTT_EVENT_DATA: Logger.Info("MQTT event MQTT_EVENT_DATA"); receivedCallback(event->topic, (byte*)event->data, event->data_len); Serial.println(); break;
验证说明
修改完成后重新烧录程序,待设备连接到IoT Hub并打印C2D主题订阅成功的日志后,再从Azure控制台下发测试消息,即可在串口看到收到的消息内容。
内容的提问来源于stack exchange,提问作者dobre.b
相关产品推荐
相关产品推荐

