MQTT: פרוטוקול רשת פתוח וחשיבותו ב- IoT

פרוטוקול MQTT רשת IoT

זכור את השם MQTT, מכיוון שמדובר בפרוטוקול תקשורת רשת M2M (Machine to Machine) שהולך להישמע לא מעט. זה הופך פופולרי למדי בזכות העידן החדש של האינטרנט של הדברים או ה- IoT (האינטרנט של הדברים) על ראשי התיבות שלו באנגלית. בנוסף, מדובר בפרוטוקול פתוח, הנותן יתרונות רבים.

למעשה, זה הפך לאחד מעמודי התווך המרכזיים של ה- IoT, מכיוון שהוא די טוב במכשירים עם מגבלות שידור כאלה. ראשי התיבות MQTT מקורם תור להעברת טלמטריה בתור, תקן פתוח מ- OASIS ו- ISO (ISO / IEC 20922) לתקשורת רשת ופועל בדרך כלל ב- TCP / IP המפורסם.

פרוטוקולי רשת

מודל OSI ושכבותיו

ل פרוטוקולי תקשורת הם כללים המאפשרים לשני מכשירים או מערכות לתקשר זה עם זה. כלומר, זהו פרוטוקול להעברת מידע באמצעים שונים ובפורמט מוגדר, בין אם מיושם על ידי תוכנה וחומרה (או שניהם).

El estándar של הפרוטוקול מגדיר מספר רב של מאפייני תקשורת. זה יכול לעבור מכללי הסינכרון, סמנטיקה, תחביר, פורמט מנות וכו '. והאמת היא שהם לא זניחים, מכיוון שבזכות פרוטוקולים אלה כיום אנו יכולים להשתמש באינטרנט וברשתות תקשורת אחרות ...

וכמובן, אין רק פרוטוקול אחד, אלא רבים. לדוגמה, המפורסם DNS, FTP, MQTT, HTTP ו- HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP וכו ', עבור שכבת היישום. בעוד בשכבת התחבורה ניתן למצוא כמה מפורסמים כמו TCP, UDP וכו ', כמו גם אלה של שכבת האינטרנט כגון IPv4 או IPv6 (זה שאיפשר את המספר הגדול ביותר של כתובות IP וזמינות ה- IoT), IPSec וכו ', ואחרים משכבת ​​הקישור כגון DSL, Ethernet, WiFi, ARP וכו'.

אודות פרוטוקולי IoT

פרוטוקול MQTT

כמובן, ישנם פרוטוקולי תקשורת ספציפיים או שניתן להחיל על ה- IOT. כלומר, בהתחשב בסעיף הקודם, הם יהיו סדרה של סטנדרטים מוגדרים כך ששני התקני IoT או יותר יוכלו לתקשר ולהבין זה את זה, והם בדרך כלל M2M, כלומר תקשורת בין מכונה למכונה. התקני IoT רבים המחוברים ומשתפים מידע מחיישנים או ממקורות אחרים.

בשל המספר הרב של מכשירי ה- IoT, פרוטוקולים אלה חייבים לעמוד בדרישות מעבר למגבלות רוחב הפס, המהירות וכו '. (שימו לב כי מכשירים רבים מוטבעים וזולים), מה שבדרך כלל נמצא במכשירים מסוימים. ואני מתכוון לעובדה ש חייב להיות מדרגי, כדי להיות מסוגל להוסיף מכשירים מחוברים יותר במידת הצורך ומבלי להשפיע על המערכת הגלובלית.

כמו כן, עליהם להיות עם תלות נמוכה צימוד בין התקנים, כך שלא ייווצרו בעיות אם מכשיר יוסר. וכמובן, במקביל, מחפשים יכולת פעולה הדדית גבוהה כך שהיא עובדת עם מספר גדול של מכשירים ומערכות מגוונות מאוד, מכיוון שעולם ה- IoT הוא הטרוגני למדי.

תכונות שימושיות אחרות יהיו קלות היישום שלהן, הביטחון, וכו. זכור כי ה- IoT יוצר אתגרים גדולים בהיבט הביטחוני. יתרה מכך כאשר רבים מהמכשירים המחוברים נוטים להיות קריטיים במקרים מסוימים ... למשל צעצועים לקטינים.

מושגים חשובים

עם זאת, יש לומר כי פתרונות ל- IoT משתמשים בשרת מרכזי כדי לקבל את ההודעות מכל המכשירים המחוברים הנפלטים ומפיצים אותם לכל מכשירי ה- IoT המחוברים שמאזינים. שרת זה הוא מה שמכונה נתב או מתווך. משהו שרחוק מבחינות מסוימות רחוק מהיחסים בין שרת לקוח קונבנציונאלי.

