[Node-RED] Giao tiếp Server Node-RED với ESP8266 qua giao thức MQTT

 



Giới thiệu

Internet of Things (viết tắt là IoT) là một kịch bản của thế giới, khi mà mỗi đồ vật, con người được qua một mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với người, hay người với máy tính. IoT đã phát triển từ sự hội tụ của công nghệ không dây, công nghệ vi cơ điện tử và Internet. Nói đơn giản là một tập hợp các thiết bị có khả năng kết nối với nhau, với Internet và với thế giới bên ngoài để thực hiện một công việc nào đó.

Thời đại IoT yêu cầu một giao thức kết nối mới để đảm bảo hỗ trợ đầy đủ cho các thiết bị vật lý thực tế. Để giải quyết vấn đề này, Message Queuing Telemetry Transport (MQTT) đang dần trở nên phổ biến.

MQTT là gì?

Định nghĩa

MQTT (Message Queuing Telemetry Transport) là giao thức truyền thông điệp (message) theo mô hình publish/subscribe (cung cấp / thuê bao), được sử dụng cho các thiết bị IoT với băng thông thấp, độ tin cậy cao và khả năng được sử dụng trong mạng lưới không ổn định. Nó dựa trên một Broker (tạm dịch là “Máy chủ môi giới”) “nhẹ” (khá ít xử lý) và được thiết kế có tính mở (tức là không đặc trưng cho ứng dụng cụ thể nào), đơn giản và dễ cài đặt.
  • MQTT là lựa chọn lý tưởng trong các môi trường như:
  • Những nơi mà giá mạng viễn thông đắt đỏ hoặc băng thông thấp hay thiếu tin cậy.
  • Khi chạy trên thiết bị nhúng bị giới hạn về tài nguyên tốc độ và bộ nhớ.
  • Bởi vì giao thức này sử dụng băng thông thấp trong môi trường có độ trễ cao nên nó là một giao thức lý tưởng cho các ứng dụng M2M (Machine to Machine).

  • MQTT cũng là giao thức được sử dụng trong Facebook Messenger

Tính năng, đặc điểm nổi bật

  • Dạng truyền thông điệp theo mô hình Pub/Sub cung cấp việc truyền tin phân tán một chiều, tách biệt với phần ứng dụng.
  • Việc truyền thông điệp là ngay lập tức, không quan tâm đến nội dung được truyền.
  • Sử dụng TCP/IP là giao thức nền.
  • Tồn tại ba mức độ tin cậy cho việc truyền dữ liệu (QoS: Quality of service)
  • QoS 0: Broker/client sẽ gửi dữ liệu đúng một lần, quá trình gửi được xác nhận bởi chỉ giao thức TCP/IP.
  • QoS 1: Broker/client sẽ gửi dữ liệu với ít nhất một lần xác nhận từ đầu kia, nghĩa là có thể có nhiều hơn 1 lần xác nhận đã nhận được dữ liệu.
  • QoS 2: Broker/client đảm bảo khi gửi dữ liệu thì phía nhận chỉ nhận được đúng một lần, quá trình này phải trải qua 4 bước bắt tay.
  • Phần bao bọc dữ liệu truyền nhỏ và được giảm đến mức tối thiểu để giảm tải cho đường truyền.

Ưu điểm của MQTT

Với những tính năng, đặc điểm nổi bật trên, MQTT mang lại nhiều lợi ích nhất là trong hệ thống SCADA (Supervisory Control And Data Acquisition) khi truy cập dữ liệu IoT.
  • Truyền thông tin hiệu quả hơn.
  • Tăng khả năng mở rộng.
  • Giảm đáng kể tiêu thụ băng thông mạng.
  • Rất phù hợp cho điều khiển và do thám.
  • Tối đa hóa băng thông có sẵn.
  • Chi phí thấp.
  • Rất an toàn, bảo mật.
  • Được sử dụng trong các ngành công nghiệp dầu khí, các công ty lớn như Amazon, Facebook, ....
  • Tiết kiệm thời gian phát triển.
  • Giao thức publish/subscribe thu thập nhiều dữ liệu hơn và tốn ít băng thông hơn so với giao thức cũ.

Code mẫu


[Node-RED] Giao tiếp Server Node-RED với ESP8266 qua giao thức MQTT


/////////////////////////////////////////
#include <Arduino.h>
#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = "Phong 3";
const char *password = "0392071213";
const char *mqtt_server = "192.168.1.20";
const int mqtt_port = 1883;
const char *mqtt_id = "esp8266";

WiFiClient client;
PubSubClient mqtt_client(client);

void callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Recived data from: ");
Serial.println(topic);
Serial.print("Message: ");
for (size_t i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
Serial.println("------------------------------------------");
}

void setup()
{
Serial.begin(9600);
Serial.print("Connecting to Wifi... ");
Serial.print(ssid);
Serial.println();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.print("Connected to Wifi ");
Serial.println(ssid);
Serial.print("IP Address: ");
Serial.print(WiFi.localIP());
Serial.println();
delay(1000);

mqtt_client.setServer(mqtt_server, mqtt_port);
mqtt_client.setCallback(callback);

Serial.println("Connecting to mqtt... ");
while (!mqtt_client.connect(mqtt_id))
{
delay(500);
}
Serial.println("Connected to mqtt ");
mqtt_client.subscribe("to-esp8266");
mqtt_client.publish("from-esp8266", "Hello Server");
}

void loop()
{
mqtt_client.loop();
}
////////////////////////////////////////

Link download library: 




Video hướng dẫn




Chúc các bạn thành công!

3 comments:

  1. anh ơi, sao em copy code này vào chạy không được, nó lỗi ở dòng khai báo thư viện pubsubclient.h á anh

    ReplyDelete
    Replies
    1. phải import thư viện này vào nữa pubsubclient.h

      Delete
  2. Anh ơi cho em hỏi chút là giao thức này gửi được bao nhiêu message vậy ạ? Tại em có dùng con Raspberry PI để thu thập số liệu cảm biến đưa về rồi đẩy lên Node-red, cứ mỗi 1 giây lại cập nhật 1 lần. Vì vậy em không biết là liệu giao thức này có truyền được liên tục trong 1 ngày hay 1 tháng gì đó không ạ? Em cảm ơn ạ.

    ReplyDelete