Как отличить события публикации MQTT, исходящие от пользователей, от внутренних сообщений, предназначенных только для трансляции
Я использую Mosquitto MQTT клиент.
Например, у вас есть пользователи, которые публикуют и подписываются на темы. Тема фактически соответствует конечной точке REsT.
Сценарий 1 (типичное паб / суб-использование)
- Пользователь А подписывается на тему / устройство / 123 / meta
- Пользователь B публикует некоторые данные в теме / устройстве / 123 / meta
- по определению, эта публикация транслируется подписчикам
- у нас есть скрипт, подписанный на / devices / #, который знает, как сохранить полезную нагрузку для темы / device / 123 / meta, когда он получает опубликованные данные. Эти данные сохраняются в базе данных.
Сценарий 2
- Кто-то обновляет данные / устройство / 123 / meta через интерфейс ReST (или путем прямого обновления БД, ключ в том, что это не публикация MQTT).
- база данных обновлена
- брокеру MQTT отправляется сообщение публикации, чтобы все подписчики получали обновления в качестве полезной нагрузки.
Сценарий 2 - это то, что я пытаюсь обернуть вокруг. Это создает неприятную петлю обратной связи. Когда внутренние сообщения передаются, мой сценарий для работы с событиями публикации от пользователей не может отличить события публикации от стороннего пользователя от события внутренней публикации, предназначенного только для передачи некоторых данных (без сохранения необходимых данных).
Как мне справиться с этим? Сообщение MQTT очень упрощенное, и я не нахожу ничего, на чем можно было бы основывать логику. Я пытаюсь исследовать, используя происхождение как-то, но безуспешно. Я понимаю, что могу писать плагины, но это довольно сложная задача для комаров.
1 ответ
Невозможно определить, откуда пришло сообщение от абонента на уровне протокола MQTT. Частью протокола pub/sub является разделение издателей от подписчиков.
Самый переносимый способ сделать это - добавить флаг к фактической полезной нагрузке сообщения, чтобы указать, что сообщение было получено не из фактического устройства.
Или предполагая, что сообщение публикуется в результате, триггер в базе данных имеет проверку триггера, действительно ли входящее сообщение изменило сохраненное значение базы данных, если входящие сообщения соответствуют существующему состоянию БД, то нет необходимости переиздавать его.
Механизм плагинов Mosquitto в настоящее время предназначен только для написания решений по аутентификации и авторизации, но брокеры JavaScript mosca или Java HiveMQ поддерживают плагины, которые могут делать то, что вы хотите.