Путаница в установлении соединения клиент-сервер в MQTT

19

Согласно спецификациям , клиент всегда должен устанавливать соединение с сервером.

Клиент:

Программа или устройство, которое использует MQTT. Клиент всегда устанавливает сетевое соединение с сервером . Он может

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

  • Подпишитесь на заявку Заявки на сообщения, которые она заинтересована в получении.

  • Отмените подписку, чтобы удалить запрос на сообщения приложения.

  • Отключиться от Сервера.

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

Сервер:

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

  • Принимает сетевые подключения от клиентов.

  • Принимает сообщения приложений, опубликованные клиентами.

  • Процессы Подписка и Отмена подписки запросов от клиентов.

  • Пересылает сообщения приложений, которые соответствуют клиентским подпискам .

Означает ли это, что если клиент подписывается, то он остается подключенным к серверу, пока подписка действительна, хотя в большинстве случаев поток данных отсутствует?

Я пришел к такому выводу, потому что, если клиент отключается после подписки, то сервер не может пересылать ему сообщения, потому что именно клиент должен установить соединение. Но он не будет знать, когда восстановить его.

Бенс Кауликс
источник

Ответы:

11

Означает ли это, что если клиент подписывается, то он остается подключенным к серверу, пока подписка действительна, хотя в большинстве случаев поток данных отсутствует?

Да, после установления соединения клиент будет ждать сообщений, однако он также будет регулярно отправлять сообщения PING на сервер на основе значения keepalive. Если сообщение PING не получено сервером, оно может отключить вас.

если клиент отключается после подписки, то сервер не может пересылать ему сообщения, потому что именно клиент должен установить соединение.

Если клиент отключен, то да, он не будет получать сообщения, однако в MQTT есть функции, которые обходят эту проблему.

Если клиент подключается к серверу с флагом «Очистить сеанс», установленным в значение «ложь», сервер запомнит подписку на этот идентификатор клиента. Как только клиент переподключится, ему не нужно будет повторно подписываться, так как сервер запомнит это.

Кроме того, вы можете подписаться, используя Уровень QoS 1 или 2. С этими Уровнями QoS Сервер будет хранить сообщения и ждать, пока клиент повторно подключится, прежде чем отправлять их. Таким образом, даже если клиент отключится и снова подключится, он все равно получит все опубликованные сообщения.

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

jpwsutton
источник
9

Означает ли это, что если клиент подписывается, то он остается подключенным к серверу, пока подписка действительна, хотя в большинстве случаев поток данных отсутствует?

Да, ваш клиент будет ждать сообщений.

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

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

Goufalite
источник
1

Вы должны различать связь и сессию.

Все определяется сессией. Когда MQTT-соединение авторизируется брокеру в первый раз, брокер создает сеанс для этого соединения, обычно на основе параметра соединения client-id.

В протоколе MQTT 3.1.1 (по умолчанию в настоящее время используется большинством клиентов / брокеров) во время соединения вы можете указать флаг clean = true или clean = false. Если clean = true, то брокер автоматически создаст новый сеанс и закроет его, когда соединение разорвано / закрыто. Если clean = false, брокер будет поддерживать сеанс и доставлять туда события (в какое-то хранилище сеансов), даже когда клиент отключен. Это зависит от реализации брокеров, если она вообще разрешает сеанс clean = false, и каков максимальный ttl такого сеанса.

В протоколе MQTT 5.0 (очень свежий, но перспективный) можно указать сеанс ttl со стороны клиента или даже изменить его после установления соединения. Это чрезвычайно полезно для нестабильных WAN-соединений (в основном IoT) или соединений с состоянием, как вы описали.

AFAIK в настоящее время MQTT протокол 5.0 с точки зрения клиента может быть использован в Python с gmqtt и в JavaScript с mqtt.js .

ШЭЛ
источник