ESP8266 và IOT (Part 2): ESP8266 với MQTT

Introduction-to-the-MQTT-Protocol-on-NodeMCU-(1)

MQTT

Trong bài tutorial trước bạn đã biết làm cách nào để thiết lập và sử dụng ESP8266 để thu thập dữ liệu từ một cảm biến, kết nối với internet thông qua Wi-Fi và gửi giá trị đó cho Thingspeak thông qua giao thức HTTP.  Đồng thời, bạn đã thấy được làm cách nào có thể vẽ đồ thị dạng dữ liệu, và làm cách nào để mở rộng các tính năng của Thingspeak.

Bây giờ chúng ta cùng xem lại chương trình trong ví dụ trước. Thiết bị của chúng ta kết nối với server, gửi POST request với dữ liệu từ cảm biến, ngắt kết nối với server, chờ 15 giây và lặp lại quá trình ban nãy, cứ tiếp tục như vậy. Mỗi lần có một vài thứ được gửi, thiết bị chúng ta phải thiết lập lại kết nối (connection) với server – một connection trên một dữ liệu. Bằng cách khác, nếu chúng ta muốn truyền dữ liệu từ server đến thiết bị, chỉ có một cách là thiết bị của chúng ta luôn kết nối với server và kiểm tra nếu có gì đó thay đổi. Điều này rõ ràng là không phải là cách hiệu quả nhất trong việc truyền dữ liệu. HTTP protocol sửa dụng phương pháp request – response cho giao tiếp. Nếu bạn xem lúc những requests chúng ta gửi và responses chúng ta nhận, bạn sẽ thấy có rất nhiều những headers thêm vào và truyền đi. Tất cả các loại thông tin về trạng thái cái mà chúng ta thường không hứng thú với nó. HTTP thì phù hợp cho việc truyền dữ liệu lớn (websites chẳng hạn) nhưng nó thì rõ ràng là không phải hiệu quả nhất khi bạn muốn gửi một vài bytes dữ liệu – dữ liệu cảm biến. Thêm nữa, nó không nhanh. Điều này giải thích tại sao chúng ta nên dùng MQTT protocol.

MQTT thì nhẹ nhàng hơn và nhanh. Nó mất rất ít bytes cho việc kết nối với server và connection có thể giữ trạng thái open xuyên suốt. Ưu điểm là giao tiếp sẽ mất ít dữ liệu và thời gian hơn HTTP protocol. MQTT hoạt động như thế nào? Toàn bộ hệ thống bao gồm có nhiều client và thiết bị trung gian (broker). Thiết bị chúng ta đóng vai trò như những clients. Những Client này có thể là điện thoại hoặc laptop. Mỗi client chỉ giao tiếp với broker, các clients không liên lạc với nhau. Toàn bộ hệ thông dựa trên phương pháp giao tiếp publish – subscribe. Mỗi client có thể là một publisher cái mà published messages,  subcriber thì lắng nghe các message tới, hoặc đồng thời cả hai. Broker là một server có nhiệm vụ để chấp nhận các published message từ các publisher và gửi tiếp chúng tới các subscriber.

Publishers và subscribers
Publishers và subscribers

Bây giờ, làm cách nào mà broker biết các messages nào nó nên chuyển tiếp cho mỗi subscriber? Chắc chắn là sẽ quá lộn xộn cho mỗi subscriber nhận mỗi message, đặc biệt là nếu như có nhiều các publisher trong hệ thống. Câu trả lời sẽ là các Topic. Mỗi publisher sẽ publishe đến một Topic nhất định hoặc nhiều Topic, và mỗi một subcriber đăng ký (subscribes) đến một hoặc nhiều Topic. Topic có ba cấu trúc, cách nhau với dấu gạch chéo (/). Ví dụ tôi có cảm biến nhiệt độ tại một vài nơi, và tôi muốn có giá trị nhiệt độ trong vườn. Tôi dùng điện thoại và đăng ký một topic Sensor/Garden/Temperature. Thiết bị này đo đạc nhiệt dộ trong vườn và publish giá trị nhiệt độ đến cùng Topic tại thời điểm điện thoại của tôi nhận tin nhắn. Và tôi còn có thêm cảm biến độ ẩm, báo động và một vài thứ khác. Điều gì tôi muốn kiểm tra để biết tất cả các cảm biến trong vườn với một subscription? Tôi có thể sửa dụng Wildcards – Tôi đăng ký tới một topic Sensors/Garden/#. Tôi muốn điều gì khi kiểm tra cảm biến nhiệt độ tại mỗi nơi (Vườn, phòng ngủ, tầng hầm…) – Tôi có thể dùng một Wildcard và đăng ký tơi một topic Sensors/+/Temperature. Wildcard là tính năng khá tiện dụng của MQTT. MQTT còn có những tính năng khác như Quality of Service (đảm bao message (tin nhắn) được gửi), Last Will, Retained Messages… bạn có thể học thêm về MQTT protocol tại đây

