/* ESP32 AWS IoT
*
* Simplest possible example (that I could come up with) of using an ESP32 with AWS IoT.
*
* Author: Anthony Elder
* License: Apache License v2
*/
#include <time.h>
#include "sntp.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h> // install with Library Manager, I used v2.6.0
#define RLED 23
#define triggerPin 32
#define echoPin 33
#define device_id 12
int distance = 0;
unsigned long timeStamp;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
long readUltrasonicDistance()
{
pinMode(triggerPin, OUTPUT); //clear the trigger
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin,LOW);
pinMode(echoPin, INPUT); //read echo pin and return the sound wave travel time in microseconds
return (0.01723 * pulseIn(echoPin, HIGH)); // send back to main program
}
const char* awsEndpoint = "a1lwwmqah6p5ea-ats.iot.us-east-1.amazonaws.com";
// Update the two certificate strings below. Paste in the text of your AWS
// device certificate and private key. Add a quote character at the start
// of each line and a backslash, n, quote, space, backslash at the end
// of each line:
// xxxxxxxxxx-certificate.pem.crt
const char* certificate_pem_crt = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWTCCAkGgAwIBAgIUUvvOcb8v0/xh/0DnUtil68RmOKMwDQYJKoZIhvcNAQEL
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTIzMDgxNTIxMTcw
NloXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQVdTIElvVCBDZXJ0aWZpY2F0
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALgJI3md+goUcSgkHCua
OJo6+TLYlpHRtrbM/f/YDccFE7mi1GcsMsdG5v/j+FuTduRQ2r6SHfWfoFJEERq3
B3o8ZL449OEKQHMPlbGHNus1+uw7BFQxOWcWvyzOjxajoO746xRw53ZT1hEEVKU8
UwE1r5COf+I2QejRfctOwxNfSIhlHFRCeaAorcej/hgv3KMTp/t9u2yZaoGwXc6l
VC17YTZi9y3j2PgzwzN5a7PIQR4Y+81ZhSBEgLvuqnj66Ba2NpjcrT7bZ2me3cUq
dPjTmXC0mBLE9EwqksO/eRKFf9Ww0cVp1nD0L9uLvFhr7YYlevw2KioCiruNofvH
ZI0CAwEAAaNgMF4wHwYDVR0jBBgwFoAUDJb3OpQ7ErrbhQMM3VJ6bf6iD9QwHQYD
VR0OBBYEFBF+h4afa7zYlB8BnmSlmfw9pBi9MAwGA1UdEwEB/wQCMAAwDgYDVR0P
AQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQAFX801L3JJbuI/TX3CMMjhQ1+2
91YFcQOQCgLSP8xBgZ1HCJbrEZ86V2puarCrlkGCQTEKxDKwgZGJ3tAu4ohoNJtT
zehkm9J8yaDqVbtOMQeQfs0+LKxNgNPGwNHfwX9EsXnQbqRdvNUivWLGGEPP/RXH
aWNNdafNUy6e4pq8G+ShN+oL2E7nHj5FKksQfVI7XbHiFK6lV+LYAqWEiz5zn81p
1hlaZcw5RaJjSBsriXebS1ykxFwk6Q0cnzCJZ39xCebJ+PyuV2MhUM9r3+lrCm5y
zeyHf/zASVqqgfa9BocE2qdUnx4nv+v8XymM8iUoAhDfdAQTvBcYPsz1pElj
-----END CERTIFICATE-----
)KEY";
// xxxxxxxxxx-private.pem.key
const char* private_pem_key = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuAkjeZ36ChRxKCQcK5o4mjr5MtiWkdG2tsz9/9gNxwUTuaLU
Zywyx0bm/+P4W5N25FDavpId9Z+gUkQRGrcHejxkvjj04QpAcw+VsYc26zX67DsE
VDE5Zxa/LM6PFqOg7vjrFHDndlPWEQRUpTxTATWvkI5/4jZB6NF9y07DE19IiGUc
VEJ5oCitx6P+GC/coxOn+327bJlqgbBdzqVULXthNmL3LePY+DPDM3lrs8hBHhj7
zVmFIESAu+6qeProFrY2mNytPttnaZ7dxSp0+NOZcLSYEsT0TCqSw795EoV/1bDR
xWnWcPQv24u8WGvthiV6/DYqKgKKu42h+8dkjQIDAQABAoIBAEtY8n1IgKa/19Rn
dGElsybyHjUDGCJ7iiMtqpClFH73RSwrzmqvXdrY3JrH61cS+QphUC3WBQ4bXLhR
xe76IMWbFGQNTbUVTW3OY6tbgNCsOR+eyhbuUGI0nfDqYQsT00AECbtEvn9js7Ej
5MQB/rnwEQFOVm13aWS44Jfsl1HGbjhqDVNIN7H1thj0uHqbA4blwKJrCoG+uiMd
6cjDfWs/iCcfLBQg4GTa/Jt9BU8TV22XIcNcMrfYHerYncvGnZoqiK/J9JOXV1Sl
BA9Q91Q7QiX6lSsI9xv3BDzY7BP0oGLo3/liDvloyx20olb1zFeauOrhdvHsRDCJ
qo2G8sECgYEA8zrOAcVWp/RTLwCPChEyRdOSVkOoLaCEByWtI4vSd+pQ0d+NNyg2
ILPOyR0VGiJNAQU8HQD6w4rjYRCTwdGvQsJIOk+A8YxUkJhgc5yy6KGSJ5bH0NM6
mXHh8cs9KDt3/gs5BF+4G1CdY1/uKSJFHcWnvUUdusHVG1FkwEwe/6MCgYEAwbK4
euh51bIeFNlMDCcqytjhkl2BKnNNwa6FeHrfn9LXovfQh4JF30qygs2jDTd8aNjD
E/lsIbd4bLsrMs0cif9S8Ef1kPpQFb+5N7221gXd2o9O+xjIxQ1wxlWAjSsBZ+uo
eKcpyiEuTWnB5/ntsAZWzzeH2te8kOBVgNXOjg8CgYBTT+EgWifEf7u+bcKRADLo
GAAX7DS+7CxNBmq3sjz1Nh1Yxeno6q0fpnc+C+gee4FEyDY++Qbr07bumG8EBH6z
rzhuQK06D4cnwAnJj/L4G9+kD9GBhdiclpV97M+V6EjBi7aL+P1m3cYLM+Cv1j02
ZW1/Nx1nytzj7o1EEM7NYQKBgDplVTTIzaJdVrBWapTnYgFRrX/g7MYNiQ2xPc/6
y1x1xkj9iUKxRbtx26uPr26Woc1CPF3TPoRTudyd+QIR0F7SOQDz0NbqgCZubLqf
WXXgwufXeKo+6Jhv2uYQdPcaVgwsgdgOHY0wv7LbBXiYYs5Euvsx9KVHkTPkTiLP
UryFAoGBALnsdbIIq9tjwnRFhKFQ8YriMOXbg93oOgE5XD6pi/aMq5QCSOJk6sny
axfPi8UuQ0T8IKQmwVu3JNjQksIEryhErm3hz9Qm1xcd9o29m0/foXfWKUh5vPew
WpYZqv5biSrRTWhMLsDuTC7JgWH5fkfXfnsIASyc3iZ3DUz5qhdd
-----END RSA PRIVATE KEY-----
)KEY";
/* 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 = 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;
void msgReceived(char* topic, byte* payload, unsigned int len);
PubSubClient pubSubClient(awsEndpoint, 8883, msgReceived, wiFiClient);
unsigned long lastPublish;
int msgCount;
void setCurrentTime() {
configTime(3 * 3600, 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));
}
void setup() {
pinMode(RLED, OUTPUT);
Serial.begin(115200); delay(50); Serial.println();
Serial.println("ESP32 AWS IoT Example");
Serial.printf("SDK version: %s\n", ESP.getSdkVersion());
Serial.print("Connecting to "); Serial.print(ssid);
WiFi.begin(ssid, password);
WiFi.waitForConnectResult();
Serial.print(", WiFi connected, IP address: "); Serial.println(WiFi.localIP());
// get current time, otherwise certificates are flagged as expired
sntp_stop(); //speeds up the connection with UDP servers
sntp_init();// speeds up the connection with UDP servers
setCurrentTime();
wiFiClient.setCACert(rootCA);
wiFiClient.setCertificate(certificate_pem_crt);
wiFiClient.setPrivateKey(private_pem_key);
lastPublish = millis();
}
void loop() {
pubSubCheckConnect();
//If you need to increase buffer size, you need to change MQTT_MAX_PACKET_SIZE in PubSubClient.h
char fakeData[128];
float ultrasonic = readUltrasonicDistance();
// sprintf(fakeData, "{\"uptime\":%lu,\"temp\":%f,\"humid\":%f}", millis() / 1000, var1, var2);
sprintf(fakeData, "{\"device_id\":%d,\n\"distance\":%f,\"device_id\":%d,}", device_id, ultrasonic);
if (millis() - lastPublish > 3000) {
boolean rc = pubSubClient.publish("outTopic/distance", fakeData);
Serial.print("Published, rc="); Serial.print( (rc ? "OK: " : "FAILED: ") );
Serial.println(fakeData);
lastPublish = millis();
}
}
void msgReceived(char* topic, byte* payload, unsigned int length) {
String messageTemp="";
Serial.print("Message received on "); Serial.print(topic); Serial.print(": ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageTemp += (char)payload[i];
}
Serial.println();
if (messageTemp == "On") {
digitalWrite(RLED, HIGH);
} else if (messageTemp == "Off") {
digitalWrite(RLED, LOW);
}
}
void pubSubCheckConnect() {
if ( ! pubSubClient.connected()) {
Serial.print("PubSubClient connecting to: "); Serial.print(awsEndpoint);
while ( ! pubSubClient.connected()) {
Serial.print(".");
pubSubClient.connect("ESPthing");
delay(1000);
}
Serial.println(" connected");
pubSubClient.subscribe("inTopic");
}
pubSubClient.loop();
}