MQTT: một giao thức mạng mở và tầm quan trọng của nó trong IoT

Mạng giao thức MQTT IoT

Nhớ cái tên này MQTT, vì nó là một loại giao thức truyền thông mạng M2M (Máy với Máy) nên sẽ có vẻ hơi ồn. Nó đang trở nên khá phổ biến nhờ vào kỷ nguyên mới của Internet of Things hay IoT (Internet vạn vật) cho từ viết tắt tiếng Anh của nó. Ngoài ra, nó là một giao thức mở, mang lại nhiều lợi thế.

Trên thực tế, nó đã trở thành một trong những trụ cột trung tâm của IoT, vì nó khá tốt trên các thiết bị có một số hạn chế về đường truyền như thế này. Từ viết tắt MQTT bắt nguồn từ Tin nhắn Xếp hàng từ xa Vận chuyển, một tiêu chuẩn mở từ OASIS và ISO (ISO / IEC 20922) cho truyền thông mạng và thường chạy trên TCP / IP nổi tiếng.

Các giao thức mạng

Mô hình OSI và các lớp của nó

Các giao thức giao tiếp Chúng là các quy tắc cho phép hai hoặc nhiều thiết bị hoặc hệ thống giao tiếp với nhau. Đó là, nó là một giao thức để truyền thông tin thông qua nhiều phương tiện khác nhau và với một định dạng xác định, cho dù được thực hiện bằng phần mềm và phần cứng (hoặc cả hai).

El tiêu chuẩn của giao thức xác định vô số đặc điểm giao tiếp. Nó có thể đi từ các quy tắc đồng bộ hóa, ngữ nghĩa, cú pháp, định dạng gói, v.v. Và sự thật là chúng không phải là thứ gì đó không đáng kể, vì nhờ những giao thức này mà ngày nay chúng ta có thể sử dụng Internet và các mạng truyền thông khác ...

Và tất nhiên, không chỉ có một giao thức, mà là nhiều. Ví dụ, sự nổi tiếng DNS, FTP, MQTT, HTTP và HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP, v.v., cho lớp ứng dụng. Trong khi ở trong lớp truyền tải, bạn có thể tìm thấy một số nổi tiếng như TCP, UDP, v.v., cũng như các lớp của Internet như IPv4 hoặc IPv6 (lớp đã tạo ra số lượng IP lớn nhất hiện có và sự xuất hiện của IoT), IPSec, v.v., và những thứ khác từ lớp liên kết như DSL, Ethernet, WiFi, ARP, v.v.

Giới thiệu về các giao thức IoT

Giao thức MQTT

Tất nhiên, có những giao thức truyền thông cụ thể hoặc có thể được áp dụng cho IOT. Có nghĩa là, xem xét phần trước, chúng sẽ là một loạt các tiêu chuẩn được xác định để hai hoặc nhiều thiết bị IoT có thể giao tiếp và hiểu nhau, và chúng thường là M2M, tức là giao tiếp giữa máy và máy. nhiều thiết bị IoT được kết nối và chia sẻ thông tin từ các cảm biến hoặc các nguồn khác.

Do số lượng lớn các thiết bị IoT, các giao thức này phải đáp ứng các yêu cầu vượt ra ngoài các giới hạn về băng thông, tốc độ, v.v. (lưu ý rằng nhiều thiết bị được nhúng và giá rẻ), điều này thường có trong một số thiết bị. Và ý tôi là thực tế là phải có khả năng mở rộng, để có thể bổ sung thêm các thiết bị kết nối khác nếu cần thiết và không ảnh hưởng đến hệ thống toàn cầu.

Ngoài ra, họ phải có sự phụ thuộc thấp ghép nối giữa các thiết bị để không phát sinh sự cố nếu thiết bị bị loại bỏ. Và tất nhiên, đồng thời, cần tìm kiếm khả năng tương tác cao để nó hoạt động với một số lượng lớn thiết bị và hệ thống rất đa dạng, vì thế giới IoT khá không đồng nhất.

Các tính năng hữu ích khác sẽ là sự dễ dàng trong việc triển khai chúng, an ninh, Vân vân. Hãy nhớ rằng IoT đang tạo ra những thách thức lớn trong khía cạnh bảo mật. Thậm chí còn hơn thế nữa khi nhiều thiết bị được kết nối thường rất quan trọng trong một số trường hợp nhất định ... ví dụ như đồ chơi cho trẻ vị thành niên.