יתר על כן, המתודולוגיות שאתה יכול למצוא בפרוטוקולי התקשורת האלה עבור IoT הם:

  • PubSub: פרסום / רישום הוא דפוס העברת הודעות שבו מכשיר (Sub) מודיע למתווך שהוא רוצה לקבל הודעה, בעוד מכשיר אחר (Pub) מפרסם הודעות למתווך להפיץ למכשירים / ים האחרים שמחכים להם.
  • rRPC: שיחות נוהל של Remoder Remoder הוא דפוס נוסף של ביצוע תהליכים מרחוק. בו מכשיר (Callee) מודיע למתווך שהוא יבצע הליך מסוים והמתווך מפיץ אותו למכשיר אחר (Caller) עליו מתבצע התהליך האמור.

כעת, כדי לבצע מתודולוגיות או דפוסים אלה, א תשתית הודעות. ובמובן זה ניתן להבחין בין שניים:

  • תור להודעות: שירות העברת הודעות בו נוצר תור הודעות יחיד לכל הלקוחות היוזמים מנוי למתווך. האחרון ישמור על ההודעות עד למסירתם ללקוח. אם הלקוח או הנמען אינם מחוברים, הם נשמרים עד שהם מחוברים. שירותים מסוג זה הם כמו אלה המשמשים באפליקציות מסרים מיידיים כגון Telegra, WhatsApp, Messenger וכו '.
  • שירות הודעות: זהו שירות נוסף בו המתווך שולח את ההודעות ללקוח המקבל המחובר, ומסנן לפי סוג ההודעה. אם הלקוח או המכשיר המקבל מנותקים, ההודעות אבדו (אם כי ייתכן שיש מערכת רישום כלשהי).

פרוטוקולי IoT

לאחר שראינו את האמור לעיל, בואו נסתכל מקרוב פרוטוקולי IoT שידועים יותר. בין הבולטים ב- M2M הם:

  • AMQP (פרוטוקול תור מתקדם להודעות): הוא פרוטוקול מסוג PubSub של תור הודעות. תוכנן כך שיהיה יכולת פעולה הדדית טובה ותבטיח אמינות. מיוחד ליישומים ארגוניים, ביצועים גבוהים, רשתות זמן אחזור, קריטיים וכו '.
  • WAMP (פרוטוקול העברת יישומי אינטרנט): זהו פרוטוקול פתוח נוסף מסוג PubSub כמו rRPC, והוא פועל ב- WebSockets.
  • CoAP (פרוטוקול יישומים מוגבל): הוא פרוטוקול שתוכנן במיוחד עבור יישומים בעלי קיבולת נמוכה.
  • TOMP (פרוטוקול העברת הודעות מונחה טקסט): פרוטוקול פשוט מאוד ולהשגת יכולת פעולה הדדית מקסימלית. HTTP משמש להעברת הודעות טקסט.
  • XMPP (פרוטוקול העברת הודעות ונוכחות eXtensible): פרוטוקול נוסף המשמש ב- IoT ליישומי מסרים מיידיים ומבוסס על XML. יאן גם המקרה הזה פתוח.
  • WMQ (תור הודעות WebSphere): פרוטוקול שפותח על ידי IBM. זה מסוג תור ההודעות, כפי ששמו מרמז, והוא מכוון למסרים.
  • MQTT: (ראה סעיף הבא)

הכל על MQTT

חבילת MQTT

El פרוטוקול MQTT זהו פרוטוקול תקשורת של Message Queue, העוקב אחר תבנית PubSub, וסוג M2M, כפי שכבר ציינתי. הוא נמצא בשימוש נרחב ב- IoT, ומבוסס על ערימת TCP / IP המשמשת באינטרנט.

במקרה של MQTT, כל קשר נשמר פתוח והוא נעשה שימוש חוזר בכל תקשורת נחוצה. משהו שונה ממה שקורה בפרוטוקולים ידועים אחרים, שכל תקשורת מתקיימת דורשת חיבור חדש.

יתרון

היתרונות של פרוטוקול MQTT ניכרים היטב מבחינת תקשורת M2M עבור IoT. בנוסף לכל האמור לעיל, זהו פרוטוקול המספק:

  • מדרגיות, לחבר בין יותר ויותר לקוחות.
  • ניתוק בין לקוחות, לתלות פחותה.
  • אסינכרוניזם.
  • פַּשְׁטוּת.
  • קלילות כדי לא לצרוך יותר מדי משאבים (אם כי עם אבטחת TLS / SSL זה עולה).
  • חסכוני באנרגיה למכשירים התלויים בסוללה או בעבודה 24/7, הוא אינו זקוק לרוחב פס גדול (אידיאלי עבור חיבורים איטיים, כמו חלקים אלחוטיים).
  • אבטחה ואיכות, לאמינות וחוסן גדולים יותר בתקשורת.

