Připojení ESP32 k Amazon AWS IoT Core pomocí MQTT

24.11.2023 Arduino #aws #iot #esp32 #mqtt #mbe280

Podrobný návod jak využívat službu AWS IoT Core pro příjem dat z ESP32. Postup nastavení služby a příprava pro vizualizaci dat pomocí AWS Analytics a Quick Sight. Využijeme k tomu kombinace ESP32 a senzoru BME280 od Laskakit.


Co je AWS IoT Core?

AWS IoT Core je cloudová služba, která umožňuje připojeným zařízením komunikovat s cloudovými aplikacemi a dalšími zařízeními. Může podporovat velké množství zpráv a dokáže tyto zprávy zpracovat a směrovat do koncových bodů AWS a do dalších zařízení spolehlivě a bezpečně.

AWS IoT Core umožňuje vytvářet aplikace, které pracují na datech generovaných připojenými zařízeními. Tyto aplikace mohou být hostovány v cloudu, což umožňuje webový přístup k těmto službám, čímž se zvyšuje škálovatelnost, dostupnost a údržba systémů IoT.

AWS IoT Core je zvláště užitečné v případech použití IoT, kdy zařízení potřebují komunikovat mezi sebou a cloudem, ale nemají možnost přímo interagovat s backendovými službami. AWS IoT Core funguje jako komunikační centrum mezi těmito zařízeními a backendovými službami, které řeší všechny složitosti souběžné komunikace, směrování zpráv, zabezpečení, autorizace a zpracování chyb.

AWS nabízí služby a řešení internetu věcí (IoT) pro připojení a správu miliard zařízení. Tyto cloudové služby propojují vaše IoT zařízení s jinými zařízeními a cloudovými službami AWS. AWS IoT poskytuje software zařízení, který vám může pomoci integrovat vaše IoT zařízení do řešení založených na AWS IoT. Pokud se vaše zařízení mohou připojit k AWS IoT, AWS IoT je může připojit ke cloudovým službám, které AWS poskytuje.

AWS IoT umožní vybrat nejvhodnější a nejaktuálnější technologie pro vaše řešení. Abychom vám pomohli spravovat a podporovat vaše IoT zařízení v terénu, AWS IoT Core podporuje tyto protokoly:

  • MQTT (Řezení zpráv a přenos telemetrie)
  • MQTT přes WSS (Websockets Secure)
  • HTTPS (Hypertext Transfer Protocol – Secure)
  • LoRaWAN (Síť dlouhého dosahu Wide Area Network)

Klíčové vlastnosti AWS IoT Core

1. Komunikace zařízení: protokoly MQTT, HTTP a WebSocket

Jedním z kritických aspektů jakékoli služby IoT je komunikační protokol. AWS IoT Core podporuje tři hlavní protokoly: MQTT, HTTP a WebSocket. MQTT (Message Queuing Telemetry Transport) je tenký protokol pro zasílání zpráv určený pro omezená zařízení a sítě s nízkou šířkou pásma, vysokou latencí nebo nespolehlivé sítě. HTTP a WebSockets jsou standardní webové protokoly, které mohou zařízení používat k odesílání a přijímání dat z AWS IoT Core.

Podpora těchto protokolů zajišťuje, že vaše zařízení mohou komunikovat s AWS IoT Core, bez ohledu na jejich schopnosti nebo podmínky sítě. Tato funkce je klíčová při vytváření všestranných a odolných systémů IoT, které mohou bezproblémově fungovat za různých podmínek.

2. Služba zabezpečení a identity: Autentizace a šifrování

Robustní služby zabezpečení a identity zajišťují, že všechna data zařízení jsou přenášena bezpečně a že se k vašim zařízením nemohou připojit neautorizovaná zařízení nebo aplikace. AWS IoT Core využívá vzájemnou autentizaci a šifrování ve všech bodech připojení, což zajišťuje, že nikdy nedojde k výměně dat mezi zařízeními a AWS IoT Core bez prokázané identity.