Các khái niệm quan trọng

Điều đó nói rằng, phải nói rằng các giải pháp cho IoT sử dụng một máy chủ tập trung để nhận các thông điệp từ tất cả các thiết bị được kết nối phát ra và phân phối chúng đến tất cả các thiết bị IoT được kết nối đang lắng nghe. Máy chủ đó được gọi là bộ định tuyến hoặc nhà môi giới. Một cái gì đó khác xa mối quan hệ máy khách-máy chủ thông thường theo một số cách.

Hơn nữa, phương pháp luận mà bạn có thể tìm thấy trong các giao thức truyền thông này cho IoT là:

  • quán rượu: Publish / Susbcribe là một mẫu nhắn tin trong đó một thiết bị (Sub) thông báo cho nhà môi giới rằng nó muốn nhận một tin nhắn, trong khi một thiết bị khác (Pub) đăng thông báo để nhà môi giới phân phối đến / các thiết bị khác đang chờ họ.
  • rRPC: Các cuộc gọi Thủ tục Bộ điều chỉnh Bộ định tuyến là một mẫu khác của quá trình thực thi từ xa. Trong đó, một thiết bị (Callee) thông báo cho nhà môi giới biết rằng nó sẽ thực hiện một quy trình nhất định và nhà môi giới phân phối nó đến một thiết bị khác (Người gọi) trên đó quy trình đó được thực hiện.

Bây giờ, để thực hiện các phương pháp hoặc mô hình này, cơ sở hạ tầng nhắn tin. Và theo nghĩa này, có thể phân biệt hai:

  • Hàng đợi tin nhắn: dịch vụ nhắn tin trong đó một hàng đợi tin nhắn được tạo cho tất cả các khách hàng bắt đầu đăng ký với nhà môi giới. Sau đó sẽ giữ các tin nhắn được lưu trữ cho đến khi chúng được chuyển đến máy khách. Nếu máy khách hoặc người nhận không được kết nối, nó sẽ được duy trì cho đến khi được kết nối. Những loại dịch vụ này giống như những dịch vụ được sử dụng trong các ứng dụng nhắn tin tức thì như Telegra, WhatsApp, Messenger, v.v.
  • Dịch vụ tin nhắn: nó là một dịch vụ khác trong đó người môi giới gửi thông điệp đến máy khách người nhận được kết nối, lọc theo loại thông báo. Nếu máy khách hoặc thiết bị nhận bị ngắt kết nối, thì các tin nhắn sẽ bị mất (mặc dù nó có thể có một số hệ thống ghi nhật ký).

Các giao thức IoT

Đã thấy ở trên, bây giờ chúng ta hãy xem xét kỹ hơn Các giao thức IoT được biết đến nhiều hơn. Trong số những điểm nổi bật nhất của M2M là:

  • AMQP (Giao thức xếp hàng thư nâng cao): là một giao thức kiểu PubSub của Hàng đợi Thông báo. Được thiết kế để có khả năng tương tác tốt và đảm bảo độ tin cậy. Đặc biệt đối với các ứng dụng công ty, hiệu suất cao, mạng có độ trễ cao, quan trọng, v.v.
  • WAMP (Giao thức nhắn tin ứng dụng web): nó là một giao thức mở khác kiểu PubSub như rRPC, và nó chạy trên WebSockets.
  • CoAP (Giao thức ứng dụng bị ràng buộc): là một giao thức được thiết kế đặc biệt cho các ứng dụng dung lượng thấp.
  • TOMP (Giao thức nhắn tin hướng văn bản trực tuyến): giao thức rất đơn giản và để đạt được khả năng tương tác tối đa. HTTP được sử dụng để truyền tin nhắn văn bản.
  • XMPP (Giao thức hiện diện và nhắn tin eXtensible): một giao thức khác được sử dụng trong IoT cho các ứng dụng nhắn tin tức thì và dựa trên XML. Jan trường hợp này cũng đang mở.
  • WMQ (Hàng đợi Tin nhắn WebSphere): giao thức do IBM phát triển. Nó thuộc loại Hàng đợi Thông báo, như tên gọi của nó cho thấy, và có định hướng thông điệp.
  • MQTT: (xem phần tiếp theo)

Tất cả về MQTT

Gói MQTT

