ESP8266 AWS IoT

Hướng dẫn này chỉ dẫn cho bạn cách sử dụng ESP8266 với AWS IoT Core. Cụ thể, chúng ta sẽ trình bày chi tiết các chủ đề sau:

Bằng cách làm theo các bước này, bạn sẽ có được sự hiểu biết toàn diện về cách tích hợp ESP8266 với AWS IoT Core để giao tiếp liền mạch.

ESP8266 NodeMCU aws IoT

Phần cứng cần chuẩn bị

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
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
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

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

Về ESP8266 và AWS IoT

ESP8266 thiết lập kết nối với AWS IoT Core thông qua giao thức MQTT. Mặc dù có sẵn các thư viện để đơn giản hóa kết nối này, nó phức tạp hơn so với việc kết nối tới một broker MQTT cục bộ như Mosquitto trên máy tính của bạn. Sự phức tạp này bắt nguồn từ các biện pháp bảo mật nghiêm ngặt của AWS IoT Core, đòi hỏi các bước cấu hình để có được thông tin xác thực và quyền ủy quyền cho việc tích hợp vào mã ESP8266. Về bản chất, quá trình này bao gồm hai bước chính:

  • Cấu hình AWS IoT Core: Bước này cấu hình AWS IoT Core để tạo ra các thông tin xác thực cần thiết, các thông tin này sau đó sẽ được tích hợp vào mã ESP8266.
  • Viết mã ESP8266: Sau khi nhận được các thông tin xác thực từ AWS IoT Core, bước tiếp theo là viết mã cho ESP8266. Mã này tích hợp các giao thức xác thực và giao tiếp thiết yếu để tương tác liền mạch với AWS IoT Core.

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

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

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

  • Tạo một đại diện cho thiết bị ESP8266 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ị ESP8266 kết nối tới AWS IoT Core, xuất bản và đăng ký nhận từ AWS IoT Core, được gọi là "Policy".
  • Tạo các chứng chỉ AWS cần thiết cho xác thực, được gọi là "Chứng chỉ". Các chứng chỉ này sẽ được tải xuống và tích hợp vào mã Arduino ESP8266.

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

  • Đăng nhập vào AWS IoT Console
  • Tạo một thiết bị bằng cách đi tới Quản lý Tất cả các thiết bị Các thiết bị
aws IoT tạo các thiết bị.
  • Nhấp vào nút Tạo các mục.
  • Chọn Tạo một mục và nhấp vào nút Tiếp theo.
aws IoT core tạo các thiết bị.
  • Xác định Tên thiết bị, ví dụ, ESP8266-thing và nhấp nút Tiếp theo ở cuối trang.
tên thiết bị aws IoT core
  • Tạo chứng chỉ bằng cách chọn Tự động tạo một chứng chỉ mới tùy chọn, và nhấn nút Tiếp theo.
aws IoT core tạo chứng chỉ
  • Bây giờ, một Certificate được tạo và liên kết với Thing.
  • Tạo một chính sách bằng cách nhấn nút Create policy.
aws IoT core: tạo chính sách
  • Một tab mới sẽ được mở
aws IoT core tạo chính sách ESP8266 NodeMCU
  • Chỉ định tên chính sách, ví dụ, ESP8266-policy và nhấp vào nút JSON.
  • Sao chép nội dung chính sách JSON ở bên dưới và dán vào khu vực Tài liệu chính sách:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }
  • Nhấp vào nút Tạo ở cuối trang để tạo chính sách.
  • Bây giờ, một Chính sách được tạo và gắn với Chứng chỉ. Đóng trang đó và quay lại trang thiết bị.
  • Kiểm tra ESP8266-policy và nhấn nút Tạo thiết bị để tạo thiết bị.
aws IoT core tạo thiết bị ESP8266 NodeMCU
  • Một cửa sổ bật lên xuất hiện cho phép bạn tải xuống các tệp tin xác thực. Tải xuống tất cả các tệp và lưu chúng ở một vị trí an toàn trên máy tính của bạn, và giữ chúng bí mật.
tệp tin xác thực aws IoT core
  • Sau đó, nhấn vào nút Hoàn tất.

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

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

Các tệp này có thể được mở bằng bất kỳ trình chỉnh sửa văn bản nào như Notepad hoặc Notepad++

