You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:36:03