היסטוריה

MQTT נוצר בשנות ה -90, עם גרסה מוקדמת של ה- פרוטוקול בשנת 1999. הוא נוצר על ידי ד"ר אנדי סטנפורד-קלארק מ- IBM וארלן ניפר מ- Cirrus Link (לשעבר יורוטק).

La רעיון ראשוני היה ליצור פרוטוקול לניטור צינור שעבר במדבר, עם פרוטוקול תקשורת יעיל (צריכת רוחב פס נמוך), אור וכי צריכת אנרגיה נמוכה. באותה תקופה זה היה מאוד יקר, אבל עכשיו זה הפך לפרוטוקול זול ופתוח.

הפרוטוקול הראשוני שופר עם הופעתו של גרסאות חדשות, כגון MQTT v3.1 (2013) תחת המפרט OASIS (ארגון לקידום תקני מידע מובנים) וכו '. אתה צריך לדעת שבהתחלה זה היה פרוטוקול קנייני של IBM, אבל שהוא ישוחרר בשנת 2010, ובסופו של דבר זה הפך לסטנדרט ב- OASIS ...

איך עובד חיבור MQTT

פרוטוקול MQTT משתמש פילטר, עבור ההודעות הנשלחות לכל לקוח, בהתבסס על נושאים או נושאים המאורגנים באופן היררכי. באופן זה, לקוח יכול לפרסם הודעה בנושא ספציפי. באופן זה, כל אותם לקוחות או מכשירים מחוברים שמנויים לנושא יקבלו הודעות דרך המתווך.

כמו גם MQ, הודעות יישארו בתור והם לא הולכים לאיבוד עד שהלקוח קיבל את ההודעה.

החיבורים, כפי שציינתי גם הם, נוצרים באמצעות TCP / IP, והשרת או המתווך ישמור תיעוד של הלקוחות המחוברים. כברירת מחדל, ההתקנים ישתמשו ביציאות תקשורת מספר 1883, אם כי ייתכן שתיתקל גם ביציאה 8883 אם אתה משתמש ב- SSL / TLS לצורך אבטחה נוספת.

כדי שהחיבור יהיה אפשרי, לא רק לקוחות, שרתים ויציאות נדרשים. גם אחרים חבילות או הודעות שנשלחו כדי שהתקשורת תתקיים:

  • יצירת קשר: הודעת CONNECT / חבילה שנשלחה על ידי הלקוח עם כל המידע הדרוש. מידע זה כולל את מספר הלקוח, שם המשתמש, הסיסמה וכו '. המתווך או השרת מגיבים עם חבילת CONNACK שתודיע ללקוח שהחיבור התקבל, נדחה וכו '.
  • שלח וקבל הודעותלאחר שהחיבור נוצר, נעשה שימוש בחבילות או בהודעות PUBLISH עם הנושא ועומס המטען של ההודעה שנשלח למתווך. מצד שני, הלקוח או הלקוחות המעוניינים משתמשים בחבילות SUBSCRIBE ו- UNSUSCRIBE כדי להירשם כמנוי או למשוך את המנוי שלהם בהתאמה. המתווך גם יגיב עם חבילת SUBACK ו- UNSUBACK בהתאמה כדי לדווח על הצלחת הפעולה אותה ביקש הלקוח.
  • שמירה על הקשר: כדי להבטיח שהחיבור יישאר פתוח, לקוחות יכולים לשלוח מעת לעת חבילת PINGREQ שתותאם לחבילה PINGRESP מהשרת.
  • סיום החיבור: כאשר לקוח מתנתק הוא שולח מנות DISCONNECT כדי לדווח על אירוע זה.

אלה הודעות או חבילות אלה שדיברתי עליהם הם בעלי מבנה זהה לחבילות אחרות של פרוטוקולי רשת אחרים:

  • כותרת עליונה או כותרת קבועה: הוא חלק קבוע שתופס בין 2-5 בתים. הוא מכיל קוד בקרה, מזהה של סוג ההודעה שנשלחה ואורכו. בין 1-4 בתים משמשים לקידוד האורך, תוך שימוש בשבעת הסיביות הראשונות של כל אוקטטה כנתונים לאורך וסיבית המשכיות נוספת כדי לקבוע שיש יותר מבית אחד שמרכיב את אורך ההודעה.
  • כותרת משתנה: לא תמיד חובה, אלא אופציונלי. זה כלול רק בחבילות מסוימות במצבים מסוימים או בהודעות ספציפיות.
  • תוכן או נתונים: נתוני החבילה הם מה שמכיל בפועל את ההודעה שיש לשלוח. זה יכול להיות ממספר kB עד מגבלת 256 מגהבייט.

