类BearSSL::WiFiClientSecure没有名为'loadCertificate'的成员。

4

我尝试将以下的sketch加载到我的WeMos D1 R1中。 我的目的是将该板连接到AWS IoT。 下面是该sketch的示例。

#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' 的成员

我不确定哪种解决方案适合解决此问题,因此可以上传草稿,请给予建议!


1
也许你需要安装不同版本的espClient。顺便说一下,你似乎写了硬编码密码和apiendpoint... - shimo
我尝试重新安装以前的版本,但它们都没有起作用。 :( - John Miles
这段代码是否正确包含了WiFiClientSecure.h库?你的代码中有loadCertificate函数吗?我使用的是2.7.4版本。 - shimo
3个回答

11

他们为什么在3.0.1更新中删除了这个功能? - Shalabyer
我遇到了同样的问题,尝试了上面的解决方案,但它没有起作用! - Sri Krishna

5

他们为什么在3.0.1更新中删除了这个功能? - Shalabyer

0

我通过 platformio.ini 文件如下所示更新了 VScode 上的板库。

[env:nodemcuv2]
platform = espressif8266@2.6.0
board = nodemcuv2
framework = arduino

我使用了 2.6.0 版本,因为我知道我的代码在那个版本上可以运行。现在代码上传没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接