amazon-web-services - “BearSSL::WiFiClientSecure 类”没有名为“loadCertificate”的成员
问题描述
我尝试将下面的草图加载到我的 WeMos D1 R1 中。我的目的是将开发板连接到 AWS IoT。下面是草图的例子。
#include "FS.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
// Update these with values suitable for your network.
const char* ssid = "JakeNguyen";
const char* password = "t12014494";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");
const char* AWS_endpoint = "a3jtguyw0m894s-ats.iot.us-west-2.amazonaws.com"; //MQTT broker ip
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
WiFiClientSecure espClient;
PubSubClient client(AWS_endpoint, 8883, callback, espClient); //set MQTT port number to 8883 as per //standard
long lastMsg = 0;
char msg[50];
int value = 0;
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
espClient.setBufferSizes(512, 512);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
timeClient.begin();
while(!timeClient.update()){
timeClient.forceUpdate();
}
espClient.setX509Time(timeClient.getEpochTime());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESPthing")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe("inTopic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
char buf[256];
espClient.getLastSSLError(buf,256);
Serial.print("WiFiClientSecure SSL error: ");
Serial.println(buf);
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
setup_wifi();
delay(1000);
if (!SPIFFS.begin()) {
Serial.println("Failed to mount file system");
return;
}
Serial.print("Heap: "); Serial.println(ESP.getFreeHeap());
File cert = SPIFFS.open("/cert.der", "r"); //replace cert.crt eith your uploaded file name
if (!cert) {
Serial.println("Failed to open cert file");
}
else
Serial.println("Success to open cert file");
delay(1000);
if (espClient.loadCertificate(cert))
Serial.println("cert loaded");
else
Serial.println("cert not loaded");
File private_key = SPIFFS.open("/private.der", "r"); //replace private eith your uploaded file name
if (!private_key) {
Serial.println("Failed to open private cert file");
}
else
Serial.println("Success to open private cert file");
delay(1000);
if (espClient.loadPrivateKey(private_key))
Serial.println("private key loaded");
else
Serial.println("private key not loaded");
// Load CA file
File ca = SPIFFS.open("/ca.der", "r"); //replace ca eith your uploaded file name
if (!ca) {
Serial.println("Failed to open ca ");
}
else
Serial.println("Success to open ca");
delay(1000);
if(espClient.loadCACert(ca))
Serial.println("ca loaded");
else
Serial.println("ca failed");
Serial.print("Heap: "); Serial.println(ESP.getFreeHeap());
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "hello world #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
client.publish("outTopic", msg);
Serial.print("Heap: "); Serial.println(ESP.getFreeHeap()); //Low heap can cause problems
}
}
但是,此错误不断弹出:
在函数 'void setup()' 中:
mqtt_x509_DER:116:17: 错误: 'class BearSSL::WiFiClientSecure' 没有名为 'loadCertificate' 的成员 116 | if (espClient.loadCertificate(cert)) | ^~~~~~~~~~~~~~~
mqtt_x509_DER:131:17: 错误: 'class BearSSL::WiFiClientSecure' 没有名为 'loadPrivateKey' 的成员 131 | if (espClient.loadPrivateKey(private_key)) | ^~~~~~~~~~~~~~
mqtt_x509_DER:148:18: 错误: 'class BearSSL::WiFiClientSecure' 没有名为 'loadCACert' 的成员 148 | if(espClient.loadCACert(ca)) | ^~~~~~~~~~
退出状态 1 'class BearSSL::WiFiClientSecure' 没有名为 'loadCertificate' 的成员
我不确定哪种解决方案适合解决这个问题,所以我可以上传草图。请指教!
解决方案
将 boardManager 网址更新为http://arduino.esp8266.com/stable/package_esp8266com_index.json
并将 nodemcu 库更新到 2.7.4 或更低版本,如果您使用的是 3.0,它将无法正常工作
推荐阅读
- git - 在 github 上添加项目只添加了一个目录,而尝试推送其他目录给我带来了问题
- laravel - laravel-medailibrary getFirstMediaUrl("images") 不适用于连接表
- r - 没有正确处理 R 中的日期
- ios - 如何在 iOS 14+ 及更低版本上将文件选择器添加到应用程序
- c - 在 C 程序中包含 ext4.h
- python - 如何使用scrapy查询包含在json响应中的html
- python - 如何在 Django 模板中生成绝对 URL?
- ios - 如何使用 NSStream TCP/IP 套接字连接检查本地网络隐私权限状态(允许与否)?
- sql - 触发特定字段更改的触发器 Firebird 3.0
- r - 在数据框中渲染 NA 计数