#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
#define LEDY 23
const int MotionPin = 5;
int pirState = LOW;
int val = 0;
float value;
unsigned long lastMotionTime = 0;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* hostname = "broker.hivemq.com";
const char* awsEndpoint = "ag7cc3kif06xk-ats.iot.us-east-1.amazonaws.com";
const char* certificate_pem_crt = R"KEY(
-----BEGIN CERTIFICATE-----
MIIDWTCCAkGgAwIBAgIUdO/xNfVmN5TNF5XT7krI7f02SOUwDQYJKoZIhvcNAQEL
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTIzMDgxNjE3MDgy
MloXDTQ5MTIzMTIzNTk1OVowHjEcMBoGA1UEAwwTQVdTIElvVCBDZXJ0aWZpY2F0
ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMq7ckwb2RQlaejxTv89
O9Gn3AMvntC8juKX0g1/IxgkCGp024m4AvRjATYAYfo5CUs6HTAkjG6Ca4lupuKc
FX2+1w1xJ6rW629n83uqdqnhnW47DL/RI3I07wkgb6r880MBXFdsEQogRak6rclR
xGGg8T+flDgmKCHX9EtmARZWI7YGkVUp59aRXMwGeoopYfSXyjoJ4rszoVm5XAXP
ajr3f6yoO3izbz8FTsda9V+btxF+LOqK3WY1AorfwQG9pUFYSmmZLKxp+5HWHrIM
UXpBc+TYiKG4PzV8BkyBIm5GweNyvAfwxf2fOnJwbXN3Y7HYh4QVqklhbFnQCPUJ
190CAwEAAaNgMF4wHwYDVR0jBBgwFoAU4LjRJD76SINTCSEFROr1bGgG4pYwHQYD
VR0OBBYEFA316fecEdre0t/sMedybeq+yR3/MAwGA1UdEwEB/wQCMAAwDgYDVR0P
AQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQBGJc0sqeS6DztAA3X0bu9v5kaH
oyi3IKE0m/2qG9eMG9+028an36nfOeX0MI0rfMNrrpozzsegAtb7h0jOc6zLmLEE
iIFIA/eHHf6gzV12j7m97yjldv1QJb0cy76XkUNu2orkn47UgjRNyKK6dLPxCAuk
MRfXvZlElZOvTHFXUcQsQQfD9PW5i6D9OnCWHF1Jctmq+4vMGFMmQCBzsFCyS6gO
LckA9RfgXj3DaqdZbYjVmHD3MmQsJczAIPkfuED37m21ha6+q7fqsR3h76UKwBer
ZQs5I+mIRtgQxQX60aKAGwng+qQo/h6idY4FhJseW6cq/nvYOKMHuTCaFibt
-----END CERTIFICATE-----
)KEY";
// xxxxxxxxxx-private.pem.key
const char* private_pem_key = R"KEY(
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyrtyTBvZFCVp6PFO/z070afcAy+e0LyO4pfSDX8jGCQIanTb
ibgC9GMBNgBh+jkJSzodMCSMboJriW6m4pwVfb7XDXEnqtbrb2fze6p2qeGdbjsM
v9EjcjTvCSBvqvzzQwFcV2wRCiBFqTqtyVHEYaDxP5+UOCYoIdf0S2YBFlYjtgaR
VSnn1pFczAZ6iilh9JfKOgniuzOhWblcBc9qOvd/rKg7eLNvPwVOx1r1X5u3EX4s
6ordZjUCit/BAb2lQVhKaZksrGn7kdYesgxRekFz5NiIobg/NXwGTIEibkbB43K8
B/DF/Z86cnBtc3djsdiHhBWqSWFsWdAI9QnX3QIDAQABAoIBAC45hTsjUmDMkxSB
CPEbpisMqhaz4fNYOwAhe8yGA5t6g8y6LmB9a3cLp/gHKE/kd2EGtCcI/lgoNprU
dwrOafwM6n3vIgtLC82QFy1IVdwwTDQZFLQb3Igq16HuGmgTWugZRFPOmSgE6b1H
Wt6/XRahmsBWA3a2BIqK8fHLJU5RFzsbOrlT7H5rlWo1DDpdSUuHFSPj0H3KDaYf
zuPabX/mClDSno8+miesfhTZauVKUElfEkVCuRdG3W2tFDrNQkd/AYUtWAbAJ7yO
hKsgo5mw8z3Y2ViCdRTDQuaxscFvpjydEwW8qEZ72/u/qZyA+KYD9xbype6abLEd
rt3oK2ECgYEA/hnrlAC2tlCap1xYWrFpfr0SDNnNW/lf7L4WPgxNM04RQ2dpPGi5
vAVt1eE5clKXTt5O82pIYUY7QPUbgM5bD472jTr+zj/TWI59zFpFYdpbxfq22i7u
vGu/p8EkmkKsD5WxvBKdpJ4JLNPFsWbbJarEq/VUuBPc2I0YWfSYRUkCgYEAzD9C
r9Dz2yf6PZ7I3BD7/dwm+PXvQW6Bf/Ed6teVEhHB9rwopmQFZO2Vhf+3m5JIGhWg
RCJX7YUjsyabZKRcWO9DYZesqX50KMhoSNuikeh9/8GqLx5zaeRNI3UqZYt3eqwg
oracXlNnNPpp4nkUJRnlFgwGklo+Bg8url/4QfUCgYEAi+nN04LJGH4tifXJGLcT
dZu58qWC9B/N99d6+9NeNt/Hlau9QGwRyTvcDKalMRPVCLJUGqftDtLTEaNk73mw
nlKD46QWZY6zWtGq5vjVt1m6qrqwMFcjUVCrCT3KX75Sa4prgTlm4Bu8xZgeBN6z
0HvFK0I80dbuBbc7L10E8zECgYB7NiJVi5i/+VLlP1duIjTRxLAh+cKWV0J52wuw
MtLzrpCy9nkTPz1d0FEmH8g0aj9itO8Uix894tZRaZXOVbR71gJw6h23tdf/Dj6S
zSQ6HuV7lunCOP1owNej7zdfQI4YC6Q4ZC7aXDfjZrjfbSkw5HklHqYMPbIy14/S
k4RgzQKBgBNrP5l/8xinVM7oVuA4KkplmRnX4O11wZXKM+CPLcDETWsJwpUXHT7R
z6plO8KDKO0b+tZkGwAvPjOL7LvG2IyrRAuF+K7XS6I2vc7Rfr/+cM4222Hsc0fQ
WuS42JYHnbKBB006em9RHgfMvfxGPh8iK7Q0zQ8fI0nrtxBo62eW
-----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);
WiFiClient mqttClient;
PubSubClient client(mqttClient);
const char* mqttClientName = "mqttClient_melvyn";
int PORTNUM = 1883;
unsigned long lastPublish;
int msgCount;
void setup_wifi()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED )
{
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("Given IP by the router to ESP32 is ");
Serial.println(WiFi.localIP());
}
void connectMQTT()
{
while (!client.connected() )
{
Serial.println("Connecting to MQTT ...");
if (client.connect(mqttClientName) ) //, mqttUser, mqttPassword) )
{
Serial.println("Connected");
MQTTSubscribe();
}
else
{
Serial.print("Failed with state ");
Serial.print(client.state() );
delay(2000);
}
}
}
//void callback(String topic, byte* payload, unsigned int length)
//{
// String messageTemp;
// Serial.print("Message received in topic: ");
// Serial.print(topic);
// Serial.print(" length is: ");
// Serial.println(length);
// Serial.print("Data received from broker: ");
// for (int i = 0; i < length; i++)
// {
// Serial.print( (char)payload[i] );
// messageTemp += (char)payload[i];
// }
// if (topic == "IoT/pa31/s10222777")
// {
// if (messageTemp == "0")
// {
// digitalWrite(LEDR, LOW);
// }
// else
// {
// digitalWrite(LEDR, HIGH);
// }
// }
//}
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(LEDY, LOW);
//} else if (messageTemp == "off"){
// digitalWrite(LEDY, HIGH);
//}
}
void MQTTSubscribe()
{
//client.subscribe("IoT/pa31/s10222777/motion");
//client.subscribe("IoT/pa31/s10222777/temperature");
}
void setup_MQTT()
{
client.setServer(hostname, PORTNUM);
//client.setCallback(callback);
}
void setup() {
Serial.begin(115200);
setup_wifi();
setup_MQTT();
pinMode(MotionPin, INPUT);
pinMode(LEDY, OUTPUT);
wiFiClient.setCACert(rootCA);
wiFiClient.setCertificate(certificate_pem_crt);
wiFiClient.setPrivateKey(private_pem_key);
}
void loop() {
if ( !client.connected() )
{
connectMQTT();
}
client.loop();
char motionchar[8];
val = digitalRead(MotionPin);
if (val == HIGH) {
digitalWrite(LEDY, HIGH);
value = 1;
if (pirState == LOW) {
Serial.println("Motion detected!");
pirState = HIGH;
lastMotionTime = millis();
}
}
if (val == LOW) {
digitalWrite(LEDY, LOW);
value = 0;
if (pirState == HIGH && millis() - lastMotionTime >= 2000) {
Serial.println("Motion reset!");
pirState = LOW;
}
}
itoa(value, motionchar, 10);
client.publish("IoT/pa31/s10222777/motion", motionchar);
pubSubCheckConnect();
char fakeData[128];
sprintf(fakeData, "{\"motion\":%2.f,\"timestamp\":%lu,}", value, millis() / 1000);
if (millis() - lastPublish > 2000) {
boolean rc = pubSubClient.publish("outTopic", fakeData);
Serial.print("Published, rc="); Serial.print( (rc ? "OK: " : "FAILED: ") );
Serial.println(fakeData);
lastPublish = millis();
}
//Serial.print("Distance: ");
//Serial.print(rotatoryvalue);
//Serial.println("cm");
}
void pubSubCheckConnect() {
if ( ! pubSubClient.connected()) {
Serial.print("PubSubClient connecting to: "); Serial.print(awsEndpoint);
while ( ! pubSubClient.connected()) {
Serial.print(".");
pubSubClient.connect("ProjectIoT");
delay(1000);
}
Serial.println(" connected");
pubSubClient.subscribe("inTopic");
}
pubSubClient.loop();
}