ESP32连接AWS IoT Core遇DNS连接失败(rc=-2):原因排查与解决
ESP32连接AWS IoT Core报错“DNS failed to connect to endpoint of AWS. Failed, rc=-2”的排查与解决
问题描述
在Arduino IDE平台使用ESP32连接AWS IoT Core时,出现错误提示:DNS failed to connect to endpoint of AWS. Failed, rc=-2。已完成AWS孟买区域的Thing创建、策略配置及证书附加操作,代码运行正常且传感器可正常采集数据,但无法建立ESP32与AWS IoT Core的连接。
相关代码
#include <WiFiClientSecure.h> #include <ESP32Servo.h> #include <Arduino.h> #include <WiFi.h> #include <WiFiMulti.h> #include <PubSubClient.h> // Arduino PubSubClient library // Initialize AWS IoT Core parameters const char* awsEndpoint = "endpoint"; // Your AWS IoT Core endpoint const char* awsThingName = "xyz"; // Your IoT Thing name const char* awsClientId = "SWIOT"; // Client ID const char* awsTopic = "silowise/sub"; // MQTT Topic WiFiClientSecure Wificlient; PubSubClient mqtt(Wificlient); // Add your AWS IoT Core certificate and private key content here const char* root_ca = R"( -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )"; const char* your_cert = R"( -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- )"; const char* your_private_key = R"( -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- )"; WiFiMulti WIFI; #define WIFI_SSID "R5" #define WIFI_PASS "silowise12345" void connectToAWS() { Serial.println("Connecting to AWS..."); while (!mqtt.connect(awsClientId)) { Serial.print("Failed, rc="); Serial.print(mqtt.state()); Serial.println(" Retrying in 5 seconds"); delay(5000); } Serial.println("Connected to AWS"); } void setup() { Serial.begin(115200); WIFI.addAP(WIFI_SSID, WIFI_PASS); // Connect to AWS IoT Core Wificlient.setCACert(root_ca); Wificlient.setCertificate(your_cert); Wificlient.setPrivateKey(your_private_key); mqtt.setServer(awsEndpoint, 8883); connectToAWS(); } void loop() { if (WIFI.run() == WL_CONNECTED) { // Read sensor data // Publish sensor data to AWS IoT Core if (mqtt.connected()) { String payload = "{" "\"temperature\":" + String(sensTemp) + "," "\"humidity\":" + String(sensMoist) + "," "\"co2\":" + String(CO2) + "," "\"weight\":" + String(force_sensor) + "}"; mqtt.publish(awsTopic, payload.c_str()); } else { connectToAWS(); } } }
可能的原因及解决方法
1. AWS端点配置错误
- 问题:代码中
awsEndpoint变量使用占位符"endpoint",未替换为实际的AWS IoT Core端点地址。 - 解决:登录AWS控制台,进入IoT Core → 设置 → 端点,复制自定义终端节点(格式示例:
xxxxxx-ats.iot.ap-south-1.amazonaws.com),替换代码中的占位符。
2. DNS解析失败
- 问题:ESP32连接的WiFi无法正常解析AWS端点域名,可能是网络DNS配置异常或受限。
- 解决:
- 在
setup()中添加WiFi连接等待逻辑,确保网络就绪后再尝试连接AWS; - 手动指定公共DNS服务器,在WiFi连接成功后添加代码:
WiFi.config(INADDR_NONE, INADDR_NONE, IPAddress(8,8,8,8), IPAddress(8,8,4,4));。
- 在
3. 证书/密钥配置不完整
- 问题:根证书、设备证书或私钥内容缺失、格式错误,导致TLS握手失败,间接引发DNS连接错误的表象。
- 解决:
- 确认复制的证书/密钥包含完整的
-----BEGIN ...-----和-----END ...-----标记,无多余空格或遗漏; - 使用AWS IoT Core对应的根CA(孟买区域推荐使用Amazon Trust Services根CA)。
- 确认复制的证书/密钥包含完整的
4. 网络端口或防火墙限制
- 问题:ESP32所在网络的防火墙或路由器阻止了8883端口(MQTT over TLS)的出站连接。
- 解决:
- 用电脑验证端口连通性,执行命令
telnet xxxxxx-ats.iot.ap-south-1.amazonaws.com 8883或nc -zv xxxxxx-ats.iot.ap-south-1.amazonaws.com 8883; - 若端口被封,改用443端口(AWS IoT Core支持该端口的MQTT over TLS),修改代码为
mqtt.setServer(awsEndpoint, 443);。
- 用电脑验证端口连通性,执行命令
5. 连接逻辑时序问题
- 问题:当前代码未等待WiFi完全连接就初始化AWS连接,导致DNS解析时网络未就绪。
- 解决:修改
setup()函数,先确保WiFi连接成功再处理AWS连接:
void setup() { Serial.begin(115200); WIFI.addAP(WIFI_SSID, WIFI_PASS); // 等待WiFi连接成功 Serial.print("Connecting to WiFi..."); while (WIFI.run() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("\nWiFi connected"); // 初始化AWS连接 Wificlient.setCACert(root_ca); Wificlient.setCertificate(your_cert); Wificlient.setPrivateKey(your_private_key); mqtt.setServer(awsEndpoint, 8883); connectToAWS(); }
内容的提问来源于stack exchange,提问作者Ankita Seethiraju
相关产品推荐
相关产品推荐

