ESP32 AWS IoT

Hướng dẫn này sẽ chỉ cho bạn cách sử dụng ESP32 với AWS IoT Core. Cụ thể, chúng ta sẽ học:

ESP32 aws IoT

Phần Cứng Cần Thiết

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×breadboard (bo mạch thí nghiệm)
1×dây jumper (dây nhảy)
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về ESP32 và AWS IoT

ESP32 kết nối với AWS IoT Core bằng giao thức MQTT. Mặc dù có các thư viện hỗ trợ kết nối này, nhưng nó không đơn giản như kết nối với một MQTT broker cục bộ như Mosquitto trên PC của bạn. Điều này là do AWS IoT Core có các biện pháp bảo mật nghiêm ngặt, yêu cầu các bước cấu hình để có được thông tin xác thực và ủy quyền trước khi tích hợp chúng vào code ESP32. Tóm lại, quy trình bao gồm hai bước chính:

  • Bước 1: Cấu hình AWS IoT Core - Điều này bao gồm thiết lập AWS IoT Core để tạo ra các thông tin xác thực cần thiết, sau đó sẽ được sử dụng trong code ESP32.
  • Bước 2: Viết Code ESP32 - Sau khi có được thông tin xác thực từ AWS IoT Core, bước tiếp theo là viết code ESP32, tích hợp các giao thức xác thực và truyền thông cần thiết.

Hãy cùng xem xét kỹ hơn từng bước để hiểu rõ hơn.

Cấu hình AWS IoT Core để sử dụng với ESP32

Mục tiêu của bước này bao gồm:

  • Tạo một đại diện của thiết bị ESP32 trên AWS IoT Core, được gọi là "Thing."
  • Cấu hình quyền ủy quyền cần thiết để cho phép thiết bị ESP32 kết nối, publish và subscribe tới/từ AWS IoT Core, được gọi là "Policy."
  • Tạo thông tin xác thực AWS cần thiết để xác thực, được gọi là "Certificates." Những thông tin này sẽ được tải xuống và tích hợp vào code Arduino ESP32.

Dưới đây là hướng dẫn cấu hình AWS IoT Core để sử dụng với ESP32 qua AWS IoT Console. Lưu ý rằng mặc dù giao diện người dùng có thể thay đổi theo thời gian, quy trình vẫn tương tự như hướng dẫn được cung cấp dưới đây:

  • Đăng nhập vào AWS IoT Console
  • Tạo một Thing bằng cách vào Manage All devices Things
aws IoT creates things
  • Nhấp vào nút Create things.
  • Chọn Create single things và nhấp vào nút Next.
aws IoT core creates things
  • Chỉ định Thing name, ví dụ, ESP32-thing và nhấp vào nút Next ở cuối trang.
aws IoT core thing name
  • Tạo thông tin xác thực bằng cách chọn tùy chọn Auto-generate a new certificate, và nhấp vào nút Next.
aws IoT core generates certificate
  • Bây giờ, một Certificate được tạo và liên kết với Thing.
  • Tạo một policy bằng cách nhấp vào nút Create policy.
aws IoT core create policy
  • Một tab mới sẽ được mở
aws IoT core create policy ESP32
  • Chỉ định Policy name, ví dụ, ESP32-policy và nhấp vào nút JSON.
  • Copy nội dung JSON policy dưới đây và dán vào vùng Policy document:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }
  • Nhấp vào nút Create ở cuối trang để tạo policy.
  • Bây giờ, một Policy được tạo và gắn với Certificate. Đóng trang đó và quay lại trang Thing.
  • Kiểm tra ESP32-policy và nhấp vào nút Create thing để tạo Thing.
aws IoT core creates thing ESP32
  • Một cửa sổ popup xuất hiện cho phép bạn tải xuống các file thông tin xác thực. Tải xuống tất cả các file và lưu trữ chúng ở một vị trí an toàn trên PC của bạn và giữ bí mật.
aws IoT core credentials file
  • Sau đó, nhấp vào nút Done.

Trong số các file đã tải xuống, có ba file sẽ được sử dụng trong code ESP32 ở các bước tiếp theo:

  • AmazonRootCA1.pem
  • xxxxxxxxxx-certificate.pem.crt
  • xxxxxxxxxx-private.pem.key

Những file này có thể được mở bằng bất kỳ trình soạn thảo văn bản nào như Notepad hoặc Notepad++

Viết code ESP32 để kết nối với AWS IoT Core

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-aws-iot */ #include "secrets.h" #include <WiFiClientSecure.h> #include <MQTTClient.h> #include <ArduinoJson.h> #include "WiFi.h" // The MQTT topics that this device should publish/subscribe #define AWS_IOT_PUBLISH_TOPIC "esp32/esp32-to-aws" #define AWS_IOT_SUBSCRIBE_TOPIC "esp32/aws-to-esp32" #define PUBLISH_INTERVAL 4000 // 4 seconds WiFiClientSecure net = WiFiClientSecure(); MQTTClient client = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToAWS(); } void loop() { client.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToAWS(); lastPublishTime = millis(); } } void connectToAWS() { // 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.begin(AWS_IOT_ENDPOINT, 8883, net); // Create a handler for incoming messages client.onMessage(messageHandler); Serial.print("ESP32 connecting to AWS IOT"); while (!client.connect(THINGNAME)) { Serial.print("."); delay(100); } Serial.println(); if (!client.connected()) { Serial.println("ESP32 - AWS IoT Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC); Serial.println("ESP32 - AWS IoT Connected!"); } void sendToAWS() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); // print to client client.publish(AWS_IOT_PUBLISH_TOPIC, messageBuffer); Serial.println("sent:"); Serial.print("- topic: "); Serial.println(AWS_IOT_PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("received:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Các Bước Nhanh

  • Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy xem ESP32 - Cài Đặt Phần Mềm.
  • Mở Library Manager bằng cách nhấp vào biểu tượng Library Manager trên thanh điều hướng bên trái của Arduino IDE
  • MQTT vào hộp tìm kiếm, sau đó tìm thư viện MQTT của Joel Gaehwiler.
  • Nhấp vào nút Install để cài đặt thư viện MQTT.