אם אתה מעוניין לדעת הקוד המתאים בהקסדצימלי עבור סוגי ההודעות שנשלחו הם:

הודעה ³ CA אומר
לְחַבֵּר 0x10
קונק 0x20
לפרסם 0x30
PUBACK 0x40
pubrec 0x50
PUBREL 0x60
pubcomp 0x70
מנוי 0x80
SUBACK 0x90
UNSCRIBE 0xA0
תתבטל 0xB0
פינגרק 0xC =
PINGRESP 0xD0
התנתק 0xE0

איכות וביטחון התקשורת

פרט חשוב נוסף במסרים של MQTT הוא ה- איכות השירות או QoS, וביטחון. החוסן של מערכת התקשורת במקרה של כשלים ובטיחותה יהיה תלוי בכך.

לגבי האיכות שלה, ניתן לקבוע אותה 3 רמות שונות:

  • QoS 0 (אי ידיעה)- ההודעה נשלחת פעם אחת בלבד, ובמקרה של כישלון היא לא תימסר. משתמשים בו כאשר הוא לא קריטי.
  • QoS 1 (אשר): ההודעה תישלח פעמים רבות ככל שיידרש כדי להבטיח מסירה ללקוח. החיסרון הוא שהלקוח יכול לקבל את אותה הודעה מספר פעמים.
  • QoS 2 (מובטח)- בדומה לאמור לעיל, אך מובטח שיימסר רק פעם אחת. הוא משמש לעתים קרובות למערכות קריטיות יותר בהן יש צורך באמינות רבה יותר.

מצד שני, לגבי אבטחת MQTT, ניתן להשתמש באמצעים שונים כדי להבטיח את חוזקה בהקשר זה. כפי שכבר ציינתי בעבר, ניתן להבטיח אימות של שם המשתמש והסיסמה, כמו פרוטוקולים רבים אחרים, באמצעות SSL / TLS. אף על פי שהתקני IoT רבים בעלי קיבולת נמוכה, או משאבים, עלולים להיתקל בבעיית עומס העבודה בעת שימוש בתקשורת מאובטחת מסוג זה ...

מסיבה זו, מכשירי IoT רבים המשתמשים ב- MQTT משתמשים בסיסמאות ומשתמשים ב- טקסט רגיל, מה שעלול לגרום למישהו לרחרח תעבורת רשת כדי להשיג אותם בקלות רבה. ואם זה לא מספיק, ניתן להגדיר את המתווך גם לקבל חיבורים אנונימיים, שיאפשרו לכל משתמש ליצור תקשורת, הכרוך בסיכון גדול יותר.

שימוש ב- MQTT עם Arduino

Arduino UNO עם MQTT

כמובן שאתה יכול השתמש בפרוטוקול MQTT עם Arduino ולוחות פיתוח אחרים, כמו גם Rapsberry Pi וכו '. לשם כך, עליך לספק ללוח Arduino שלך קישוריות, אם אין לו את זה. כמו כן, הספרייה לקוח Arduino עבור MQTT זה יעזור לך במשימות אלה. ספרייה זו תואמת ל:

אתה כבר יודע שאתה יכול להוריד ולהתקין את הספרייה ב- Arduino IDE שלך באמצעות הפקודה: שיבוט git https://github.com/knolleary/pubsubclient.git

ברגע לקוד כדי להשתמש ב- MQTT ביישום כלשהו, ​​האמת היא שזה פשוט. בתמונת ה- Fritzing ניתן לראות לוח Arduino UNO לאיזו קישוריות באמצעות ארדואינו אתרנט התווספה והיא גם מחוברת חיישן לחות וטמפרטורה DHT22, למרות שזה יכול היה להיות כל דבר אחר ...

בסדר, עם זאת, עבור הקוד שאתה צריך לייצר בו Arduino IDE לעבוד עם פרוטוקול MQTT על Arduino, זה כל כך פשוט:

  • כדי שלח הודעות 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);
}

  • כדי לקבל הודעות על ידי MQTT אתה צריך רק את הצלחת Arduino UNO וחיבור, עם Arduino Ethernet או כל אלמנט אחר. באשר לקוד, דוגמה תהיה:
#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();
}

זכור כי עליך לשנות את ה- IP המתאים לשרת, ועליך לשנות את כתובת ה- MAC של מתאם רשת ה- Ethernet שלך או את זו שבה אתה משתמש, כמו גם את שאר הקוד אם בכוונתך להתאים אותו פרויקט אחר. זו רק דוגמא!

לקבלת מידע נוסף, אתה יכול להוריד בחינם שלנו מדריך PDF עם קורס Arduino IDE להתחיל בתכנות.


היה הראשון להגיב

השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.