Как найти связанные данные клиента MQTT

Есть ли способ найти все связанные данные клиента (IP и имя) с другого клиента? Я знаю, что есть тема "$ SYS/broker/clients/active", которая дает количество подключенных клиентов, но если я хочу узнать больше о каждом подключенном клиенте, есть ли способ?

Я разрабатываю решение, в котором количество клиентов будет подключено (используя беспроводную сеть) к брокеру MQTT, расположенному на сервере. У меня также будет другой клиент, работающий на том же компьютере, и связанный с брокером, который будет наблюдать, если какой-либо новый клиент, связанный с брокером или для клиента, отключенного. Я вижу сообщение на консоли брокера, когда новый клиент подключается или подключенный клиент отключается. Можем ли мы получить что-то подобное от клиента, подключенного к брокеру? Пожалуйста, предложите, какой был бы лучший способ достичь этого?

Спасибо заранее.

-Dilip

Ответ 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, которая содержит всю интересующую вас информацию.

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

Это не идеальный подход; надеюсь, что ваша реализация брокера предоставит некоторые серверные средства для этого.

Ответ 2

как Knolleary уже заявил, что это конкретная реализация и не предоставляется самой MQTT.

Одним из решений может быть использование брокера HiveMQ MQTT. Он имеет плагин SDK, который позволяет вам выполнять такую ​​настройку по обратным вызовам, что означает, что каждый раз, когда клиент подключается, отключается, отправляет сообщение, подписывается на сообщение, вы можете выполнить собственный код, например, в случае отправки электронной почты. При написании собственного кода вы можете получить доступ ко всей информации о клиенте, которая вызвала обратный вызов. Поэтому было бы легко реализовать ваше поведение. Единственное, где вы храните адрес электронной почты? Это имя пользователя?

Для получения дополнительной информации о написании пользовательских плагинов HiveMQ см. руководство по началу работы и пример плагина на GitHub

(Раскрытие информации: Я являюсь одним из разработчиков HiveMQ)

Cheers, Крис