/* ESP32 AWS IoT
*
* Simplest possible example (that I could come up with) of using an ESP32 with AWS IoT.
* No messing with openssl or spiffs just regular pubsub and certificates in string constants
*
* Author: Anthony Elder
* License: Apache License v2
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#include <time.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "Wokwi-GUEST";
// AWS IoT Endpoint
const char* awsEndpoint = "a3ic8xvnnkvyxt-ats.iot.us-east-1.amazonaws.com";
// xxxxxxxxxx-certificate.pem.crt
static const char certificatePemCrt[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDWjCCAkKgAwIBAgIVAPY6RxO2jv6jj/W6zwWmM9yqOXfUMA0GCSqGSIb3DQEB
CwUAME0xSzBJBgNVBAsMQkFtYXpvbiBXZWIgU2VydmljZXMgTz1BbWF6b24uY29t
IEluYy4gTD1TZWF0dGxlIFNUPVdhc2hpbmd0b24gQz1VUzAeFw0yNDA3MDUxNjE3
MzJaFw00OTEyMzEyMzU5NTlaMB4xHDAaBgNVBAMME0FXUyBJb1QgQ2VydGlmaWNh
dGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDxQ+6utTfF93ES/uoA
rc8LNDjrsZLjhAne7Iaq+i02sgXXa7hhCJhHFGnXLobo7KwljN482zBZsrH4okk4
3p4RswNFQnCGjblORDxpBokyckUbGhlu352s+12m0a1H0W6s8aMaa/eMZt41PL+h
Zm6ON3TsruvRrpAu8zyaDNKgvUxmPf3czQk/3NwjxQ6uN0MY0SohQxayOQtOnMpn
dinBnCgECtuluDmY6oYt9lQXwrHE4JoH/BYcHng05jPHO1iqqydSawZAmrj9EXR6
55n03CPT6ud0Y99wtRNNyxGEhS3axrdRv1KFvEH3oX1CsI6/Xy7mSVqeE8kt3aaG
yem1AgMBAAGjYDBeMB8GA1UdIwQYMBaAFBiXLRC1QM81Cmo4OsAlmJwpjKe3MB0G
A1UdDgQWBBR9q+Mzq2rEURGdHvyZQTavzcjtBjAMBgNVHRMBAf8EAjAAMA4GA1Ud
DwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAdFywhPJc+eelI/NLmn+0OGvE
J0Nh76kGdHGMOHhNgxxNNPeZB0pgqHvqxuji0Chu85x/kaMRURkWL8QkZu9mLKDt
ajfacHyFdGdx3POCVH5i16e6C00cBR8xGrmE5gITupMyqfep6JgYp2O3WtFZQaQb
YtmaMBmPHChbpkt69XjERvwt+ITgHHPuPDkF8hXe6Mkm/4rj6baKoBss3jXwqNEJ
GIwFE6HEnQRfxdy9rBvq72xDuzkwidrKaIOKxbnKzU9wV06DPgg0gbz8qP03/kGD
/0OqplQu/prGc+ZwLZBgPXg0OsxoFfIZanYDsu5nsO712g+jhE9UkXeJFiIpuA==
-----END CERTIFICATE-----
)EOF";
// xxxxxxxxxx-private.pem.key
static const char privatePemKey[] PROGMEM = R"EOF(
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA8UPurrU3xfdxEv7qAK3PCzQ467GS44QJ3uyGqvotNrIF12u4
YQiYRxRp1y6G6OysJYzePNswWbKx+KJJON6eEbMDRUJwho25TkQ8aQaJMnJFGxoZ
bt+drPtdptGtR9FurPGjGmv3jGbeNTy/oWZujjd07K7r0a6QLvM8mgzSoL1MZj39
3M0JP9zcI8UOrjdDGNEqIUMWsjkLTpzKZ3YpwZwoBArbpbg5mOqGLfZUF8KxxOCa
B/wWHB54NOYzxztYqqsnUmsGQJq4/RF0eueZ9Nwj0+rndGPfcLUTTcsRhIUt2sa3
Ub9ShbxB96F9QrCOv18u5klanhPJLd2mhsnptQIDAQABAoIBAQCDgl75FkiXfUBC
dXcB9bvUxJt+ReXmZFOpEs55JjM9DB7JBKuVIMU4gXUL2Q2qq09OjJGbJHMfgZsn
BvbYq+gHh8dxmjyR63Clq+Yt7WUdfVIT6s8QM43T+5RZ2RMWAZ/NX01jmpRuEKhw
5nMiPB5pIOt4FATw37EyFl3jLrgk6ttMR/LyykZvk2GqEAuLqR8msuBXfKydaaAs
siEec43Y7ZVYeb+HNSXOACL3ilU0NOKMV8NFtmHeT1H2cd/zNgIufTVXn4LCzK/n
STYhW4Q4OCsrfoaJASmE5TgBqFmHh/+VZES3ozRB4uCUSpvndfYYCZJttIeO5fCL
V+IuAVulAoGBAP/fCdyI6pkqASUP8qZX3aZePCbxbNpOadDa6CO7SszHfMxabRif
qauhfmrIRWaL24vMmlglbGevYEtmUw17qZ3KS4UAmJZFx8aS+7WL45wEb8Y+0fLe
XhXnuIBlyEEov5Yoa26hl9R1Is+vWKxpDZIDIux70X12Fo4vk+ou391LAoGBAPFj
AyWvxphnXlcA5Ag9b3TQaQhqZjvb5IPahIfwglSnUDkHE+0VLDyxZrmzuOfhnFPG
Xc702EdKUJnhA8WFgjoAj8OJUYrfXBbw43M5rRcAXYzU+PNirbepfMk0s6AfkHuP
KDHoQmjdzdXmMte6r8SSycZ1kazCaxfTlM49A/T/AoGAHl/357pJP02BPUkbYSvl
IC7nrSfT6EaOwUB7dmJxisXTxt6lPNsXZUySmVKVCotn0LzFRdmLePOU1t6a1Wrs
w9KUDIH5mz1Fbglc4DxvFMJiEoK6ob5MJQWRHYz3rOSNeeHqfwOn5ozRSR5jxHPk
LIU6zCAWynIOU2rKgG54HOkCgYEAsWyQhKPlumHIQvUBp1jY0qjZevkR+g+PsKbu
YSkT8vskCTa9m7bDVD0k/3wtfisjh6Q3kYYAbq4d/m0ZI5cVeGKvSQ9m40d33djj
pe8P3edD298yuVqfy26FrTLSkPCCd39rEPvhzEi0IfPZDR5IUZl/PCNwluY0Z0f6
iXjprqsCgYAoQkxWr61lUiiVPTNjOJyCjKRc6G1oM91/jCarxhmeBu1YkNkn+g1s
0cO+oBGpXVJnigGgW4cfOdNJCqP4rJf5SlxzjDh+FCbFDDFzSmYIwmbMCxBoh5pC
a3GGhbLPiFOylb6C/ith+0hLxhfunqCd1qQiHpxkk35ajNV7lyQA9A==
-----END RSA PRIVATE KEY-----
)EOF";
// Amazon Root CA 1
static const char caPemCrt[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
rqXRfboQnoZsG4q5WTP468SQvvG5
-----END CERTIFICATE-----
)EOF";
WiFiClientSecure wiFiClient;
PubSubClient pubSubClient(wiFiClient);
void msgReceived(char* topic, byte* payload, unsigned int len);
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("ESP32 AWS IoT Example");
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
WiFi.waitForConnectResult();
Serial.print(", WiFi connected, IP address: ");
Serial.println(WiFi.localIP());
// Initialize time
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
Serial.print("Waiting for NTP time sync: ");
time_t now = time(nullptr);
while (now < 8 * 3600 * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println();
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
Serial.print("Current time: ");
Serial.print(asctime(&timeinfo));
// Configure WiFiClientSecure
wiFiClient.setCACert(caPemCrt);
wiFiClient.setCertificate(certificatePemCrt);
wiFiClient.setPrivateKey(privatePemKey);
// Configure PubSubClient
pubSubClient.setServer(awsEndpoint, 8883);
pubSubClient.setCallback(msgReceived);
}
unsigned long lastPublish;
int msgCount;
void loop() {
pubSubCheckConnect();
if (millis() - lastPublish > 10000) {
String msg = String("Hello from ESP32: ") + ++msgCount;
pubSubClient.publish("outTopic", msg.c_str());
Serial.print("Published: ");
Serial.println(msg);
lastPublish = millis();
}
}
void msgReceived(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received on ");
Serial.print(topic);
Serial.print(": ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void pubSubCheckConnect() {
if (!pubSubClient.connected()) {
Serial.print("PubSubClient connecting to: ");
Serial.print(awsEndpoint);
while (!pubSubClient.connected()) {
Serial.print(".");
pubSubClient.connect("ESPthing");
}
Serial.println(" connected");
pubSubClient.subscribe("inTopic");
}
pubSubClient.loop();
}