Лекція 2.2. Передача даних в архітектурі IIoT: MQTT

4. Деталі архітектури MQTT

MQTT може зберігати повідомлення в брокері необмежено довго. Цей режим роботи керується прапорцем. Збережене на брокері повідомлення відправляється будь-якому клієнту, який підписується на цю тематичну гілку MQTT. Повідомлення негайно відправляється цьому новому клієнту. Це дозволяє йому отримати статус або сигнал з теми, на яку він недавно підписався, без очікування. Як правило, клієнт, що підписується на тему, може очікувати годину або навіть дні, перш ніж інший клієнт-видавець опублікує нові дані.

MQTT означує додатковий об'єкт під назвою Остання воля і заповіт (LWT). LWT - це повідомлення, яке вказує клієнт під час етапу підключення. LWT містить тему «Остання воля», QoS і фактичне повідомлення. Якщо клієнт неправильно відключається від брокерського з'єднання (наприклад, тайм-аут keep-alive, помилка введення-виведення або клієнт закриває сеанс без відключення), тоді брокер зобов'язаний транслювати повідомлення LWT всім іншим підписаним на цю тему клієнтам.

Незважаючи на те, що MQTT заснований на TCP, з'єднання все ще можуть обриватися, особливо в разі бездротових датчиків. Пристрій може втратити живленя, зв'язок, або може бути просто польова поломка, і сеанс перейде в напіввідкритий стан (тобто з одного боку вважається що з’єднання є, а з іншого воно відсутнє). Тоді сервер буде вважати, що з'єднання як і раніше є надійним і очікувати дані. Щоб вийти з цього напіввідкритого стану, MQTT використовує систему keep-alive (утримування). Використовуючи цю систему, як брокер MQTT, так і клієнт мають гарантію того, що з'єднання залишається працездатним, навіть якщо протягом деякого часу не було передачі. Після отримання чергового будь-якого пакету, таймери keep-alive скидаються на клієнті і сервері і починають відлік. Якщо протягом часу keep-alive клієнти не мають даних для відправки, вони повинні сформувати відправити пакет PINGREQ брокеру, який, в свою чергу, підтверджує повідомлення за допомогою PINGRESP. Якщо протягом півтора часу keep-alive пакет не буде отримано, брокер закриє з’єднання і відправить LWT-пакет всім клієнтам. Максимальний час  keep-alive – 18 годин 12 хвилин 15 секунд.

MQTT дозволяє також підтримувати постійні з’єднання. Постійні з’єднання зберігає на стороні брокера наступне:

  • всі підписки клієнта
  • всі повідомлення QoS, які не були підтверджені клієнтом
  • всі нові повідомлення QoS, пропущені клієнтом 

Параметр client_id посилається на цю інформацію для унікальної ідентифікації клієнтів. Клієнт може запитувати постійне з'єднання, проте брокер може відхилити запит і примусово перезапустити новий сеанс. При з'єднанні брокером використовується прапорець cleanSession для дозволу або заборони постійних з'єднань. Клієнт може визначити, чи збереглося постійне з'єднання за допомогою повідомлення CONNACK.

Постійні сеанси повинні використовуватися для клієнтів, які повинні отримувати всі повідомлення, навіть коли немає зв'язку. Вони не повинні використовуватися в ситуаціях, коли клієнт тільки публікує (записує) дані в теми.