# MQTT (/ru/docs/requests/mqtt)

Запрос MQTT подключается к брокеру, подписывается на фильтры топиков и публикует сообщения. Он остаётся подключённым,
пока вы работаете, а журнал показывает каждое сообщение в топиках, за которыми вы следите. Echolot поддерживает MQTT
3.1.1 и 5.0.

<Shot id="requests-mqtt-log" alt="Realtime › Warehouse sensors, подключённый к локальному брокеру: вкладка «Подписка» с warehouses/+/temperature на QoS 1 и журнал сообщений с показаниями температуры по топикам" />

<Callout title="Попробуйте на Alpenglow">
  **Realtime › Warehouse sensors** подключается к локальному брокеру на `localhost` из папки `examples/servers`
  репозитория документации (`bun run realtime`).
</Callout>

## Подключение [#connect]

1. Выберите **Файл › Новый запрос MQTT** или **Новый запрос MQTT** в меню **+** рядом с **Запросы** в боковой панели.
2. Введите адрес брокера.
3. Выберите протокол в меню значка **MQTT** перед адресом: **MQTT 5.0** (по умолчанию) или **MQTT 3.1.1**.
4. Выберите **Соединить** (<kbd>⌘</kbd><kbd>R</kbd>). Пока соединение установлено, кнопка называется **Отключиться**.

| Адрес | Подключается по | Порт по умолчанию |
| --- | --- | --- |
| `mqtt://broker` | TCP | 1883 |
| `mqtts://broker` | TLS | 8883 |
| `ws://broker` | WebSocket, путь `/mqtt`, если в адресе нет другого | Как у любого адреса `ws://` |
| `wss://broker` | WebSocket поверх TLS, путь `/mqtt`, если в адресе нет другого | Как у любого адреса `wss://` |

В адресе работают `{{variables}}`: запрос датчиков Alpenglow использует `mqtt://{{mqttHost}}`.

В редакторе есть вкладки: **Документация**, **Подписка**, **Публикация**, **Подключение**, **Авторизация**,
**Переменные**, **Тесты**, **Скрипты** и **Настройки**. Настройки вроде проверки TLS, прокси и сертификатов применяются
так же, как для [запросов HTTP](/docs/requests/settings).

## Имя пользователя и пароль [#user-name-and-password]

Имя пользователя и пароль MQTT — это **Basic**-авторизация запроса на вкладке **Авторизация**. Храните пароль в
[секретной переменной](/docs/workspaces/secrets), например `{{mqttPassword}}`, чтобы он оставался в Связке ключей и не
попадал в файл запроса. Как и любую авторизацию, её можно задать один раз для папки или рабочего пространства. Другие
виды авторизации для MQTT не применяются.

## Подключение (вкладка) [#the-connection]

Вкладка **Подключение** содержит остальное из CONNECT:

| Поле | Что делает |
| --- | --- |
| **ID клиента** | Идентификатор клиента, с `{{variables}}`. Если пусто, используется `echolot-` и случайный суффикс |
| **Чистый старт** (5.0) или **Чистый сеанс** (3.1.1) | Начать без подписок и сообщений, которые брокер сохранил для этого ID клиента. По умолчанию включено |
| **Keep alive** | Секунды между пингами; 0 — без пингов. По умолчанию 60 |
| **Завещание** | **Опубликовать завещание при обрыве подключения** с **Топиком завещания**, **Нагрузкой завещания**, QoS и **Retain**: сообщение, которое брокер публикует, когда клиент пропадает, не попрощавшись |

## Подписка [#subscribe]

Вкладка **Подписка** перечисляет фильтры топиков, на которые подписан запрос:

1. Введите фильтр в поле внизу, например `warehouses/+/temperature`. `+` соответствует одному уровню, а `#` — всему
   остальному, как в `logs/#`.
2. Выберите **QoS 0**, **QoS 1** или **QoS 2**.
3. Выберите **Подписка**, чтобы подписаться один раз, или **+**, чтобы сохранить фильтр вместе с запросом.

Сохранённые фильтры с отметкой **Подписаться при подключении** подписываются при каждом подключении запроса: в
приложении, в прогонах, из командной строки и для агентов. Пока соединение установлено, у каждого сохранённого фильтра
есть кнопки **Подписка** и **Отписаться**. В MQTT 5.0 **No Local** исключает сообщения, которые клиент публикует сам.

## Публикация [#publish]

Вкладка **Публикация** отправляет сообщения:

1. Введите топик и нагрузку. В обоих полях работают `{{variables}}`.
2. Выберите QoS и отметьте **Retain**, чтобы попросить брокера хранить сообщение для последующих подписчиков.
3. Выберите **Публикация**.

Выберите **+**, чтобы сохранить сообщение вместе с запросом. Сохранённые сообщения с отметкой **Публиковать в прогонах**
публикуются по порядку, когда запрос запускается без вас. [Прогон](/docs/requests/runner) и командная строка
подключаются, подписываются на включённые фильтры, публикуют включённые сообщения, слушают 10 секунд и закрывают
соединение.

## Журнал сообщений [#the-message-log]

Вкладка **Сообщения** области ответа показывает сеанс: полученные и опубликованные сообщения, подписки и подтверждения
брокера, самые новые последними, каждое со временем и размером.

- Сообщение показывает свой топик, QoS, было ли оно сохранённым (retained) и идентификатор пакета.
- **Все топики** сужают журнал до одного топика.
- **Все**, **Отправлено** и **Получено** фильтруют по направлению; **Фильтр сообщений** находит сообщения по тексту.
- **Ещё** форматирует нагрузку JSON с отступами.
- Первая строка сообщает, какой ID клиента подключился и по какому протоколу, а также сохранил ли брокер сеанс с
  прошлого раза. Когда брокер отключает клиента, журнал объясняет причину кодом причины MQTT.

Доставки QoS 1 и 2 подтверждаются за вас в обе стороны.

Когда соединение закрывается, сеанс сохраняется в [Истории](/docs/workspaces/history), а журнал становится телом
ответа, так что проверки на **Тело** работают с ним.

## MQTT 5.0 [#mqtt-50]

Коды причин брокера показываются в журнале по именам, а также при отказе в подключении, например `Success` или `Not
authorized`, в обеих версиях. Если выбран **MQTT 5.0**:

- **No Local** в подписке исключает собственные сообщения этого клиента.
- **Чистый старт** заменяет **Чистый сеанс** из 3.1.1.
- Сохранённое сообщение может нести тип содержимого (`content-type` в файле запроса), который отправляется как свойство
  Content Type.

## Из командной строки [#from-the-command-line]

`echolot mqtt subscribe` и `echolot mqtt publish` общаются с брокером из терминала, а пароль берут из
`ECHOLOT_MQTT_PASSWORD`. См. [echolot mqtt](/docs/cli/mqtt).
