2017-02-16 25 views
2

В настоящее время у нас есть приложение, которое управляет несколькими устройствами через MQTT. Каждое устройство подписывается на уникальную тему, названную по имени своего идентификатора устройства. Например, устройство A имеет идентификатор устройства 123, поэтому оно будет подписано на тему 123. Затем, если приложение захочет опубликовать управляющее сообщение на устройство A, оно опубликует тему с именем 123, которая является идентификатором устройства устройства A.Как опубликовать сообщение конкретному клиенту в Mosquitto MQTT

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

Итак, есть ли какой-либо другой способ, который мы можем сделать для достижения одной темы, но все же в состоянии публиковать сообщения для конкретных клиентов?

Спасибо!

+0

«Это действительно плохой дизайн». Почему ты так думаешь? Темы дешевы. 1000 тем не будут потреблять 1000x памяти. –

+0

@PavelZdenek Действительно? Я просто так думал, потому что думаю, что на память уйдет много памяти, если появится больше устройств. Конечно, 1000 - действительно небольшое количество, но что, если миллионы или даже больше. Хотя я не уверен в этом. –

+0

Ну, если вы подпишете миллионы устройств одному брокеру, это наверняка «займет много памяти». Но специфичность темы - это лишь небольшая часть памяти. Масштабируемость решается кластерами/мостами брокеров, а не с использованием неспецифических тем. Если вы планируете такую ​​крупномасштабную операцию, вы должны начать создавать разделы или «коды областей» перед вашими клиентами. –

ответ

5

Невозможно опубликовать сообщение одному абоненту на уровне протокола MQTT.

Один из ключевых арендаторов паб/подсистема - полностью отделить издателя от подписчиков, издателю не известно, есть ли какие-либо подписчики в данной теме, а тем более специально предназначенные для конкретного пользователя.

Использование темы для каждого устройства не является проблемой, так как их практически не накладные расходы брокера для каждой темы. Вы также можете использовать списки ACL для обеспечения того, чтобы каждый клиент мог подписаться только на свою тему (при этом все еще можно публиковать другим пользователям)

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

+0

Привет, спасибо за ответ. Если это так, то в чем заключается использование идентификатора клиента, который устанавливается клиентом при подключении к брокеру? –

+0

Клиентский идентификатор должен отслеживать постоянные подписки и как якорь для доставки сообщений с высоким QOS, которые были подписаны до того, как клиент уходит с линии – hardillb

+0

Насколько это возможно, я хочу ограничить количество тем. Я обнаружил, что другие брокеры MQTT могут фильтровать сообщения через идентификатор клиента, чтобы вы могли установить идентификатор клиента, а затем брокер отправит сообщение только этому клиенту. Возможно ли это только в зависимости от того, как реализуется брокер или это «стандарт» в MQTT? Потому что я не вижу такой возможности для Mosquitto –