1

I am trying to connect esp8266-12f to aws iot core following this tutorial. Below is my code.

main.cpp

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "config.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

#define wifi_status_led_pin 14
#define server_status_led_pin 12

using string = std::string;

#define AWS_IOT_MQTT_PORT 8883

WiFiClientSecure net;
BearSSL::X509List cert(AWS_CERT_CA);
BearSSL::X509List client_crt(AWS_CERT_CRT);
BearSSL::PrivateKey key(AWS_CERT_PRIVATE);
PubSubClient client(net);


void configAWS()
{
  // net.setInsecure();
  net.setTrustAnchors(&cert);
  net.setClientRSACert(&client_crt, &key);
  client.setServer(AWS_IOT_ENDPOINT, AWS_IOT_MQTT_PORT);

  while (!client.connected(THINGNAME))
  {
    Serial.println("Connecting to AWS");
    digitalWrite(server_status_led_pin, HIGH);
    delay(500);
    digitalWrite(server_status_led_pin, LOW);
    delay(500);
  }

  if (client.connected() && client.connect(THINGNAME))
  {
    client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
    client.setCallback(messageHandler);
    Serial.println("AWS IoT connected!");
    digitalWrite(server_status_led_pin, HIGH);
  }
}

void setup() {
  Serial.println("setup");
  pinMode(wifi_status_led_pin, OUTPUT);
  pinMode(server_status_led_pin, OUTPUT);
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("wifi connecting");
    digitalWrite(wifi_status_led_pin, HIGH);
    delay(300);
    digitalWrite(wifi_status_led_pin, LOW);
    delay(300);
  }
  digitalWrite(wifi_status_led_pin, HIGH);
  Serial.println("connected network");
  configAWS();
  pinMode(door1_open_pin, OUTPUT);
  pinMode(door1_status_pin, INPUT);
  door1_previous_state = digitalRead(door1_status_pin);
}

void loop() {
}

config.h

#include <pgmspace.h>

#define SECRET
#define THINGNAME "THINGNAME " // change this

const char WIFI_SSID[] = "mywifi";     // change this
const char WIFI_PASSWORD[] = "password"; // change this
const char AWS_IOT_ENDPOINT[] = "XXXXXXXXX-ats.iot.us-east-2.amazonaws.com";

// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
ca cert
-----END CERTIFICATE-----
)EOF";

// Device Certificate                                               
static const char AWS_CERT_CRT[] PROGMEM = R"KEY(
-----BEGIN CERTIFICATE-----
my cert
-----END CERTIFICATE-----
)KEY";

// Device Private Key                                               
static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
mykey
-----END RSA PRIVATE KEY-----
)KEY";

The cert should have no problem since I also tried esp32 with same cert and thing and it success. But in esp8266, I cannot connect to aws and keep logging "Connecting to AWS".

I am not sure it matters, but I am using platformio and only board esp12e instead of 12f is avaliable.

my ini file below,

[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
lib_deps = 
    bblanchon/ArduinoJson@^6.20.1
    knolleary/PubSubClient@^2.8
    ESP8266WiFi @ ^1.0

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.