AWS navíc poskytuje jemné řízení přístupu k vašim prostředkům IoT pomocí AWS Identity and Access Management (IAM). Tím zajistíte, že vaše prostředky budou přístupné pouze ověřeným uživatelům nebo zařízením s potřebnými oprávněními.

3. Stavy zařízení: Ukládání a načítání stavu zařízení

Funkce Device Shadow v AWS IoT Core je dokument JSON používaný k ukládání a načítání aktuálního stavu zařízení. Tento dokument umožňuje aplikacím číst a zapisovat do polí stínu zařízení, což poskytuje spolehlivý způsob sledování stavu zařízení v průběhu času. To znamená, že i když je vaše zařízení offline, můžete nastavit požadovaný budoucí stav a zařízení se synchronizuje, když se znovu připojí.

4. Modul pravidel: Zpracování a směrování dat IoT

Modul Rules Engine je služba v rámci AWS IoT Core, která umožňuje zpracování a směrování dat ze zařízení IoT. Modul vyhodnocuje příchozí zprávy publikované do AWS IoT Core a transformuje je a doručuje je do jiného zařízení nebo cloudové služby na základě obchodních pravidel, která definujete.

Pomocí modulu Rules Engine můžete za běhu filtrovat, transformovat a reagovat na data zařízení na základě obchodních pravidel, která definujete. Data můžete směrovat do služeb AWS, jako je AWS Lambda, Amazon DynamoDB, Amazon S3, Amazon Kinesis, Amazon SNS a mnoho dalších.

5. Registr: Uspořádejte a indexujte zařízení

Registr v AWS IoT Core vám umožňuje kategorizovat zařízení do hierarchické struktury na základě funkce, požadavků na zabezpečení nebo jakékoli jiné kategorie, která vyhovuje vašim potřebám. Registr vám také umožňuje sledovat metadata, jako jsou atributy a možnosti zařízení.

6. Device Defender: Zabezpečení zařízení IoT

A konečně, Device Defender je bezpečnostní funkce v AWS IoT Core, která nepřetržitě monitoruje vaši flotilu zařízení kvůli abnormálnímu chování. Umožňuje vám udržovat a vynucovat konfigurace IoT, jako je identita zařízení, ověřování a řízení přístupu, a zajišťuje, že vaše zařízení zůstanou v souladu se zásadami zabezpečení.

Hlavní případy použití AWS IoT Core

Průmyslová automatizace

AWS IoT Core umožňuje podnikům připojit jejich stroje a zařízení ke cloudu, což umožňuje vzdálené monitorování a analýzu dat v reálném čase. Tento přístup založený na datech snižuje prostoje předvídáním poruch zařízení a plánováním preventivní údržby. AWS IoT Core navíc zvyšuje provozní efektivitu automatizací procesů a omezením lidských chyb.

Automatizace domácnosti

AWS IoT Core nabízí výkonné nástroje pro vytváření zařízení pro chytrou domácnost. Umožňuje připojení různých zařízení, jako jsou chytré termostaty, osvětlovací systémy, zabezpečovací systémy a spotřebiče, k internetu, což umožňuje majitelům domů je ovládat na dálku.

Nositelná zařízení

Nositelná zařízení jako fitness trackery, chytré hodinky a monitory zdraví jsou v posledních letech stále populárnější. AWS IoT Core hraje významnou roli ve funkčnosti těchto zařízení. Usnadňuje výměnu dat mezi nositelným zařízením a cloudem a umožňuje sledování zdraví v reálném čase, sledování kondice a personalizované statistiky. Zabezpečený přenos dat zajišťuje ochranu osobních údajů uživatele.

Smart Cities

AWS IoT Core může být nápomocný při budování chytrých měst. Umožňuje připojení různých městských služeb a infrastruktury k internetu, což usnadňuje monitorování a analýzu dat v reálném čase. Tato provázanost může vést ke zlepšení veřejných služeb, zvýšení veřejné bezpečnosti, snížení dopadu na životní prostředí a celkově ke zlepšení kvality života obyvatel města.

Sledování aktiv

