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

