#include
"Arduino.h"
#include
"aws_certificate.h"
#include
"aws_parameter.h"
#include
"wifi_credential.h"
#include
<WiFiNINA.h>
#include
<ArduinoECCX08.h>
#include
<ArduinoBearSSL.h>
#include
<MQTTClient.h>
#include
<ArduinoJson.h>
WiFiClient wifiClient;
BearSSLClient client(wifiClient);
MQTTClient clientMQTT
=
MQTTClient(
256
);
void
messageCallback(String
&
topic, String
&
payload);
bool manageAWSConnection();
bool manageAWSSubscription();
bool publishMessage();
unsigned
long
getTime() {
return
WiFi.getTime();
}
void
setup
()
{
Serial.begin
(
115200
);
while
(
!
Serial){}
Serial.flush
();
Serial.println
();
if
(
!
ECCX08.begin()) {
Serial.println
(
"No ECCX08 present!"
);
while
(
1
);
}
ArduinoBearSSL.onGetTime(getTime);
client.setEccSlot(
0
, (
const
char
*
)AWS_CERT_CRT);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print
(
"Connecting to "
);
Serial.print
(WIFI_SSID);
Serial.println
(
""
);
int
i
=
0
;
while
(WiFi.status()
!
=
WL_CONNECTED) {
delay
(
1000
);
Serial.print
(
+
+
i);
Serial.print
(
'.'
);
}
Serial.println
(
'\n'
);
Serial.println
(
"Connection established!"
);
Serial.print
(
"IP address:\t"
);
Serial.println
(WiFi.localIP());
if
(manageAWSConnection()){
manageAWSSubscription();
}
}
unsigned
long
lastSendingTime
=
millis
();
unsigned
long
sendMessageEveryMillis
=
5000
;
void
loop
()
{
clientMQTT.
loop
();
if
(lastSendingTime
+
sendMessageEveryMillis<
millis
()){
publishMessage();
lastSendingTime
=
millis
();
}
}
bool manageAWSConnection(){
clientMQTT.begin(AWS_IOT_ENDPOINT,
8883
, client);
clientMQTT.onMessage(messageCallback);
Serial.print
(
"Connecting to AWS IOT"
);
while
(
!
clientMQTT.connect(THINGNAME)) {
Serial.print
(
"."
);
delay
(
100
);
}
if
(
!
clientMQTT.connected()){
Serial.println
(
"AWS IoT Timeout!"
);
return
false
;
}
return
true
;
}
bool manageAWSSubscription(){
if
(clientMQTT.subscribe(AWS_IOT_SUBSCRIBE_TOPIC)){
Serial.println
(
"AWS IoT Connected!"
);
return
true
;
}
else
{
Serial.print
(
"AWS IoT ERROR: "
);
Serial.println
(clientMQTT.lastError());
return
false
;
}
}
void
messageCallback(String
&
topic, String
&
payload) {
Serial.println
(
"incoming: ["
+
topic
+
"]"
);
Serial.println
(
"---------------------------"
);
StaticJsonDocument<
200
> doc;
deserializeJson(doc, payload);
serializeJsonPretty(doc, Serial);
Serial.println
();
Serial.println
(
"---------------------------"
);
}
bool publishMessage()
{
DynamicJsonDocument doc(
512
);
doc[
"time"
]
=
millis
();
doc[
"deviceName"
]
=
"Arduino SAMD"
;
doc[
"status"
]
=
"OK"
;
char
jsonBuffer[
512
];
serializeJson(doc, jsonBuffer);
Serial.print
(
"Message on "
);
Serial.print
(AWS_IOT_PUBLISH_TOPIC);
Serial.print
(
" topic... "
);
if
(clientMQTT.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer)){
Serial.println
(
"Published!"
);
return
true
;
}
else
{
Serial.println
(
"Error!"
);
return
false
;
}
}