El Giao thức MQTT Nó là một giao thức giao tiếp Hàng đợi Thông báo, tuân theo một mẫu PubSub và thuộc loại M2M như tôi đã đề cập. Nó được sử dụng rộng rãi trong IoT và dựa trên ngăn xếp TCP / IP được sử dụng trên Internet.

Trong trường hợp của MQTT, mọi kết nối được giữ ở trạng thái mở và nó được sử dụng lại trong mọi giao tiếp cần thiết. Một cái gì đó khác với những gì xảy ra trong các giao thức đã biết khác, rằng mỗi giao tiếp diễn ra yêu cầu một kết nối mới.

Advantage

Ưu điểm của giao thức MQTT thể hiện khá rõ ràng về mặt truyền thông M2M cho IoT. Ngoài mọi thứ đã nói ở trên, nó còn là một giao thức cung cấp:

  • Khả năng mở rộng, để kết nối ngày càng nhiều khách hàng.
  • Tách biệt giữa các máy khách, để ít phụ thuộc hơn.
  • Chủ nghĩa không đồng bộ.
  • Sự đơn giản.
  • Nhẹ để không tiêu tốn quá nhiều tài nguyên (mặc dù với bảo mật TLS / SSL thì nó tăng lên).
  • Tiết kiệm năng lượng cho các thiết bị phụ thuộc vào pin hoặc hoạt động 24/7, nó không cần băng thông lớn (lý tưởng cho các kết nối chậm, như một số kết nối không dây).
  • Bảo mật và chất lượng, cho độ tin cậy và mạnh mẽ hơn trong giao tiếp.

lịch sử

MQTT được tạo ra vào những năm 90, với phiên bản ban đầu của giao thức năm 1999. Nó được tạo ra bởi Tiến sĩ Andy Stanford-Clark của IBM và Arlen Nipper của Cirrus Link (trước đây là Eurotech).

La ý tưởng ban đầu là tạo ra một giao thức để giám sát một đường ống đi qua sa mạc, với một giao thức truyền thông hiệu quả (tiêu thụ băng thông thấp), ánh sáng và mức tiêu thụ năng lượng thấp. Vào thời điểm đó, nó rất đắt, nhưng bây giờ nó đã trở thành một giao thức mở và rẻ.

Giao thức ban đầu đã được cải thiện với sự xuất hiện của phiên bản mới, chẳng hạn như MQTT v3.1 (2013) theo đặc điểm kỹ thuật của OASIS (Tổ chức vì sự tiến bộ của tiêu chuẩn thông tin có cấu trúc), v.v. Bạn nên biết rằng lúc đầu nó là một giao thức độc quyền của IBM, nhưng nó sẽ được phát hành vào năm 2010 và cuối cùng nó đã trở thành một tiêu chuẩn trong OASIS ...

Cách kết nối MQTT hoạt động

Giao thức MQTT sử dụng một bộ lọc, đối với các tin nhắn được gửi đến từng khách hàng, dựa trên các chủ đề hoặc chủ đề được sắp xếp theo thứ bậc. Bằng cách này, khách hàng có thể đăng tin về một chủ đề cụ thể. Bằng cách này, tất cả các khách hàng hoặc thiết bị được kết nối đăng ký chủ đề sẽ nhận được tin nhắn thông qua nhà môi giới.

Cũng như MQ, tin nhắn sẽ vẫn còn trong hàng đợi và chúng sẽ không bị mất cho đến khi khách hàng nhận được tin nhắn đó.

Các kết nối, như tôi cũng đã chỉ ra, được thực hiện qua TCP / IPvà máy chủ hoặc nhà môi giới sẽ lưu giữ hồ sơ về các máy khách được kết nối. Theo mặc định, các thiết bị sẽ sử dụng cổng giao tiếp số 1883, mặc dù bạn cũng có thể gặp cổng 8883 nếu bạn đang sử dụng SSL / TLS để tăng cường bảo mật.

