Плутанина щодо встановлення з'єднання клієнт-сервер у MQTT


19

Відповідно до специфікацій , завжди клієнт повинен встановити з'єднання з сервером.

Клієнт:

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

  • Публікуйте повідомлення про додатки, які можуть зацікавити інших клієнтів.

  • Підпишіться на запит Повідомлень програми, які він зацікавлений у отриманні.

  • Скасуйте підписку, щоб видалити запит на повідомлення програми.

  • Відключіться від сервера.

І якщо цей клієнт підписався на повідомлення про програму, сервер повинен переслати ці повідомлення саме цьому клієнту.

Сервер:

Програма або пристрій, який виступає посередником між Клієнтами, які публікують Повідомлення програми, та Клієнтами, які зробили підписку. Сервер

  • Приймає мережеві з'єднання від клієнтів.

  • Приймає повідомлення про додатки, опубліковані Клієнтами.

  • Процеси Підписка та скасування підписки на запити клієнтів.

  • Пересилає повідомлення додатків, які відповідають клієнтським підпискам .

Чи означає це, що якщо клієнт підписується, він залишається підключеним до сервера, поки підписка є дійсною, хоча більшість часу немає потоку даних?

Я приходжу до такого висновку, оскільки якщо клієнт відключається після підписки, сервер не може пересилати йому повідомлення, оскільки саме той клієнт повинен встановити з'єднання. Але не буде відомо, коли його відновити.

Відповіді:


11

Чи означає це, що якщо Клієнт підписується, він залишається підключеним до сервера, поки підписка діє, хоча більшість часу немає потоку даних?

Так, після встановлення з'єднання клієнт буде чекати повідомлень, однак він також регулярно надсилатиме PING-повідомлення на сервер на основі значення keepalive. Якщо повідомлення PING не отримано сервером, воно може відключити вас.

якщо Клієнт відключається після підписки, сервер не може пересилати йому повідомлення, тому що саме Клієнт повинен встановити коннекцію.

Якщо клієнт відключений, то так, він не отримуватиме повідомлення, однак у MQTT є функції, які допомагають це зробити.

Якщо клієнт підключається до сервера, якщо прапорець «Очистити сеанс» встановлено на значення false, сервер запам'ятає підписку на цей ідентифікатор клієнта. Після того як клієнт знову підключиться, йому не потрібно буде повторно підписатися, оскільки сервер запам'ятав його.

Крім того, ви можете підписатися, використовуючи рівень QoS 1 або 2. За допомогою цих рівнів QoS Сервер буде зберігати повідомлення та чекати, коли клієнт знову підключиться, перш ніж надсилати їх. Таким чином, навіть якщо клієнт відключить і знову підключиться, він все одно отримає всі опубліковані повідомлення.

На цьому сайті є кілька хороших ресурсів, що пояснюють протокол MQTT.


9

Чи означає це, що якщо Клієнт підписується, він залишається підключеним до сервера, поки підписка діє, хоча більшість часу немає потоку даних?

Так, ваш клієнт буде чекати повідомлень.

... якщо Клієнт відключається після підписки, сервер не може пересилати повідомлення

Ви повинні керувати відключенням (особливо на пристроях, що живлять акумулятор). Це можна зробити за допомогою функції « останньої волі та заповіту » MQTT: коли пристрій відключиться, він надішле останнє повідомлення.


1

Ви повинні відрізняти з'єднання та сеанс.

Все визначається сеансом. Коли MQTT-з'єднання вперше дозволено брокеру, брокер створює сеанс для цього з'єднання, як правило, на основі параметра з'єднання-клієнт.

У протоколі MQTT 3.1.1 (за замовчуванням зараз у більшості клієнтів / брокерів) під час з'єднання ви можете вказати прапор clean = true або clean = false. Якщо clean = true, то брокер автоматично створить новий сеанс і закриє його, коли з'єднання перервано / закрито. Якщо clean = false, брокер підтримуватиме сеанс і доставлятиме туди події (у якесь сховище сеансу) навіть при відключенні клієнта. Це залежить від реалізації брокерів, якщо він взагалі дозволяє чистий = помилковий сеанс і який максимальний ttl такого сеансу.

У протоколі MQTT 5.0 (дуже свіжий, але перспективний) можна вказати сеанс ttl з боку клієнта або навіть змінити його після встановлення з'єднання. Це надзвичайно корисно для нестабільних WAN-з'єднань (здебільшого IoT) або стаціонарних з'єднань, як ви описали.

AFAIK в даний час MQTT протокол 5.0 з точки зору клієнта може бути використаний в Python з gmqtt і в JavaScript з mqtt.js .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.