Как найти подключенные данные клиента MQTT
есть ли способ узнать обо всех подключенных деталях клиента (IP & name) от другого клиента? Я знаю, что есть тема "$SYS / broker/clients / active", которая дает количество подключенных клиентов, но если я хочу узнать больше о каждом подключенном клиенте, есть ли способ?
Я разрабатываю решение, в котором количество клиентов будет подключено (используя беспроводную сеть) к брокеру MQTT, расположенному на сервере. У меня также будет другой клиент, работающий на той же машине и подключен к брокеру, который будет наблюдать, если какой-либо новый клиент, связанный с брокером или для клиента отключается. Я могу видеть сообщение на консоли брокера, когда новый клиент подключается или подключенный клиент отключается. Можем ли мы получить что-то подобное от клиента, подключенного к брокеру? Пожалуйста, предложите, как лучше всего этого добиться?
спасибо заранее.
-Дилип
2 ответов
ваш исходный вопрос, ни ответы на последующие вопросы определить, какой брокер реализации вы используете. Таким образом, может быть более эффективный ответ на ваш вопрос.
без этой информации, давайте сосредоточимся на том, что вы можете сделать в сам протокол.
MQTT поддерживает сохраненные сообщения. Здесь брокер будет хранить самое последнее сохраненное сообщение по каждой теме. Когда клиент подписывается на тему, он получает сохраненное сообщение (если таковой существует).
существует также функция Last Will and Testament (LWT) (на которую ссылается goetzchr), которая может быть использована для публикации сообщения от имени клиента, если оно ненормально отключается.
объединение этих двух функций позволяет создать простой сервис присутствия на брокере, все в рамках протокола. Он работает следующим образом:
-
когда клиент подключается, он публикует сохраненное сообщение в тему, уникальную для него, для пример:
clients/my_client_id/state
С нагрузкой
1
. (заменяяmy_client_id
с собственным идентификатором клиента. он также при подключении устанавливает сообщение LWT для публикации в той же теме, но с полезной нагрузкой
0
. Это также должно быть сохраненным сообщением.когда клиент отключается чисто, он публикует сохраненное сообщение в той же теме с полезной нагрузкой
0
этот позволяет другому клиенту подписаться на clients/#
для получения всех сообщений, указывающих на изменения состояния соединения клиентов (полный раздел, идентифицирующий клиента, и значение полезной нагрузки, указывающее состояние соединения).
чтобы получить больше информации, чем просто состояние подключения, клиенты могут публиковать другое сохраненное сообщение при подключении к другой теме, например clients/my_client_id/info
это содержит всю интересующую вас информацию.
это работает только если у вас есть контроль всех клиентов, которые подключаются к вашему брокеру и могут заставить их вести себя так.
это не идеальный подход; надеюсь, ваша реализация брокера предоставит некоторые серверные средства для этого.
Как уже заявил Knolleary, это конкретная реализация и не предоставляется самим MQTT.
одним из решений может быть использование брокер HiveMQ MQTT. Он имеет плагин SDK, который позволяет вам делать такую настройку по обратным вызовам, то есть каждый раз, когда клиент подключается, отключается, отправляет сообщение, подписывается на сообщение, которое вы можете выполнить пользовательский код, как в вашем случае отправка электронной почты. При написании пользовательского кода Вы можете получить доступ ко всей информации о клиент, который вызвал обратный вызов. Таким образом, было бы легко реализовать ваше поведение. Единственное, где вы храните адрес электронной почты? Это имя пользователя?
для получения дополнительной информации о написании пользовательских плагинов HiveMQ см. руководство по началу работы и пример плагина на GitHub
(раскрытие информации: я один из разработчиков HiveMQ)
Ура, Крис!--1-->