Есть ли способ хранения недоставленных сообщений для конкретного клиента? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь реализовать метод связи между клиентом и администратором (двунаправленный) с помощью Paho MQTT JS + Mosquitto broker 1.6.8, и у меня возникают некоторые проблемы с сохраненными сообщениями и постоянными сеансами.

Что я хочу сделать sh: Мой веб-клиент подписан на топи c, где администратор публикует (скажем, топик А), а администратор подписывается на топи c где клиент публикует (тема B). Когда кто-либо из пользователей получил сообщение для этой темы c, оно появляется на экране, и они продолжают появляться под предыдущим, чтобы сформировать список сообщений. Когда они оба в сети, они должны видеть отправляемые сообщения, а если они go в автономном режиме, они также должны видеть старые и новые сообщения. Кроме того, пользователи должны иметь возможность очистить список сообщений.

Что я пробовал до сих пор: Моя первая попытка состояла в том, чтобы установить опубликованные сообщения с сохраненным значением равным true, так что сообщение может быть доставлено будущим подписчикам. Однако я вижу, что сохраняется только последнее сообщение. Я исследовал и обнаружил, что могу установить sh постоянный сеанс (с помощью cleanSession: false) между брокером и клиентом, так что, если я установлю для qos сообщения значение больше 0 (0 или 1), а клиент подписавшись на топи c, они получат все недоставленные сообщения. Это не работает для меня, или, по крайней мере, так, как я ожидаю, что это будет работать. Я попытался удалить Mosquitto Db и перезапустить (ничего не изменилось). Я также попытался использовать один и тот же идентификатор для всех клиентов и другой идентификатор для всех администраторов, потому что я подумал, что, возможно, брокер сохраняет сообщения только для определенного clientID, поэтому, если подключается клиент с совершенно другим идентификатором, он не получит сообщения.

Существует ли способ доставки ВСЕХ недоставленных сообщений (из-за того, что один клиент находится в сети, а администратор в автономном режиме или наоборот), а не только las one (сохранен)? Или есть способ сохранить более одного сообщения (на мой взгляд, лучше, если бы я мог очистить оставшиеся сообщения, отправив нулевую полезную нагрузку)?

1 Ответ

0 голосов
/ 02 мая 2020

Сначала каждый клиент должен иметь уникальный идентификатор клиента. При наличии идентификатора клиента cla sh самый старый подключенный клиент будет отключен.

Во-вторых, это QoS подписки, а не publi sh, который определяет, будет ли посредник ставить в очередь сообщение для автономного режима. клиент с постоянным сеансом

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

  1. предварительно подключиться и подписаться на topi c с QoS, равным 1 или 2
  2. При повторном подключении необходимо использовать тот же идентификатор клиента, что и в прошлый раз
  3. Для параметра cleansession установлено значение false

Сообщения будут доставляться только один раз, поэтому нет необходимости очищать сообщения, но если вам не нужно получать сообщения в очереди, установите для параметра cleansession fla sh значение true.

Брокер сохранит только последнее сообщение, опубликованное в данной теме. c с установленным оставленным битом, изменить это невозможно.

...