Некоторые старые устройства IoT не поддерживают перенастройку или обновления, что делает очень сложным изменение тем подписки MQTT. Функция перезаписи тем в RMQTT позволяет настроить набор правил, которые могут автоматически переписывать исходные темы на новые целевые темы во время подписки, отмены подписки или публикации.
Поскольку проверка авторизации публикации/подписки выполняется после перезаписи темы, важно убедиться, что переписанные темы проходят проверку ACL.
Перезапись темы при применении к подписке или отмене подписки клиента на общие темы подписки влияет только на фактическую тему. Это означает, что она переписывает только часть общей темы подписки после удаления префикса $share/group-name/. Например, когда клиент подписывается или отписывается от общей темы подписки с фильтром $share/group/x/y/z, будут сопоставляться и переписываться только x/y/z, а $share/group/ будет игнорироваться.
Правила перезаписи тем в RMQTT должны быть настроены пользователем, который может добавить несколько правил перезаписи по мере необходимости.
Формат каждого правила перезаписи темы следующий:
rules = [
{ action = "all", source_topic_filter = "x/+/#", dest_topic = "xx/$1/$2", regex = "^x/(.+)/(.+)$" }
]
Каждое правило перезаписи состоит из фильтра тем, целевого выражения и регулярного выражения.
Правила перезаписи тем делятся на правила публикации, подписки и все правила. Правила публикации соответствуют темам, содержащимся в пакетах PUBLISH, в то время как правила подписки соответствуют темам, содержащимся в пакетах SUBSCRIBE и UNSUBSCRIBE. Все правила применяются к темам в пакетах PUBLISH, SUBSCRIBE и UNSUBSCRIBE.
Когда включена перезапись тем, RMQTT будет использовать тему из пакета MQTT (например, сообщение PUBLISH с темой) для сопоставления с частью фильтра тем настроенных правил в настройках. Если совпадение найдено, регулярное выражение используется для извлечения информации из темы, и старая тема заменяется новой, созданной целевым выражением.
Целевое выражение может использовать переменные в формате $N
для соответствия элементам, извлечённым из регулярного выражения. Значение $N
относится к N-му элементу, извлечённому регулярным выражением; например, $1
— это первый элемент, извлечённый.
Кроме того, в выражении можно использовать ${clientid}
, чтобы представить идентификатор клиента, и ${username}
, чтобы представить имя пользователя клиента.
Примечание: RMQTT использует фильтр тем, настроенный в правиле, для построения дерева поиска тем. Когда тема может соответствовать нескольким правилам фильтра тем, RMQTT будет использовать только последнее успешно сопоставленное правило для перезаписи темы.
Если регулярное выражение в правиле не соответствует теме в пакете MQTT, перезапись завершится неудачно, и другие правила не будут использоваться для перезаписи. Поэтому важно тщательно разработать темы пакетов MQTT и правила перезаписи тем.
rmqtt-topic-rewrite
plugins/rmqtt-topic-rewrite.toml
##--------------------------------------------------------------------
## rmqtt-topic-rewrite
##--------------------------------------------------------------------
# action - Options are publish, subscribe, or all
# source_topic_filter - Topic filter for subscribing, unsubscribing, or publishing messages
# dest_topic - Destination topic
# regex - Regular expression
# Expressions can use ${clientid} to represent the client ID and ${username} to represent the client username.
rules = [
{ action = "all", source_topic_filter = "x/+/#", dest_topiс = "xx/$1/$2", regex = "^x/(.+)/(.+)$" },
{ action = "all", source_topic_filter = "x/y/1", dest_topic = "xx/y/1" },
{ action = "all", source_topic_filter = "x/y/#", dest_topic = "xx/y/$1", regex = "^x/y/(.+)$" },
{ action = "all", source_topic_filter = "iot/cid/#", dest_topic = "iot/${clientid}/$1", regex =
... Шесть правил перезаписи тем были настроены: `x/+/#`, `x/y/1`, `x/y/#`, `iot/cid/#`, `iot/uname/#` и `a/+/+/+`.
- `z/def` не соответствует никаким фильтрам тем, поэтому перепись тем не выполняется; он просто подписывается на или публикует тему `z/def`.
- `x/a/z` соответствует фильтру тем `x/+/#`. RMQTT применяет первое правило, использует регулярное выражение для сопоставления элементов `[a, z]` и заменяет их с помощью `xx/$1/$2`, в результате чего фактически подписывается или публикует тему: `xx/a/z`.
- `x/y/1` соответствует фильтрам тем `x/+/#`, `x/y/#` и `x/y/1`. Окончательное совпадение — `x/y/1`. Поскольку регулярное выражение не настроено, оно фактически подписывается или публикует на тему: `xx/y/1`.
- `x/y/2` соответствует фильтрам тем `x/+/#` и `x/y/#`. Окончательное соответствие — `x/y/#`. Через замену регулярного выражения фактически подписывается или публикует на тему: `xx/y/2`.
- `iot/cid/1` соответствует фильтру темы `iot/cid/#`. Через регулярное выражение и замену `clientid` фактически подписывается или публикует на тему: `iot/cid001/1`.
- `iot/uname/1` соответствует фильтру темы `iot/uname/#`. Через регулярное выражение и замену `username` фактически подписывается или публикует на тему: `iot/uname001/1`.
- `a/1/2/3` соответствует фильтру темы `a/+/+/+`. Через замену регулярного выражения фактически подписывается или публикует на тему: `aa/1/2/3`.
- `a/1/2/3/4` не соответствует ни одному из правил перезаписи темы.
По умолчанию этот плагин не включён. Чтобы активировать его, необходимо добавить запись `rmqtt-topic-rewrite` в конфигурацию `plugins.default_startups` в основном файле конфигурации `rmqtt.toml`, как показано ниже:
```bash
##--------------------------------------------------------------------
## Plugins
##--------------------------------------------------------------------
#Каталог файла конфигурации плагина
plugins.dir = "rmqtt-plugins/"
#Плагин запускается по умолчанию при запуске сервера mqtt
plugins.default_startups = [
#"rmqtt-retainer",
#"rmqtt-auth-http",
#"rmqtt-cluster-broadcast",
#"rmqtt-cluster-raft",
#"rmqtt-sys-topic",
#"rmqtt-message-storage",
#"rmqtt-session-storage",
"rmqtt-topic-rewrite",
"rmqtt-web-hook",
"rmqtt-http-api"
]
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )