MQTT: открытый сетевой протокол и его важность в IoT

Протокол MQTT сеть IoT

Помни имя MQTT, поскольку это протокол сетевого взаимодействия типа M2M (Machine to Machine), который будет звучать довольно много. Он становится довольно популярным благодаря новой эре Интернета вещей или IoT (Internet of Things) для его аббревиатуры на английском языке. Кроме того, это открытый протокол, который дает много преимуществ.

Фактически, он стал одним из центральных столпов Интернета вещей, поскольку неплохо работает на устройствах с такими ограничениями передачи данных. Аббревиатура MQTT происходит от Транспорт телеметрии очереди сообщений, открытый стандарт OASIS и ISO (ISO / IEC 20922) для сетевых коммуникаций, который обычно работает на знаменитом TCP / IP.

Сетевые протоколы

Модель OSI и ее уровни

протоколы связи Это правила, позволяющие двум или более устройствам или системам связываться друг с другом. То есть это протокол для передачи информации с помощью различных средств и в определенном формате, независимо от того, реализован ли он программно и аппаратно (или и тем, и другим).

El Estandar протокола определяет множество коммуникационных характеристик. Это могут быть правила синхронизации, семантика, синтаксис, формат пакета и т. Д. И правда в том, что ими нельзя пренебречь, поскольку благодаря этим протоколам сегодня мы можем использовать Интернет и другие сети связи ...

И, конечно, протоколов не один, а много. Например, знаменитый DNS, FTP, MQTT, HTTP и HTTPS, IMAP, LDAP, NTP, DHCP, SSH, Telnet, SNMP, SMTP и т. Д. Для уровня приложений. На транспортном уровне вы можете найти такие известные, как TCP, UDP и т. Д., А также те из уровня Интернета, как IPv4 или IPv6 (тот, который сделал возможным наибольшее количество доступных IP-адресов и появление IoT), IPSec и т. д. и другие с канального уровня, такие как DSL, Ethernet, WiFi, ARP и т. д.

О протоколах Интернета вещей

Протокол MQTT

Конечно, существуют определенные протоколы связи, которые могут быть применены к IoT. То есть, учитывая предыдущий раздел, они будут серией определенных стандартов, чтобы два или более IoT-устройства могли общаться и понимать друг друга, и обычно это M2M, то есть межмашинное взаимодействие. многие устройства IoT подключены и обмениваются информацией с датчиков или других источников.

Из-за большого количества устройств IoT эти протоколы должны соответствовать требованиям, выходящим за рамки ограничений полосы пропускания, скорости и т. Д. (обратите внимание, что многие устройства встроены и дешевы), что обычно есть в некоторых устройствах. И я имею в виду тот факт, что должен быть масштабируемым, чтобы иметь возможность при необходимости добавлять больше подключенных устройств, не влияя на глобальную систему.

Кроме того, они должны иметь низкая зависимость связь между устройствами, чтобы не возникало проблем при удалении устройства. И, конечно же, в то же время требуется высокая функциональная совместимость, чтобы он работал с большим количеством устройств и самых разных систем, поскольку мир IoT довольно неоднороден.

Другими полезными функциями могут быть простота их реализации, безопасность, так далее. Имейте в виду, что Интернет вещей создает серьезные проблемы с точки зрения безопасности. Тем более, что многие из подключенных устройств обычно критичны в определенных случаях ... например, игрушки для несовершеннолетних.

Важные понятия

Тем не менее, следует сказать, что решения для Интернета вещей используют централизованный сервер для получения сообщений от всех подключенных устройств, которые излучают и распространяют их на все подключенные устройства Интернета вещей, которые прослушивают. Этот сервер известен как маршрутизатор или брокер. То, что в некотором смысле далеко от обычных отношений клиент-сервер.

Кроме того, методологии которые вы можете найти в этих протоколах связи для Интернета вещей:

  • PubSub: Publish / Susbcribe - это шаблон обмена сообщениями, при котором устройство (Sub) информирует брокера о том, что оно хочет получить сообщение, в то время как другое устройство (Pub) публикует сообщения для брокера, чтобы передать их другому устройству / устройствам, ожидающим их.
  • рРПЦ: Вызов процедур удаленного маршрутизатора - это еще один образец удаленного выполнения процесса. В нем устройство (Callee) сообщает брокеру, что оно будет выполнять определенную процедуру, и брокер передает ее другому устройству (Caller), на котором выполняется указанный процесс.