PubSubClient Library

Làm cách nào chúng ta dùng MQTT với ESP8266? May mắn là  có một thư viện (library) có thể làm điều đó. Bây giờ chúng ta phải cài đặt thư việc này. Vào https://github.com/knolleary/pubsubclient và download zip file của PubSubClient library. Để add thư viện vào Arduino IDE, vào Sketch > Include Library > Add .ZIP và chọn downloaded file. Giờ bạn đã sẵn sàng để sử dụng MQTT protocol với ESP8266.

Bây giờ xem làm cách nào để dùng MQTT protocol với ESP8266. Chúng ta sẽ suy nghĩ xem một ví dụ đơn giản và kinh điển là bật tăt LED. Bằng cách gửi một message tương ứng từ PC hoặc điện thoại, chúng ta điều khiển LED của chúng ta.

Như các bạn đã biết, chúng ta cần một broker để giao tiếp qua MQTT. Đơn giản nhất là bắt đầu dùng một public broker, giống như http://broker.mqtt-dashboard.com. Rất tiện khi bạn có thể tới broker page và theo dõi thất cả cá published message trong một dashboard. Đây là cách tốt để xác nhận mọi thứ hoạt động. Mỗi lần ESP8266 kết nối với broker, nó sẽ publish một notification message.

Nếu bạn muốn sửa dụng PC như một client, bạn có để dùng  MQTT lens. Với điện thoại, tìm một MQTT client app. Tôi dùng cái này cho Android cellphone. Bạn phải thiết lập kết nối (connection). Vào broker domain name và port number (mặc định là 1833). Sau khi bạn thiết lập connection, bạn đã sẵn sàng để publish và subscribe đến topics. Bạn có thể bắt đầu publish message ‘on’ và ‘off’ đến ESP8266/LED status (giống ESP8266 đăng ký tới) và bạn nên xem LED của bạn (được nối vào chân 4 trong ví dụ này) bật và tắt. Subscribe đến ESP8266/connection status (khuyến cáo là bạn không nên sử dụng khoảng trắng (space) trong topic!) để nhận connection status messaged được publish bởi ESP8266.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "";
const char* password = "";

//const char* mqtt_server = "test.mosquitto.org";
//const char* mqtt_server = "iot.eclipse.org";
const char* mqtt_server = "broker.mqtt-dashboard.com";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  
  pinMode(4,OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  reconnect();
}

void setup_wifi(){

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  
  if((char)payload[0] == 'o' && (char)payload[1] == 'n') //on
    digitalWrite(4,HIGH);
  else if((char)payload[0] == 'o' && (char)payload[1] == 'f' && (char)payload[2] == 'f') //off
    digitalWrite(4,LOW);
    
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("ESP8266/connection status", "Connected!");
      // ... and resubscribe
      client.subscribe("ESP8266/LED status");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void loop() {
 
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}
MQTT lens
MQTT lens

Bạn sẽ xem một vài public brokers dưới comment trong code. Bạn phải lưu ý rằng việc sử dụng public broker connection không phải là ổn định. Ngoài ra, dữ kiệu truyền đi sẽ không bảo mật. Bạn nên tạo một Broker của riêng bạn. Tôi cài đặt open-source broker Mosquio trên may Window. Bạn có thể tìm các hướng dẫn sao để cài đặt ở đây. Bạn phải sử dụng IP address của bạn thay cho domain name. Bạn phải đảm bảo là server của bạn phải là luôn bật. Sử dụng một máy tính nhỏ nhất như Rasberry Pi có lẽ là sự lựa chọn tốt.

Bây giờ bạn đã biết làm cách nào để hiện thực MQTT trên ESP8266 và khám phá các tính năng của nó. Trong bài kế chúng tôi sẽ sửa dụng MQTT protocol để kết nối thiết bị của mình với IBM’s platform rất mạnh đó là Bluemix, nó sẽ cho phép chúng ta nhanh chóng xây dụng cá ứng dụng IoT thú vị và hữu dụng.

 

Các bài cùng Series

(Part 1): Làm quen với ESP8266
(Part 2): ESP8266 với MQTT
(Part 3): Kết nối ESP8266 với IBM Bluemix
(Part 4): Dùng Cloudant DB trong IBM Bluemix để lưu trữ dữ liệu
(Part 5): Gửi Email và SMS thông báo khi bị trigger từ dữ liệu cảm biến
(Part 6): Hiển thị dữ liệu cảm biến với IBM Bluemix
(Part 7): Vị trí Devices trên Map
(Part 8): Nhận Motion Alarm Notifications trong Slack
(Part 9): Điều khiển thiết bị trong nhà bằng Slack

Tham khảo: Codingo

Comments

linhkienbachkhoa

Comments