Viết mã ESP8266 để kết nối với AWS IoT Core

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-aws-iot */ #include "secrets.h" #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> // The MQTT topics that this device should publish/subscribe #define AWS_IOT_PUBLISH_TOPIC "esp8266/esp8266-to-aws" #define AWS_IOT_SUBSCRIBE_TOPIC "esp8266/aws-to-esp8266" #define PUBLISH_INTERVAL 5000 // 5 seconds BearSSL::WiFiClientSecure network; MQTTClient client = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); setClock(); connectToAWS(); } void loop() { client.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToAWS(); lastPublishTime = millis(); } } // Set time via NTP, as required for x.509 validation void setClock() { 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 connectToAWS() { // Configure the AWS IoT device credentials network.setTrustAnchors(new BearSSL::X509List(AWS_CERT_CA)); network.setClientRSACert(new BearSSL::X509List(AWS_CERT_CRT), new BearSSL::PrivateKey(AWS_CERT_PRIVATE)); // Connect to the MQTT broker on the AWS endpoint we defined earlier client.begin(AWS_IOT_ENDPOINT, 8883, network); // Create a handler for incoming messages client.onMessage(messageHandler); Serial.print("ESP8266 connecting to AWS IOT"); while (!client.connect(THINGNAME)) { Serial.print("."); delay(100); } Serial.println(); if (!client.connected()) { Serial.println("ESP8266 - AWS IoT Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function client.subscribe(AWS_IOT_SUBSCRIBE_TOPIC); Serial.println("ESP8266 - 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"]; */ }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Hãy tham khảo ESP8266 - Cài đặt phần mềm hướng dẫn nếu đây là lần đầu bạn sử dụng ESP8266.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, chẳng hạn như (ví dụ: NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Mở Library Manager bằng cách nhấp vào biểu tượng Library Manager ở 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 nút Install để cài đặt thư viện MQTT.
thư viện mqtt cho ESP8266 NodeMCU
  • ArduinoJson vào ô tìm kiếm, sau đó tìm thư viện ArduinoJson của Benoit Blanchon.
  • Nhấn nút Install để cài đặt thư viện ArduinoJson.
thư viện json cho ESP8266 NodeMCU
  • Sao chép mã ở trên và dán nó vào Arduino IDE.
  • Tạo tệp secrets.h trên Arduino IDE bằng:
    • Nhấp vào nút ngay bên dưới biểu tượng Serial Monitor và chọn Tab Mới, hoặc sử dụng phím Ctrl+Shift+N
    Arduino ide 2 thêm tệp tin
    • Đặt tên cho tập tin secrets.h và nhấn nút OK
    Arduino ide 2 thêm tệp secrets.h
    • Sao chép đoạn mã dưới đây và dán nó vào tệp secrets.h đã được tạo.
    #include <pgmspace.h> #define SECRET #define THINGNAME "ESP8266-thing" const char WIFI_SSID[] = ""; // CHANGE IT TO MATCH YOUR OWN NETWORK CREDENTIALS const char WIFI_PASSWORD[] = ""; // CHANGE IT TO MATCH YOUR OWN NETWORK CREDENTIALS 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 secrets.h
      • Các biến WIFI_SSIDWIFI_PASSWORD cho mạng WiFi của bạn
      • Các thông tin AWS_CERT_CA, AWS_CERT_CRT, và AWS_CERT_PRIVATE. Thông tin này nằm trong các tệp bạn đã tải xuống ở bước trước.
      • Thông tin AWS_IOT_ENDPOINT. Thông tin này có thể được tìm thấy trên AWS IoT Console bằng cách truy cập Cài đặt như hình dưới đây:
      Điểm cuối aws IoT
      • Biên dịch và tải mã lên bo mạch ESP8266 bằng cách nhấp vào nút Tải lên trên Arduino IDE

Gửi dữ liệu từ ESP8266 tới AWS IoT

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

COM6
Send
ESP8266 connecting to AWS IOT. ESP8266 - AWS IoT Connected! sent: - topic: esp8266/esp8266-to-aws - payload:{"timestamp":12743,"data":0} sent: - topic: esp8266/esp8266-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, hãy thực hiện các bước sau:

  • Trong bảng điều khiển AWS IoT, điều hướng đến Kiểm tra MQTT Test Client
Ứng dụng kiểm tra mqtt aws IoT cho ESP8266 NodeMCU
  • Nhấp vào nút Đăng ký một chủ đề.
  • Nhập esp8266/esp8266-to-aws vào Bộ lọc chủ đề. Bạn có thể thay đổi chủ đề nhưng PHẢI khớp với chủ đề trong mã ESP8266.
  • Nhấp vào nút Đăng ký.
  • Bạn sẽ có thể xem dữ liệu được gửi từ ESP8266 trên AWS IoT Console.

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

Bạn có thể gửi dữ liệu từ AWS IoT Console đến ESP8266 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 Kiểm tra MQTT Test Client
máy khách mqtt aws IoT cho ESP8266 NodeMCU
  • Nhấn nút Xuất bản tới một chủ đề.
  • Nhập esp8266/aws-to-esp8266 vào tên chủ đề. Bạn có thể thay đổi chủ đề nhưng PHẢI khớp với chủ đề trong mã ESP8266.
  • Tùy chọn, bạn có thể thay đổi nội dung tin nhắn, hoặc giữ nguyên như mặc định.
  • Nhấn nút Xuất bản.
  • Màn hình Serial trên Arduino IDE, bạn sẽ thấy thông điệp được gửi từ AWS IoT Console.
COM6
Send
received: - topic: esp8266/aws-to-esp8266 - payload: { "message": "Hello from AWS IoT console" }
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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

Giờ đây, bạn có thể thiết lập giao tiếp hai chiều giữa ESP8266 và AWS IoT Core. Điều này có nghĩa là bạn có thể gửi dữ liệu từ ESP8266 tới AWS IoT Core và nhận dữ liệu từ AWS IoT Core trên ESP8266. Ngoài ra, bạn có khả năng cấu hình IoTRules, cho phép ESP8266 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ừ ESP8266, mở ra một loạt các ứng dụng và tích hợp IoT.