ESP32 mqtt thư viện
  • ArduinoJson vào hộp tìm kiếm, sau đó tìm thư viện ArduinoJson của Benoit Blanchon.
  • Nhấp vào nút Install để cài đặt thư viện ArduinoJson.
ESP32 json thư viện
  • Copy code trên và dán vào Arduino IDE.
  • Tạo file secrets.h trên Arduino IDE bằng cách:
    • Nhấp vào nút ngay phía dưới biểu tượng serial monitor và chọn New Tab, hoặc sử dụng phím Ctrl+Shift+N.
    Arduino ide 2 adds file
    • Đặt tên file là secrets.h và nhấp vào nút OK
    Arduino ide 2 adds file secrets.h
    • Copy code dưới đây và dán vào file secrets.h vừa tạo.
    #include <pgmspace.h> #define SECRET #define THINGNAME "ESP32-thing" const char WIFI_SSID[] = ""; const char WIFI_PASSWORD[] = ""; const char AWS_IOT_ENDPOINT[] = "xxxxx.amazonaws.com"; // 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";
    • Cập nhật các thông tin sau trong file secrets.h
      • WIFI_SSIDWIFI_PASSWORD của mạng WiFi của bạn
      • AWS_CERT_CA, AWS_CERT_CRT, và AWS_CERT_PRIVATE. Những thông tin này có trong các file bạn đã tải xuống ở bước trước.
      • AWS_IOT_ENDPOINT. Thông tin này có thể tìm thấy trên AWS IoT Console bằng cách vào Setting như hình dưới đây:
      aws IoT endpoint
      • Biên dịch và upload code lên board ESP32 bằng cách nhấp vào nút Upload trên Arduino IDE

Gửi dữ liệu từ ESP32 đến AWS IoT

Code ESP32 trên sẽ định kỳ đọc dữ liệu từ một chân analog và gửi nó đến AWS IoT mỗi 4 giây. Nếu mở Serial Monitor trên Arduino IDE, bạn sẽ thấy log như dưới đây:

COM6
Send
ESP32 connecting to AWS IOT. ESP32 - AWS IoT Connected! sent: - topic: esp32/esp32-to-aws - payload:{"timestamp":12743,"data":0} sent: - topic: esp32/esp32-to-aws - payload:{"timestamp":16745,"data":130}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Để kiểm tra xem dữ liệu có được AWS IoT nhận hay không, thực hiện các bước sau:

  • Trong AWS IoT Console, điều hướng đến Test MQTT Test Client
aws IoT mqtt test client ESP32
  • Nhấp vào nút Subcribe to a topic.
  • esp32/esp32-to-aws vào Topic filter. Bạn có thể thay đổi topic nhưng PHẢI khớp với topic trong code ESP32.
  • Nhấp vào nút Subcribe.
  • Bạn sẽ có thể thấy dữ liệu được gửi từ ESP32 trên AWS IoT Console.

Gửi dữ liệu từ AWS IoT đến ESP32

Bạn có thể gửi dữ liệu từ AWS IoT Console đến ESP32 bằng cách thực hiện các bước sau:

  • Trên Arduino IDE, mở Serial Monitor
  • Trên AWS IoT Console, điều hướng đến Test MQTT Test Client
aws IoT mqtt test client ESP32
  • Nhấp vào nút Publish to a topic.
  • esp32/aws-to-esp32 vào Topic name. Bạn có thể thay đổi topic nhưng PHẢI khớp với topic trong code ESP32.
  • Tùy chọn, bạn có thể thay đổi message payload, hoặc giữ nguyên mặc định.
  • Nhấp vào nút Publish.
  • Kiểm tra Serial Monitor trên Arduino IDE, bạn sẽ thấy tin nhắn được gửi từ AWS IoT Console.
COM6
Send
received: - topic: esp32/aws-to-esp32 - payload: { "message": "Hello from AWS IoT console" }
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Làm nhiều hơn với AWS

Bây giờ, bạn có thể thiết lập giao tiếp hai chiều giữa ESP32 và AWS IoT Core. Điều này có nghĩa là bạn có thể gửi dữ liệu từ ESP32 đến AWS IoT Core và nhận dữ liệu từ AWS IoT Core trên ESP32. Ngoài ra, bạn có khả năng cấu hình IoTRules, cho phép ESP32 kết nối liền mạch với các dịch vụ AWS khác như Lambda, DynamoDB, Amplify và RDS. Với IoTRules, bạn có thể tự động hóa các hành động dựa trên dữ liệu nhận được từ ESP32, cho phép nhiều ứng dụng IoT và tích hợp đa dạng.