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

如何将ESP32通过MQTT over Websockets(443端口)连接到Azure IoT Hub

问题

我正在开展实习项目,需将ESP32的MQTT消息发送至Azure IoT Hub。此前已参考ESP32 IoT Hub Azure SDK for C示例完成初始连接,可通过IoT Hub Explorer监控到遥测数据正常发送。但因项目将部署在公共环境,8883端口大概率会被封禁。根据Azure官方文档,IoT Hub支持通过TCP 443端口的MQTT over Websockets连接。我当前使用Azure SDK for C Arduino库,在PlatformIO IDE中开发ESP32,请问如何修改端口及客户端配置以使用443端口?

解决方案

只需修改3处关键配置即可实现MQTT over WebSocket通过443端口连接Azure IoT Hub,具体步骤如下:

1. 修改MQTT端口为443

找到代码中端口定义部分,替换默认的8883端口为443:

// 注释原默认端口定义,启用443端口
// static const int mqtt_port = AZ_IOT_DEFAULT_MQTT_CONNECT_PORT;
static const int mqtt_port = 443;

2. 切换MQTT协议为WebSocket over TLS

将原mqtts://协议的Broker URI改为wss://(WebSocket加密协议):

// 替换原URI定义
// static const char* mqtt_broker_uri = "mqtts://" IOT_CONFIG_IOTHUB_FQDN;
static const char* mqtt_broker_uri = "wss://" IOT_CONFIG_IOTHUB_FQDN;

3. 添加Azure IoT Hub专属WebSocket路径

Azure IoT Hub的MQTT over WebSocket需要指定固定路径/$iothub/websocket,在initializeMqttClient函数的MQTT配置中添加该路径:

static int initializeMqttClient()
{
#ifndef IOT_CONFIG_USE_X509_CERT
  if (sasToken.Generate(SAS_TOKEN_DURATION_IN_MINUTES) != 0)
  {
    Logger.Error("Failed generating SAS token");
    return 1;
  }
#endif

  esp_mqtt_client_config_t mqtt_config;
  memset(&mqtt_config, 0, sizeof(mqtt_config));
  mqtt_config.uri = mqtt_broker_uri;
  mqtt_config.port = mqtt_port;
  mqtt_config.client_id = mqtt_client_id;
  mqtt_config.username = mqtt_username;
  // 添加WebSocket路径配置
  mqtt_config.path = "/$iothub/websocket";

#ifdef IOT_CONFIG_USE_X509_CERT
  Logger.Info("MQTT client using X509 Certificate authentication");
  mqtt_config.client_cert_pem = IOT_CONFIG_DEVICE_CERT;
  mqtt_config.client_key_pem = IOT_CONFIG_DEVICE_CERT_PRIVATE_KEY;
#else // 使用SAS密钥认证
  mqtt_config.password = (const char*)az_span_ptr(sasToken.Get());
#endif

  // 其余配置保持不变
  mqtt_config.keepalive = 30;
  mqtt_config.disable_clean_session = 0;
  mqtt_config.disable_auto_reconnect = false;
  mqtt_config.event_handle = mqtt_event_handler;
  mqtt_config.user_context = NULL;
  mqtt_config.cert_pem = (const char*)ca_pem;

  mqtt_client = esp_mqtt_client_init(&mqtt_config);

  if (mqtt_client == NULL)
  {
    Logger.Error("Failed creating mqtt client");
    return 1;
  }

  esp_err_t start_result = esp_mqtt_client_start(mqtt_client);

  if (start_result != ESP_OK)
  {
    Logger.Error("Could not start mqtt client; error code:" + String(start_result));
    return 1;
  }
  else
  {
    Logger.Info("MQTT client started");
    return 0;
  }
}

验证注意事项

  • 确保ESP32的NTP时间同步正常,SAS Token和TLS认证依赖正确的系统时间
  • 保持原有WiFi连接、SAS Token生成逻辑不变,认证方式无需修改
  • 编译上传后,可通过IoT Hub Explorer验证遥测数据是否正常接收,同时查看ESP32串口输出确认连接状态

内容的提问来源于stack exchange,提问作者Amos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:49:54