Ответ 1
В исходном вопросе или ответах на последующие вопросы укажите, какую именно брокерскую реализацию вы используете. Таким образом, может быть более эффективный ответ на ваш вопрос.
Без этой информации позвольте сосредоточиться на том, что вы можете сделать в самом протоколе.
MQTT поддерживает RETAINED сообщения. Именно здесь брокер будет хранить самое последнее сохраненное сообщение против каждой темы. Когда клиент подписывается на тему, он получит сохраненное сообщение (если оно существует).
Существует также функция Last Will and Testament (LWT) (к которой относится goetzchr), который может использоваться для публикации сообщения от имени клиента, если он аномально отключается.
Объединение этих двух функций позволяет вам создавать простую службу присутствия в брокерах, все в рамках протокола. Он работает следующим образом:
-
когда клиент подключается, он публикует сообщение RETAINED уникальной для него теме, например:
clients/my_client_id/state
с полезной нагрузкой
1
. (подставляяmy_client_id
собственным идентификатором клиента. -
он также при подключении устанавливает сообщение LWT для публикации в той же теме, но с полезной нагрузкой
0
. Это также должно быть сообщение RETAINED. -
когда клиент отключается, он публикует сообщение RETAINED в том же разделе с полезной нагрузкой
0
Это позволяет другому клиенту подписаться на clients/#
, чтобы получать все сообщения, указывающие изменения состояния подключения клиентов (полная тема, идентифицирующая клиента, и значение полезной нагрузки, указывающее состояние соединения).
Чтобы получить больше информации, чем просто подключенное состояние, клиенты могут публиковать другое сохраненное сообщение при подключении, к другой теме, например clients/my_client_id/info
, которая содержит всю интересующую вас информацию.
Это работает только в том случае, если вы контролируете всех клиентов, которые подключаются к вашему брокеру, и могут заставить их вести себя так.
Это не идеальный подход; надеюсь, что ваша реализация брокера предоставит некоторые серверные средства для этого.