Để kết nối có thể thực hiện được, không chỉ máy khách, máy chủ và cổng là cần thiết. Ngoài ra những người khác gói hoặc tin nhắn đã gửi để giao tiếp diễn ra:

  • Thiết lập kết nối: CONNECT tin nhắn / gói tin được gửi bởi khách hàng với tất cả các thông tin cần thiết. Thông tin đó bao gồm ID khách hàng, tên người dùng, mật khẩu, v.v. Nhà môi giới hoặc máy chủ phản hồi bằng gói CONNACK sẽ thông báo cho khách hàng rằng kết nối đã được chấp nhận, bị từ chối, v.v.
  • Gửi và nhận tin nhắn: khi kết nối được thiết lập, các gói hoặc tin nhắn PUBLISH được sử dụng với chủ đề và tải trọng của thông báo được gửi đến nhà môi giới. Mặt khác, khách hàng hoặc khách hàng quan tâm sử dụng gói SUBSCRIBE và UNSUSCRIBE để đăng ký hoặc rút đăng ký của họ tương ứng. Nhà môi giới cũng sẽ phản hồi bằng gói SUBACK và UNSUBACK tương ứng để báo cáo sự thành công của hoạt động do khách hàng yêu cầu.
  • Duy trì kết nối: để đảm bảo rằng kết nối vẫn mở, máy khách có thể gửi định kỳ gói PINGREQ sẽ được khớp với gói PINGRESP từ máy chủ.
  • Kết thúc kết nối: khi một máy khách ngắt kết nối nó sẽ gửi một gói DISCONNECT để báo cáo sự kiện đó.

Những, cái đó tin nhắn hoặc gói Những cái tôi đã nói đến có cấu trúc giống như các gói khác của các giao thức mạng khác:

  • Tiêu đề đầu trang hoặc tiêu đề cố định: là phần cố định chiếm từ 2-5 byte. Nó chứa một mã điều khiển, ID của loại tin nhắn được gửi và độ dài của nó. Giữa 1-4 byte được sử dụng để mã hóa độ dài, sử dụng 7 bit đầu tiên của mỗi bộ tám làm dữ liệu cho độ dài và một bit liên tục bổ sung để xác định rằng có nhiều hơn một byte tạo nên độ dài của thông điệp.
  • Tiêu đề biến: không phải lúc nào cũng bắt buộc, nhưng không bắt buộc. Nó chỉ được chứa trong một số gói trong một số tình huống hoặc thông điệp cụ thể.
  • Nội dung hoặc dữ liệu: dữ liệu gói là những gì thực sự chứa thông điệp sẽ được gửi đi. Nó có thể từ vài kB đến giới hạn 256 MB.

Nếu bạn muốn biết mã tương ứng trong hệ thập lục phân đối với các loại tin nhắn được gửi là:

thông điệp
KẾT NỐI 0x10
KẾT NỐI 0x20
CÔNG BỐ 0x30
XUẤT BẢN 0x40
dậy thì 0x50
PUBREL 0x60
quán rượu 0x70
ĐĂNG KÝ 0x80
ĐĂNG KÝ 0x90
CHƯA ĐÓNG GÓP 0xA0
BỎ QUA 0xB0
PINGREQ 0xC =
PINGRESP 0xD0
NGẮT KẾT NỐI 0xE0

Chất lượng và bảo mật thông tin liên lạc

Một chi tiết quan trọng khác của các thông điệp của MQTT là chất lượng dịch vụ hoặc QoS, và an ninh. Sự mạnh mẽ của hệ thống thông tin liên lạc trong trường hợp có sự cố và sự an toàn của nó sẽ phụ thuộc vào điều này.

Về chất lượng của nó, nó có thể được xác định 3 cấp độ khác nhau:

  • QoS 0 (không xác nhận)- Tin nhắn chỉ được gửi một lần và trong trường hợp thất bại, tin nhắn sẽ không được gửi. Nó được sử dụng khi nó không quan trọng.
  • QoS 1 (xác nhận): tin nhắn sẽ được gửi đi nhiều lần nếu cần để đảm bảo gửi đến khách hàng. Nhược điểm là máy khách có thể nhận được cùng một thông báo nhiều lần.
  • QoS 2 (đảm bảo)- Tương tự như trên, nhưng đảm bảo chỉ được giao một lần. Nó thường được sử dụng cho các hệ thống quan trọng hơn, nơi cần độ tin cậy cao hơn.

Mặt khác, đối với Bảo mật MQTT, các biện pháp khác nhau có thể được sử dụng để đảm bảo sức mạnh của nó trong vấn đề này. Như tôi đã đề cập trước đây, việc xác thực tên người dùng và mật khẩu, giống như nhiều giao thức khác, có thể được đảm bảo bằng SSL / TLS. Mặc dù nhiều thiết bị IoT có dung lượng hoặc tài nguyên thấp có thể gặp vấn đề về quá tải công việc khi sử dụng loại giao tiếp an toàn này ...