V odvětví logistiky a dodavatelského řetězce se AWS IoT Core používá pro sledování aktiv. Umožňuje sledování zboží v reálném čase a poskytuje podnikům cenné informace o jejich zásobách a operacích dodavatelského řetězce. Tato viditelnost pomáhá podnikům zlepšit jejich provoz, snížit náklady a poskytovat lepší služby zákazníkům.

Začínáme s Amazon AWS IoT Core s ESP32

Začít s jádrem AWS IoT je velmi jednoduché. Chcete-li úspěšně nastavit desku ESP32 a začít s vaším úplně prvním projektem, stačí provést následující kroky uvedené níže.


Přihlašování

Přejděte do webového prohlížeče a vyhledejte následující odkaz: aws.amazon.com/iot-core/.

V zásadě musíme nyní nastavit účet AWS. Vytvořte si proto účet pomocí e-mailového ID a hesla. Účet také vyžaduje informace o vaší bankovní kreditní kartě. Nebudou účtovány žádné poplatky, ale AWS potřebuje pouze ověření pomocí vašeho bankovního účtu. Požádá také o ověření telefonního čísla. Účet bude tedy úspěšně vytvořen.

AWS IoT Core Dashboard

Po úspěšném přihlášení se otevře okno AWS Management Console. Na kartě vyhledávání služeb nahoře napište „IoT Core“ a stiskněte Enter.

Můžete kliknout na IoT Core, takže se nyní zobrazí AWS IoT Dashboard.

Na levé straně palubní desky je tolik možností. Zde ale musíme pracovat se dvěma možnostmi. Jedna je možnost správy a druhá možnost zabezpečení .


Vytvoření zařízení

Nyní musíme vytvořit zařízení spojené s naším projektem. Postupujte podle následujících kroků:

  • Určení vlastností zařízení
  • Konfigurace certifikátu zařízení
  • Připojení zásad k certifikátu

Pod možností All devices klikněte na Thing. Nyní zde musíme vytvořit zařízení. Klikněte zde tedy na Create Thing. NA obrazovce můžete také vidět již registrovaná zařízení.

Můžete si vybrat, zda vytvořit jedno zařízení nebo vytvořit více zařízení. Ale pro naše aplikace vyberte vytvořit jedinou věc. Poté klikněte na Next.

Nastavení vlastností zařízení

Zde musíme specifikovat vlastnosti Thing. Nejprve pojmenujte zařízení. Můžete ho pojmenovat jakkoli. Například to pojmenuji ESP32_BME280.

V rámci dalších konfigurací není třeba provádět žádné změny.

Pod možností Device Shadow vyberte první možnost jako No shadow. Poté klikněte na Next.

Vygenerujte certifikát zařízení

Nyní musíte nakonfigurovat certifikát zařízení. Zde můžete automaticky vygenerovat nový certifikát nebo použít vlastní certifikát nebo nahrát CSR nebo toto přeskočit.

Doporučení AWS je však vybrat Auto Generate New Certificate. Poté klikněte na Next.

Vytvořit a připojit zásady

Nyní musíme k věcem, které jsme vytvořili, připojit politiku. Pokud žádné zásady dosud nebyly vytvořeny musíme vytvořit nové. Klikněte na Create Policy.

Klikněte tedy na Create Policy. Zde uveďte libovolný název zásady, např. ESP32_Policy.

Nyní je velmi důležitá část. V sekci Policy document, musíme nastavit povolené akce pro IoT.

V polo Policy effect, vyberte zda akce Policy action bude povolena Allow nebo nikoliv. Takže vyberte Allow a z akcí vyberte možnost. iot:Connect. Do pole Policy resource zadejte hvězdičku (*). Stiskněte tlačítko Add new statement pro přidání další akce a přidejte iot:Publish, iot:Receive a iot:Scubscribe.

Nyní klikněte na Create pro vytvoření zásady. Takže politika byla úspěšně vytvořena.

Nyní se vraťte k možnosti Create Thing. Objeví se vytvořená politika. K certifikátu musíme připojit zásady. Vyberte tedy zobrazenou zásadu a klikněte na Create thing.

Stažení certifikátů a klíčů

Nyní musíme z tohoto seznamu stáhnout požadované certifikáty.

