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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:30:24