2

My ESP8266 cannot connect to AWS IoT MQTT broker via PubSubClient. My broker is definitely working, because my ESP32 can connect to it (I use MQTTClient for ESP32, which is not available on ESP8266). Also, I've tried using same credentials, certificates and etc. from ESP32 on my ESP8266, but ESP8266 still cannot connect. What could be the problem? Thank you.

Serial monitor:

Connecting to mywifinameConnecting to WiFi...
, WiFi connected, IP address: 192.168.1.216
MQTT keep alive found MQTT status 0 WiFi status 3

Connecting to mywifinameConnecting to WiFi...
, WiFi connected, IP address: 192.168.1.216
PubSubClient connecting to: xxxxxxxxxxxxxxx-ats.iot.us-east-2.amazonaws.com.-1
.-2
.-2
.-2
.-2
.-2

Code:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char *ssid = "mywifiname";
const char *password = "mywifipass";

const char *awsEndpoint = "xxxxxxxxxxxxxxx-ats.iot.us-east-2.amazonaws.com";

// xxxxxxxxxx-certificate.pem.crt
const char *certificate_pem_crt =

    "-----BEGIN CERTIFICATE-----\n"
    "MIIDWTCCAkGgAwIBAgIUJ1gT+uvYaUrsqYAuKDGCCY+exfEwDQYJKoZIhvcNAQEL\n"
    "-----END CERTIFICATE-----\n";

// xxxxxxxxxx-private.pem.key
const char *private_pem_key =

    "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIEpAIBAAKCAQEA3mf0dUwoQY47sL1DL9yKlwoafBpRwgXLqo6bb+ZFKyqmSmU0\n"
    "-----END RSA PRIVATE KEY-----\n";

/* root CA can be downloaded in:
  https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem
*/
const char *rootCA =
    "-----BEGIN CERTIFICATE-----\n"
    "MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n"
    "-----END CERTIFICATE-----\n";

BearSSL::X509List CERT_CA(rootCA);
BearSSL::X509List CERT_CRT(certificate_pem_crt);
BearSSL::PrivateKey CERT_PRIVATE(private_pem_key);

WiFiClientSecure wiFiClient;
void msgReceived(char *topic, byte *payload, unsigned int len);
PubSubClient pubSubClient(awsEndpoint, 8883, msgReceived, wiFiClient);

void connectToMQTT();
void connectToWiFi();

void setup()
{
    Serial.begin(9600);
    delay(50);
    Serial.println();
    Serial.println("ESP8266 AWS IoT Example");
    Serial.printf("SDK version: %s\n", ESP.getSdkVersion());

    connectToWiFi();
}

unsigned long lastPublish;
int msgCount;

void loop()
{
    if ((wiFiClient.connected()) && (WiFi.status() == WL_CONNECTED))
    {
        pubSubClient.loop();

        if (millis() - lastPublish > 10000)
        {
            if (!pubSubClient.connected())
            {
                connectToMQTT();
            }

            String msg = String("Hello from ESP8266: ") + ++msgCount;
            //boolean rc = pubSubClient.publish("outTopic", msg.c_str());
            //Serial.print("Published, rc=");
            //Serial.print((rc ? "OK: " : "FAILED: "));
            Serial.println(msg);
            lastPublish = millis();
        }
    }
    else
    {
        Serial.print("MQTT keep alive found MQTT status ");
        Serial.print(String(wiFiClient.connected()));
        Serial.print(" WiFi status ");
        Serial.print(String(WiFi.status()));
        Serial.print("\n\n");

        if (!(wiFiClient.connected()) || !(WiFi.status() == WL_CONNECTED))
        {
            connectToWiFi();
        }

        connectToMQTT();
    }
}

void msgReceived(char *topic, byte *payload, unsigned int length)
{
    Serial.print("Message received on ");
    Serial.print(topic);
    Serial.println();
}

void connectToWiFi()
{
    Serial.print("Connecting to ");
    Serial.print(ssid);

    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    WiFi.waitForConnectResult();
    Serial.println("Connecting to WiFi...");

    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.print(".");
    }

    Serial.print(", WiFi connected, IP address: ");
    Serial.println(WiFi.localIP());

    wiFiClient.setTrustAnchors(&CERT_CA);
    wiFiClient.setClientRSACert(&CERT_CRT, &CERT_PRIVATE);
}

void connectToMQTT()
{
    if (WiFi.status() != WL_CONNECTED)
    {
        connectToWiFi();
    }

    if (!pubSubClient.connected())
    {
        Serial.print("PubSubClient connecting to: ");
        Serial.print(awsEndpoint);
        while (!pubSubClient.connected())
        {
            Serial.print(".");
            Serial.println(pubSubClient.state());
            pubSubClient.connect("thingname");
            delay(100);
        }
        Serial.println(" connected");
        pubSubClient.subscribe("inTopic");
    }

    pubSubClient.loop();
}
Captain Jacky
  • 888
  • 1
  • 12
  • 26

0 Answers0