Nejprve stáhněte Device certificate a poté jej přejmenujte na certifikát zařízení pro identifikaci.

Také si stáhněte Public key a přejmenujte jej na veřejný klíč. Poté si stáhněte Private key a přejmenujte jej na soukromý klíč.

V části Certifikáty kořenové CA jsou dva certifikáty. Potřebujeme však pouze kořenový certifikát CA1, takže si jej stáhněte také.

Určitě vás systém donutí stáhnout také certifikát veřejný, ale ten se dále nepouzžije.

Zdrojový kód pro připojení AWS IoT Core s ESP32

Kód, který propojuje ESP32 se senzorem MBE280 a připojuje se k Amazon AWS IoT Core, je napsán v PlatfomIO. Kód je rozdělen do dvou souborů. Jeden je main.cpp soubor a druhý hlavičkový soubor secret.h.

Soubor main.cpp

#include "secrets.h"
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <ArduinoJson.h>
#include <Adafruit_BME280.h>
#include <time.h>



#define SEALEVELPRESSURE_HPA (1013.25)
#define CORRECT_TEMP (0.40)

String temp;
String hum;
String press;
String alt;

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = 3600;
String dateStamp;


#define AWS_IOT_PUBLISH_TOPIC   "esp32/pub"
#define AWS_IOT_SUBSCRIBE_TOPIC "esp32/sub"


WiFiClientSecure net = WiFiClientSecure();
PubSubClient client(net);

Adafruit_BME280 bme;  // I2C

void messageHandler(char* topic, byte* payload, unsigned int length){
  Serial.print("incoming: ");
  Serial.println(topic);
 
  StaticJsonDocument<200> doc;
  deserializeJson(doc, payload);
  const char* message = doc["message"];
  Serial.println(message);
}

void connectAWS(){
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
 
  Serial.println("Connecting to Wi-Fi");
 
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
 
  // Configure WiFiClientSecure to use the AWS IoT device credentials
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);
 
  // Connect to the MQTT broker on the AWS endpoint we defined earlier
  client.setServer(AWS_IOT_ENDPOINT, 8883);
 
  // Create a message handler
  client.setCallback(messageHandler);
 
  Serial.println("Connecting to AWS IOT");
 
  while (!client.connect(THINGNAME))
  {
    Serial.print(".");
    delay(100);
  }
 
  if (!client.connected())
  {
    Serial.println("AWS IoT Timeout!");
    return;
  }
 
  // Subscribe to a topic
  client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC);
 
  Serial.println("AWS IoT Connected!");
}

void publishMessage(){
  StaticJsonDocument<200> doc;
  doc["datetime"] = dateStamp;
  doc["humidity"] = hum;
  doc["temperature"] = temp;
  doc["pressure"] = press;
  doc["altitude"] = alt;
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // print to client
 
  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}

String getValLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
  }
  /*
  // Format date https://www.ibm.com/docs/en/i/7.3?topic=functions-strftime-convert-datetime-string
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  Serial.print("Day of week: ");
  Serial.println(&timeinfo, "%A");
  Serial.print("Month: ");
  Serial.println(&timeinfo, "%B");
  Serial.print("Day of Month: ");
  Serial.println(&timeinfo, "%d");
  Serial.print("Year: ");
  Serial.println(&timeinfo, "%Y");
  Serial.print("Hour: ");
  Serial.println(&timeinfo, "%H");
  Serial.print("Hour (12 hour format): ");
  Serial.println(&timeinfo, "%I");
  Serial.print("Minute: ");
  Serial.println(&timeinfo, "%M");
  Serial.print("Second: ");
  Serial.println(&timeinfo, "%S");
  */
  char dt[100];
  strftime(dt,sizeof(dt),"%Y-%m-%d %H:%M:%S", &timeinfo);

  return dt;
}
void setup() {
  Serial.begin(9600);
  connectAWS();
  bool status = bme.begin(0x77);  // OR 0x76 for left pad on board
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!");
    while (1);
  }

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

