如何将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
相关产品推荐
相关产品推荐

