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

ESP32连接AWS上报DHT数据时MQTT报错RC=-1的解决求助

ESP32连接AWS IoT MQTT返回rc=-1故障排查与修复方案

PubSubClient库返回状态码rc=-1代表底层TCP/TLS连接建立失败,不属于MQTT协议层报错,问题集中在证书校验、网络连通性、云平台权限三个方向,对应你的代码可按以下步骤排查:

1. 证书读取逻辑修复

你当前从SPIFFS读取证书的代码存在逻辑错误,每次循环读取的内容会覆盖上一次的结果,导致最终拿到的证书不完整,TLS握手直接失败:
原错误代码段:

// 原错误逻辑,会覆盖读取内容
while (file2.available()) {
    Read_rootca = file2.readString();
    Serial.println(Read_rootca);
}

修改为拼接模式,根CA、设备证书、私钥三个文件的读取逻辑都要对应修改:

Read_rootca = "";
while (file2.available()) {
    Read_rootca += file2.readString();
}
Serial.println(Read_rootca);

同时检查SPIFFS中上传的三个证书文件是否完整,文件名与代码中路径完全一致(大小写敏感),根CA使用AWS IoT官方提供的AmazonRootCA1.pem,不要使用过期根证书。

2. AWS IoT平台配置检查

  • 确认你创建的设备证书已处于激活状态,附加的IoT策略开放了对应权限:必须允许iot:Connect(你的clientId为ESP32-xxxx格式,策略资源要匹配该规则)、iot:Publish(对应你代码中的ei_out、temp/主题)、iot:Subscribe(对应你代码中的ei_in主题),测试阶段可暂时放宽权限规则避免拦截。
  • 确认代码中的mqtt_server参数与AWS IoT控制台给出的端点完全一致,区域(你代码中为us-west-2)与你创建资源的区域匹配,没有拼写错误。

3. 网络与TLS配置优化

  • 确认ESP32连接的WiFi可以正常访问公网,网络运营商、路由器防火墙没有封禁8883端口,可使用同WiFi下的设备测试能否正常访问你的AWS IoT端点8883端口。
  • 新版ESP32 Arduino内核的WiFiClientSecure默认缓冲区较小,可在设置证书前添加代码增大TLS缓冲区,避免握手失败:
espClient.setBufferSizes(4096, 4096);
  • 可在连接失败处添加TLS错误码打印,进一步定位故障:
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.print(" TLS error: ");
Serial.println(espClient.getLastSSLError());
Serial.println(" try again in 5 seconds");

4. PubSubClient库适配

PubSubClient默认最大报文长度为128字节,若TLS握手包或MQTT报文超过该长度会直接断连,可修改PubSubClient库源文件中PubSubClient.h里的MQTT_MAX_PACKET_SIZE参数为1024,适配AWS IoT的报文大小要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 23:00:02