void loop() {
  dateStamp = getValLocalTime();

  //Serial.setTimeout(2000);

  temp=String(bme.readTemperature()-CORRECT_TEMP);
  hum=String(bme.readHumidity());
  press=String(bme.readPressure()/100.0F);
  alt=String(bme.readAltitude(SEALEVELPRESSURE_HPA));

  Serial.print("DateTime: ");
  Serial.println(dateStamp); 
  Serial.print("Temperature: ");
  Serial.println(temp);
  Serial.print("Humidity: ");
  Serial.println(hum);
  Serial.print("Pressure: ");
  Serial.println(press);
  Serial.print("Altitude: ");
  Serial.println(alt);

  publishMessage();
  client.loop();
  delay(5000);
}

Soubor secret.h

#include <pgmspace.h>
 
#define SECRET
#define THINGNAME "ESP32_BME280"                         
 
const char WIFI_SSID[] = "********";               
const char WIFI_PASSWORD[] = "********";           
const char AWS_IOT_ENDPOINT[] = "********";       
 
// Amazon Root CA 1
static const char AWS_CERT_CA[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----

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

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

-----END RSA PRIVATE KEY-----
)KEY";

Úprava Arduino Sketch podle Věci

Nyní se musí upravit soubor secrets.h a doplnit do něj konkrétní hodnoty z AWS.

V první řadě se musí doplnit Thing Name.

#define THINGNAME "ESP32_BME280" 

Název naleznete v seznamu zařízení.

Pod SSID a heslo WiFi zadejte SSID WiFi a heslo vaší místní sítě.

const char WIFI_SSID[] = "********";               
const char WIFI_PASSWORD[] = "********";   

Nyní se musí vložit AWS IoT Endpoint. Chcete-li získat koncový bod, přejděte do části nastavení AWS Dashboard.

Kliknutím na ikonu kopírování zkopírujete koncový bod. Vraťte se do kódu a vložte jej na následující řádek.

const char AWS_IOT_ENDPOINT[] = "********";   

Mezi následující řádek musíte vložit certifikát Amazon Root CA1.

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

-----END CERTIFICATE-----
)EOF";

Za tímto účelem se musíme vrátit k certifikátu, který jsme si stáhli dříve. Otevřete tento soubor a zkopírujte veškerý text. Poté se vraťte ho vložte zkopírovaný text mezi značky BEGIN CERTIFICATE a END CERTIFICATE.

Tímto způsobem se musí vložit i DEVICE CERTIFICATE a PRIVATE CERTIFICATE.

Testování publikování a odběru dat

Po dokončení všech úprav připojte ESP32 k počítači. Nahrajte kód na desku ESP32.

Pokud je vše v pořádku, tak by mělop být navázáno spojení se službou AWS a měli by se zobrazovat naměřené hodnoty v seriovém monitoru.

Přihlášení senzorových dat k AWS Dashboard

Totéž by mělo být zasláno také na server AWS. Chcete-li to zkontrolovat, přejděte do testovací části AWS Dashboard. V testovací sekci je možnost přihlásit se k odběru a publikování.

Pokud chcete otestovat, zda se data posílají do služby AWS, zadejte do pole Topic Filter téma esp32/pub. Můžete také nastavit dodatečnou konfoguraci. Následně klikněte na tlačítko Subscribe.

Data budou hned nahrávána do ASW.

Data se zde aktualizují v intervalu každé jedné sekundy. Jsme schopni přijímat data do AWS IoT Core Dashboardsent z ESP32 prostřednictvím protokolu MQTT.

Publikování dat na Serial Monitor

Nyní se podívejme, zda jsme schopni publikovat data z jádra AWS IoT do ESP32.

Chcete-li nyní data zobrazit, musíte je publikovat k určitému tématu. Pro tento typ zadejte "esp32/sub" v sekci Topic name. Poté klikněte na publikovat.

Okamžitě můžete vidět zprávu odeslanou na Serial Monitor.

Takto můžete odesílat nebo přijímat data z Amazon AWS IoT Core pomocí ESP32. Pomocí AWS MQTT se můžeme přihlásit k odběru témat měření senzorů publikovaných různými uzly internetu věcí