Vì lý do này, nhiều thiết bị IoT sử dụng MQTT sử dụng mật khẩu và người dùng trong văn bản máy bay, điều này có thể khiến ai đó đánh hơi lưu lượng mạng để lấy chúng một cách rất dễ dàng. Và nếu điều đó là chưa đủ, nhà môi giới cũng có thể được định cấu hình để chấp nhận các kết nối ẩn danh, điều này sẽ cho phép bất kỳ người dùng nào thiết lập liên lạc, có rủi ro lớn hơn.

Sử dụng MQTT với Arduino

Arduino UNO với MQTT

Tất nhiên bạn có thể sử dụng giao thức MQTT với Arduino và các bảng phát triển khác, cũng như Rapsberry Pi, v.v. Để thực hiện việc này, bạn phải cung cấp kết nối cho bảng Arduino của mình nếu không có. Ngoài ra, thư viện Ứng dụng khách Arduino cho MQTT nó sẽ giúp bạn trong những nhiệm vụ này. Thư viện này tương thích với:

Bạn đã biết rằng bạn có thể tải xuống và cài đặt thư viện trong IDE Arduino của mình bằng lệnh: bản sao git https://github.com/knolleary/pubsubclient.git

Càng sớm càng mã để sử dụng MQTT trong một số ứng dụng, sự thật là nó đơn giản. Trong hình ảnh Fritzing, bạn có thể thấy một tấm bảng Arduino UNO kết nối bằng Arduino Ethernet đã được thêm vào và nó cũng đã được kết nối cảm biến nhiệt độ và độ ẩm DHT22, mặc dù nó có thể là bất cứ thứ gì khác ...

Ok, với điều đó đã nói, đối với mã bạn phải tạo trong IDE Arduino Để làm việc với giao thức MQTT trên Arduino, thật đơn giản:

  • đến gửi tin nhắn MQTT
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que se trabaja
const char* topicName = "test";

DHT dht(DHTPIN, DHTTYPE);
EthernetClient ethClient;
PubSubClient client(ethClient);

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet usando DHCP");
  }
// Puerto 1883 de comunicación
  client.setServer(mqtt_server, 1883);
  dht.begin();
}

void loop()
{
  if (!client.connected()) {
    Serial.print("Conectando ...\n");
    client.connect("Cliente Arduino");
  }
  else {
    // Envío de informacion del sensor de temperatura y humedad
    float temp = dht.readTemperature();
    char buffer[10];
    dtostrf(temp,0, 0, buffer);
    client.publish(topicName, buffer);
  }
  // Tiempo entre envíos en ms (cada 10 segundos)
  delay(10000);
}

  • đến nhận tin nhắn bởi MQTT bạn chỉ cần tấm Arduino UNO và kết nối, với Arduino Ethernet hoặc bất kỳ phần tử nào khác. Đối với mã, một ví dụ sẽ là:
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Direccion MAC del adaptador Ethernet
byte mac[] = { 0xCE, 0xAB, 0x0E, 0x3F, 0xFE, 0xD4 };

// IP del servidor (broker)
IPAddress mqtt_server(192, 168, 1, 4);

// Topic o tema con el que trabajr
const char* topicName = "test";

EthernetClient ethClient;
PubSubClient client(ethClient);

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("El mensaje ha llegado [");
  Serial.print(topic);
  Serial.print("] ");
  int i=0;
  for (i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup()
{
  Serial.begin(9600);
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Fallo en Ethernet al usar configuración DHCP");
  }
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback)
}

void loop()
{
  if (!client.connected()) {
      Serial.print("Conectando ...");
      if (client.connect("rece_arduino")) {
        Serial.println("conectado");
        client.subscribe(topicName);
      } else {
        delay(10000);
      }
  }
  // Cliente a la escucha
  client.loop();
}

Hãy nhớ rằng bạn phải thay đổi IP thành địa chỉ thích hợp cho máy chủ và bạn cũng phải thay đổi địa chỉ MAC của bộ điều hợp mạng Ethernet hoặc địa chỉ bạn đang sử dụng, cũng như phần còn lại của mã nếu bạn có ý định điều chỉnh nó một dự án khác. Đây chỉ là một ví dụ!

Để biết thêm thông tin, bạn có thể tải miễn phí của chúng tôi Hướng dẫn sử dụng PDF với khóa học Arduino IDE để bắt đầu lập trình.


Hãy là người đầu tiên nhận xét

Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.