4

I tried loading this sketch below into my WeMos D1 R1. My intention is to connect the board to AWS IoT. Below is the example of the 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
  }
}

However, this error keeps popping up:

In function 'void setup()':

mqtt_x509_DER:116:17: error: 'class BearSSL::WiFiClientSecure' has no member named 'loadCertificate' 116 | if (espClient.loadCertificate(cert)) | ^~~~~~~~~~~~~~~

mqtt_x509_DER:131:17: error: 'class BearSSL::WiFiClientSecure' has no member named 'loadPrivateKey' 131 | if (espClient.loadPrivateKey(private_key)) | ^~~~~~~~~~~~~~

mqtt_x509_DER:148:18: error: 'class BearSSL::WiFiClientSecure' has no member named 'loadCACert' 148 | if(espClient.loadCACert(ca)) | ^~~~~~~~~~

exit status 1 'class BearSSL::WiFiClientSecure' has no member named 'loadCertificate'

I'm not sure which solution would be appropriate to solve this issue, so I can upload the sketch. Please advise!

John Miles
  • 51
  • 1
  • 1
  • 2
  • 1
    Maybe you need to install different version of espClient. By the way, you seems writing hard-coded password and apiendpoint... – shimo Jun 13 '21 at 21:40
  • I tried reinstall previous versions but none of them worked. :( – John Miles Jun 13 '21 at 22:25
  • Is this code including WiFiClientSecure.h properly? Do you find loadCertificate in your code? I was using ver 2.7.4. – shimo Jun 15 '21 at 04:08

3 Answers3

11

update the boardManager url to http://arduino.esp8266.com/stable/package_esp8266com_index.json

and update nodemcu library to 2.7.4 or below, it wont work if you are using 3.0

Manas Sahoo
  • 111
  • 2
5

Like Manas Sahoo said,

If you are using Arduino Ide,

Set the Board Manager URL to this in -> File -> Preferences http://arduino.esp8266.com/stable/package_esp8266com_index.json

Then go to tools -> board -> board manager -> search ESP8266, install the one by ESP8266 Community, make sure to install version 2.7.4 and not the latest ones. I got the exact same issue on version 3.0.1.

Board Manager ESP8266

Jas
  • 51
  • 1
  • 1
0

I updated the board library on VScode as shown below, through the platformio.ini file.

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

I used version 2.6.0 as I know my code was working on that version. The code now uploads without any issues.