Теперь, чтобы применить эти методологии или шаблоны, инфраструктура обмена сообщениями. И в этом смысле можно выделить два:

  • Очередь сообщений: служба обмена сообщениями, в которой создается единая очередь сообщений для всех клиентов, инициирующих подписку на брокера. Последний будет хранить сообщения до тех пор, пока они не будут доставлены клиенту. Если клиент или получатель не подключен, он сохраняется до тех пор, пока не будет подключен. Эти типы услуг аналогичны тем, которые используются в приложениях для обмена мгновенными сообщениями, таких как Telegra, WhatsApp, Messenger и т. Д.
  • Служба сообщений: это еще один сервис, в котором брокер отправляет сообщения подключенному клиенту-получателю, фильтруя его по типу сообщения. Если клиент или принимающее устройство отключены, сообщения теряются (хотя у него может быть какая-то система регистрации).

Протоколы Интернета вещей

Увидев вышесказанное, теперь рассмотрим подробнее. Протоколы Интернета вещей которые более известны. Среди наиболее известных M2M:

  • AMQP (Расширенный протокол очереди сообщений): - это протокол очереди сообщений типа PubSub. Разработан для обеспечения хорошей совместимости и надежности. Специально для корпоративных приложений, высокой производительности, сетей с высокой задержкой, критических и т. Д.
  • WAMP (протокол обмена сообщениями веб-приложений): это еще один открытый протокол типа PubSub, такой как rRPC, и он работает на WebSockets.
  • CoAP (протокол ограниченного приложения): это протокол, специально разработанный для приложений с низкой пропускной способностью.
  • TOMP (протокол потоковой передачи текстовых сообщений): очень простой протокол и для достижения максимальной совместимости. HTTP используется для передачи текстовых сообщений.
  • XMPP (расширяемый протокол обмена сообщениями и присутствием): еще один протокол, используемый в IoT для приложений обмена мгновенными сообщениями и основанный на XML. Яна: это дело тоже открыто.
  • WMQ (очередь сообщений WebSphere): протокол, разработанный IBM. Он относится к типу очереди сообщений, как следует из названия, и ориентирован на сообщения.
  • MQTT: (см. следующий раздел)

Все о MQTT

Пакет MQTT

El Протокол MQTT Это протокол связи очереди сообщений, который следует шаблону PubSub и относится к типу M2M, как я уже упоминал. Он широко используется в IoT и основан на стеке TCP / IP, используемом в Интернете.

В случае MQTT, каждое соединение остается открытым и он повторно используется во всех необходимых коммуникациях. В отличие от других известных протоколов, каждое взаимодействие требует нового соединения.

преимущество

Преимущества протокола MQTT очевидны с точки зрения M2M-коммуникаций для IoT. Помимо всего вышесказанного, это протокол, который обеспечивает:

  • Масштабируемость, чтобы подключать все больше и больше клиентов.
  • Разделение между клиентами для уменьшения зависимости.
  • Асинхронизм.
  • Простота.
  • Легкость, чтобы не потреблять слишком много ресурсов (хотя с безопасностью TLS / SSL она увеличивается).
  • Энергоэффективность для устройств, которые зависят от батареи или работают 24/7, ему не нужна большая пропускная способность (идеально подходит для медленных подключений, таких как некоторые беспроводные).
  • Безопасность и качество для большей надежности и устойчивости связи.

история

MQTT был создан в 90-х годах с ранней версией протокол 1999 г.. Его создали доктор Энди Стэнфорд-Кларк из IBM и Арлен Ниппер из Cirrus Link (ранее Eurotech).

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 байтов, с использованием первых 7 бит каждого октета в качестве данных для длины и дополнительного бита непрерывности, чтобы определить, что длина сообщения составляет более одного байта.
  • Заголовок переменной: не всегда обязательно, но необязательно. Он содержится только в некоторых пакетах в определенных ситуациях или в определенных сообщениях.
  • Контент или данные: пакетные данные - это то, что на самом деле содержит отправляемое сообщение. Его размер может составлять от нескольких кбайт до 256 Мбайт.

Если вам интересно узнать соответствующий код в шестнадцатеричном формате для типов отправляемых сообщений:

Сообщение Код
ПОДКЛЮЧИТЬ 0x10
КОННАК 0x20
ПУБЛИКОВАТЬ 0x30
ПАБАК 0x40
ПУБРЕК 0x50
ПУБРЕЛ 0x60
ПУБКОМП 0x70
ПОДПИСАТЬСЯ 0x80
СУБАК 0x90
ОТКАЗАТЬСЯ 0xA0
ОТПРАВИТЬ 0xB0
ПИНГРЕК 0xC =
ПИНГРЕСП 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 с помощью команды: git-клон https://github.com/knolleary/pubsubclient.git

Как только к коду для использования MQTT в некоторых приложениях правда в том, что это просто. На изображении Fritzing вы можете увидеть бляшку. Arduino UNO к которому подключение было добавлено Arduino Ethernet, и оно также было подключено датчик влажности и температуры 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 (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.