- Giao thức MQTT là gì?
- MQTT hoạt động như thế nào?
- Nhà môi giới Eclipse Mosquitto
- Thành phần bắt buộc
- Mạch kiểm tra Eclipse MQTT - Sơ đồ
- Lập trình ESP8266 để thiết lập giao tiếp với nhà môi giới
- Kiểm tra MQTT với ESP8266 bằng Arduino
Trong vài năm qua, các thiết bị IoT (Internet of Things) đã trở thành một phần không thể phân biệt trong cuộc sống hàng ngày của chúng ta. Từ ngôi nhà thông minh, bóng đèn thông minh đến các thiết bị thông minh; những người sáng tạo và nhà phát triển đang kết hợp công nghệ này để tạo ra một mạng lưới các thiết bị được kết nối giúp cuộc sống hàng ngày của chúng ta trở nên thú vị hơn một chút. Tất cả điều này đã được thực hiện bởi vì sự dễ dàng của giao tiếp. Có nhiều cách có thể để giao tiếp giữa các thiết bị, nhưng trong các sản phẩm thương mại và sở thích, một giao thức duy nhất thường được sử dụng là Truyền tải từ xa xếp hàng tin nhắn (MQTT). Trước đây, chúng tôi đã xây dựng Đài FM được điều khiển bằng giọng nói bằng Arduino và Trợ lý Google sử dụng MQTT để giao tiếp với bảng NodeMCU. Hãy kiểm tra nó nếu điều đó có vẻ thú vị với bạn.
Trong dự án này, chúng tôi sẽ sử dụng nhà môi giới Eclipse MQTT phổ biến và miễn phí và tìm hiểu cách kết nối thiết bị IoT (trong trường hợp của chúng tôi là mô-đun NodeMCU) với nhà môi giới MQTT và truyền dữ liệu giữa nhà môi giới MQTT và NodeMCU.
Giao thức MQTT là gì?
Trước khi tiếp tục, tốt hơn hết bạn nên có một ý tưởng rõ ràng về giao thức MQTT (Message Queueing Telemetry Transport). Đây là một giao thức nhắn tin nhẹ sử dụng phương pháp xuất bản / đăng ký và dịch các tin nhắn giữa nhiều thiết bị. Sử dụng giao thức MQTT, chúng tôi cũng có thể gửi / nhận dữ liệu và điều khiển các thiết bị đầu ra khác nhau, như đọc dữ liệu cảm biến, v.v. Nó được phát triển trên nền TCP, đó là lý do tại sao nó nhanh hơn các giao thức tương tự như HTTP. Ngoài ra, nó còn có nhiều ưu điểm khác so với các giao thức khác như rất nhẹ, vì vậy nó không tiêu tốn bộ nhớ dư thừa, nó có thể hoạt động với rất ít băng thông mạng, trên hết, nó có sẵn một giao thức bảo mật mạnh mẽ. Những tính năng này làm cho nó phù hợp với nhiều ứng dụng.
MQTT hoạt động như thế nào?
Để hiểu hoạt động của giao thức MQTT, chúng ta chỉ cần hiểu ba điều cơ bản; sơ đồ trên cho thấy điều đó. Ngoài ra, chúng tôi đã giải thích nó dưới đây trong bài viết.
Khách hàng MQTT:
Một MQTT khách hàng là bất kỳ thiết bị (nó có thể là một vi điều khiển hoặc một máy chủ) chạy chức năng MQTT và giao tiếp với một máy chủ trung tâm, được gọi là “ nhà môi giới ”. Nhà môi giới xử lý giao tiếp dữ liệu giữa các máy khách được kết nối.
Nhà xuất bản MQTT:
Khi khách hàng muốn gửi bất kỳ thông tin nào, khách hàng được gọi là "Nhà xuất bản". Nhà xuất bản sẽ xuất bản thông tin về một chủ đề cụ thể. “ Chủ đề ” là một đường dẫn mà chúng tôi có thể xuất bản / đăng ký thông báo. Sau đó, nhà môi giới sẽ gửi thông tin do người dùng xuất bản cho các khách hàng (còn được gọi là Người đăng ký) đã đăng ký chủ đề cụ thể đó.
Người đăng ký MQTT:
Người đăng ký MQTT đăng ký các chủ đề trên nhà môi giới MQTT để đọc các tin nhắn do nhà môi giới gửi.
Nhà môi giới Eclipse Mosquitto
Eclipse Mosquitto là một nhà môi giới MQTT mã nguồn mở, có trọng lượng nhẹ và phù hợp để sử dụng trên các thiết bị IoT để giao tiếp. Các giao thức MQTT cung cấp một phương pháp nhẹ của truyền thông tin bằng cách sử dụng xuất bản / đăng ký mô hình. Nếu bạn muốn tìm hiểu thêm về chủ đề này, bạn có thể truy cập trang web chính thức của muỗi.
Thiết lập nhà môi giới Eclipse Mosquitto:
Để thiết lập giao tiếp với nhà môi giới, trước tiên chúng ta cần thiết lập nó. Trong dự án này, một ứng dụng Android được sử dụng để xuất bản và đăng ký thông tin với Nhà môi giới. Các bước sau đây sẽ cung cấp cho bạn ý tưởng tốt hơn về quá trình thiết lập.
Bước 1:
Trước tiên, hãy tải xuống bất kỳ ứng dụng “MQTT client” nào có sẵn trong Cửa hàng Google Play / App Store và cài đặt nó. Trong dự án này, một ứng dụng có tên “MQTT client” được sử dụng, giống như hình bên dưới.
Bước 2:
Nhấp vào dấu “+” để liệt kê các tùy chọn bổ sung trong ứng dụng, nơi chúng tôi sẽ thêm một nhà môi giới mới. Khi nhấp vào nút, một màn hình mới xuất hiện như hình dưới đây.
Bước 3:
Sau đó, các chi tiết của nhà môi giới cần được điền vào trường bắt buộc. Đầu tiên, nhấp vào tùy chọn “Đã bật” hiển thị trong Ứng dụng. Trong dự án này, nhà môi giới Eclipse MQTT được sử dụng, các chi tiết sẽ được điền được đưa ra dưới đây:
Biệt hiệu: Đặt tên sở thích của bạn
Máy chủ: mqtt.eclipse.org
Cảng: 1883
ID Khách hàng: Cung cấp ID Sở thích của Bạn
Các chi tiết trên cần được điền vào các trường tương ứng. Tất cả các trường khác không cần thiết và có thể để trống. Sau khi hoàn thành thành công, bạn bấm vào nút lưu để lưu chi tiết Nhà môi giới.
Sau khi hoàn tất, quá trình thiết lập ứng dụng android đã kết thúc và bây giờ chúng ta có thể chuyển sang phần cứng của mọi thứ.
Thành phần bắt buộc
Dưới đây là danh sách đầy đủ các bộ phận cần thiết. Vì mạch này đơn giản, bạn có thể tìm thấy tất cả các bộ phận cần thiết tại cửa hàng sở thích tại địa phương của bạn.
- NodeMCU
- Đèn LED
- Breadboard
- Kết nối dây
- Cáp lập trình
Mạch kiểm tra Eclipse MQTT - Sơ đồ
Sơ đồ mạch cho dự án MQTT cơ bản được đưa ra dưới đây:
Lập trình ESP8266 để thiết lập giao tiếp với nhà môi giới
Một mã Arduino đơn giản đảm nhận tất cả các giao tiếp cần thiết giữa nhà môi giới MQTT và NodeMCU. Trong phần này, chúng ta sẽ tìm hiểu chi tiết cách hoạt động của chức năng này.
Thiết lập Arduino IDE và tải lên mã:
Nếu bạn đang tải mã lên NodeMCU lần đầu tiên, trước tiên bạn cần thiết lập Arduino IDE. Để làm điều đó, chỉ cần làm theo hướng dẫn đơn giản dưới đây.
Đầu tiên, mở Arduino IDE, sau đó đi tới Tệp–> Tùy chọn–> Cài đặt .
Tiếp theo, sao chép URL bên dưới và dán nó vào trường 'URL quản lý hội đồng quản trị bổ sung ' và nhấp vào 'Ok'. Bạn có thể kiểm tra hình ảnh bên dưới để biết chúng tôi đã làm điều đó như thế nào.
Liên kết:
Tiếp theo, vào Tools> Board> Boards Manager . Trong cửa sổ Board's Manager, Nhập ESP 8266 vào hộp tìm kiếm và nhấn enter. Sau đó chọn phiên bản mới nhất từ menu thả xuống và nhấp vào cài đặt. Hình ảnh dưới đây sẽ cho bạn một ý tưởng rõ ràng.
Cuối cùng, khi quá trình cài đặt hoàn tất, hãy vào Tools -> Board -> và chọn NodeMCU 1.0 (ESP-12E Module). Bây giờ, bạn có thể lập trình NodeMCU với Arduino IDE. Khi chúng ta đã hoàn tất thiết lập Arduino IDE, bây giờ chúng ta có thể tải lên mã hoàn chỉnh. Nhưng trước tiên, hãy đọc phần giải thích nhanh về toàn bộ mã.
Đầu tiên, chúng tôi đã bao gồm “ESP8266WiFi.h” để sử dụng ESP8266 và “PubSubClient.h” cho MQTT.
Bạn có thể tìm thấy thư viện ESP8266 được tạo sẵn bên trong thư viện Arduino, nhưng bạn cần tải xuống thư viện PubSubClient từ kho lưu trữ GitHub được liên kết của nó.
#include
Sau đó, xác định thông tin đăng nhập mạng như tên người dùng và mật khẩu Wi-Fi của bạn. Thay thế thông tin đăng nhập của bạn thay cho “quản trị viên” và “12345678” tương ứng.
const char * ssid = "admin"; const char * password = "12345678";
Tiếp theo, chúng ta cần cấu hình máy chủ MQTT. Chúng tôi đã sử dụng máy chủ Eclipse MQTT cho dự án này, đó là lý do tại sao địa chỉ máy chủ được cung cấp là “mqtt.eclipse.org”. Nhưng nếu bạn định sử dụng bất kỳ máy chủ nào khác như Mosquitto, Adafruit, thì bạn có thể thay thế nó bằng địa chỉ máy chủ và số cổng cụ thể của mình.
const char * mqtt_server = "mqtt.eclipse.org"; const int mqtt_port = 1883;
Tiếp theo, các thể hiện được tạo cho lớp WiFiClient và PubSubClient , sẽ được sử dụng trong suốt chương trình.
WiFiClient espClient; Ứng dụng khách PubSubClient (espClient);
Trong phần setup () , đầu tiên chúng tôi gọi WiFi.begin () , việc gọi phương thức này sẽ kết nối ESP với HotSpot ưa thích của bạn.
WiFi.begin (ssid, mật khẩu);
Tiếp theo, chúng tôi kiểm tra kết nối mạng thành công bằng phương thức WiFi.status () . Sau khi kết nối thành công, một thông báo sẽ được in trên Serial Monitor với SSID của mạng được kết nối.
while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.println ("Đang kết nối với WiFi.."); } Serial.print ("Đã kết nối với WiFi:"); Serial.println (WiFi.SSID ());
Bây giờ, chúng ta cần tạo một nhà môi giới. Đối với điều đó, chúng tôi đã sử dụng phương thức setServer ; phương thức này nhận hai đối số mà chúng ta đã xác định trước. Bây giờ, nếu chúng ta muốn nhận tin nhắn từ máy chủ, chúng ta cần tạo một hàm gọi lại. Đối với điều đó, chúng tôi đang sử dụng phương thức setCallback (gọi lại) .
client.setServer (mqtt_server, mqtt_port); client.setCallback (MQTTcallback);
Bây giờ, chúng tôi đã sử dụng chức năng kết nối (clientID) để kết nối với máy khách ESP8266. Ở đây clientID là tên của ứng dụng khách và nó phải là duy nhất. Nếu nó được kết nối, thì thông báo thành công có thể được hiển thị bên trong màn hình nối tiếp.
if (client.connect ("ESP8266")) {Serial.println ("đã kết nối"); } else {Serial.print ("không thành công với trạng thái") Serial.println (client.state ()); chậm trễ (2000); }
Tiếp theo, chúng tôi gọi client.subscribe () , một hàm MQTT được tích hợp sẵn, được sử dụng để đăng ký một chủ đề cụ thể. Đối với dự án này, chúng tôi đã sử dụng “ esp / test ” làm tên người đăng ký của mình.
client.subscribe ("esp / test");
Bây giờ, chức năng MQTTcallback được gọi để kiểm tra xem có bất kỳ thông tin cập nhật nào có sẵn hay không. Nếu có sẵn dữ liệu mới, chức năng này xử lý dữ liệu đã nhận và in một thông báo trong màn hình nối tiếp với thông báo gốc và tên chủ đề nơi nhận được thông báo.
Tiếp theo, chúng tôi chuyển đổi các thông báo thành một chuỗi, để nó có thể được so sánh và kiểm tra xem có bất kỳ hành động kích hoạt nào không. Trong dự án này, một đèn LED được BẬT / TẮT bằng các lệnh MQTT, như được hiển thị trong mã bên dưới.
for (int i = 0; i <length; i ++) {message = message + (char) payload; } Serial.print (tin nhắn); if (message == "on") {digitalWrite (LED, HIGH); }
Cuối cùng, để công bố thông tin về chủ đề. Hàm client.publish () được sử dụng. Trong dự án này, trạng thái nút nhấn được kiểm tra, nếu nút được nhấn, thì một thông báo sẽ được xuất bản cho Chủ đề “ esp / test1 ” như hình dưới đây.
if (digitalRead (D1) == 0)) {client.publish ("esp / test1", "Xin chào từ ESP8266"); } khác; client.loop ();
Kiểm tra MQTT với ESP8266 bằng Arduino
Đối với thử nghiệm cuối cùng của chúng tôi, chúng tôi sẽ sử dụng ứng dụng Android mà chúng tôi đã thiết lập trước đó.
Mở ứng dụng khách MQTT và đảm bảo rằng điện thoại di động của bạn có kết nối internet đang hoạt động. Ngoài ra, điểm phát sóng mà NodeMCU được kết nối phải có kết nối internet đang hoạt động. Khi mọi thứ được kết nối với internet, chúng tôi sẽ gửi chuỗi “Xin chào từ ESP8266” từ mô-đun ESP, chuỗi này sẽ được phản ánh bên trong ứng dụng Android và chúng tôi sẽ nhận được thông báo. Tiếp theo, chúng tôi sẽ gửi một chuỗi từ ứng dụng Android, chuỗi này sẽ BẬT một đèn LED được kết nối với bảng MCU nút ESP8266.
Bước 1: (Đăng ký chủ đề):
Nhấp vào tùy chọn MQTT đã lưu trên Ứng dụng mà chúng tôi đã định cấu hình trước đó. Nó sẽ bật lên một màn hình, nơi nó được nhắc "Đăng ký một chủ đề". Trước đây chúng tôi đã định cấu hình chủ đề là “ esp / test1 ”. Vì vậy, trong ứng dụng Android, chúng tôi sẽ viết “ esp / test1 ”. Nhấp vào Đăng ký, làm như vậy sẽ hiển thị cho bạn một màn hình như bên dưới, nơi nó sẽ được viết như “Không nhận được tin nhắn” từ Chủ đề cụ thể.
Bây giờ, hãy nhấp vào nút 'Đã kết nối' được kết nối với nodeMCU. Bây giờ theo mã của chúng tôi, một thông báo “ Xin chào từ ESP8266 ” sẽ được xuất bản cho Chủ đề và sẽ có một thông báo trên màn hình với thông báo nhận được như hình dưới đây.
Bước 2: Xuất bản lên Chủ đề:
Bây giờ để xuất bản trong Chủ đề, Click vào nút MŨI TÊN LÊN của Ứng dụng, và nó sẽ mở ra một màn hình như hình dưới đây.
Bây giờ, trong trường Chủ đề, hãy viết “ esp / test ” và trong trường tin nhắn, hãy viết “ bật ” hoặc “ tắt ” để bật và tắt đèn LED tương ứng. Ví dụ: nếu “bật” được xuất bản cho Chủ đề, thì đèn LED sẽ được bật và nếu “tắt” được xuất bản cho Chủ đề, thì đèn LED sẽ tắt.
Tôi hy vọng bạn thích bài viết và học được điều gì đó mới. Nếu bạn có bất kỳ câu hỏi nào liên quan đến bài viết này, vui lòng bình luận bên dưới hoặc bạn có thể sử dụng diễn đàn của chúng tôi để thay thế.