MQTT client library и инструменты командной строки, реализованные на Erlang и поддерживающие MQTT v5.0/3.1.1/3.1.
$ make
Опционально можно отключить поддержку QUIC, если у вас есть проблемы с компиляцией:
BUILD_WITHOUT_QUIC=1 make
После успешной компиляции вы получите скрипт под названием emqtt
в _build/emqtt/rel/emqtt/bin
. Мы можем увидеть, что emqtt
может делать с опцией --help
:
$ ./emqtt --help
Usage: emqtt pub | sub [--help]
emqtt pub
используется для публикации одного сообщения по теме и выхода. emqtt sub
используется для подписки на тему и печати получаемых сообщений.
Опции могут иметь как короткие (один символ), так и длинные (строка) имена опций.
Короткая опция может иметь следующий синтаксис:
-e arg Одиночная опция 'e', аргумент "arg"
Длинная опция может иметь следующий синтаксис:
--example=arg Одиночная опция 'example', аргумент "arg"
--example arg Одиночная опция 'example', аргумент "arg"
./emqtt pub [-h [<host>]] [-p <port>] [-I <iface>]
[-V [<protocol_version>]] [-u <username>]
[-P <password>] [-C <clientid>] [-k [<keepalive>]]
[-t <topic>] [-q [<qos>]] [-r [<retain>]]
[--help <help>] [--will-topic <will_topic>]
[--will-payload <will_payload>]
[--will-qos [<will_qos>]]
[--will-retain [<will_retain>]]
[--enable-websocket [<enable_websocket>]]
[--enable-quic [<enable_quic>]]
[--enable-ssl [<enable_ssl>]]
[--tls-version [<tls_version>]]
[--CAfile <cafile>] [--cert <cert>] [--key <key>]
[--payload <payload>]
[--file <path/to/file>]
[--repeat [<repeat>]]
[--repeat-delay [<repeat_delay>]]
-h, --host
Укажите хост для подключения, поддерживаются доменные имена и IP-адреса. По умолчанию — localhost.
-p, --port
Укажите порт для подключения. Если не указано, будет использоваться значение по умолчанию 1883 для MQTT или 8883 для MQTT через TLS.
-I, --iface
Укажите сетевой интерфейс или IP-адрес для использования.
-V, --protocol-version
Укажите версию протокола MQTT, используемую клиентом. Может быть v3.1
, v3.1.1
и v5
. По умолчанию используется v5
.
-u, --username
Укажите имя пользователя, которое может использоваться брокером для аутентификации и авторизации.
-P, --password
Укажите пароль для имени пользователя.
-C, --clientid
Укажите идентификатор клиента. Если не указан, идентификатор клиента в формате emqtt-<Hostname>-<Random Hexadecimal String>
будет автоматически сгенерирован emqtt_cli
.
-k, --keepalive
Укажите интервал в секундах для отправки пакетов PINGREQ брокеру. По умолчанию составляет 300 секунд.
-t, --topic
Укажите тему MQTT, которую вы хотите опубликовать. Если тема начинается с $, вы должны использовать одинарные кавычки ('
) для указания темы, а не двойные кавычки ("
). Это обязательная опция.
-q, --qos
Укажите качество обслуживания для сообщения. Может быть 0, 1 и 2. По умолчанию используется 0.
-r, --retain
Укажите, является ли сообщение сохранённым сообщением. По умолчанию используется false.
--payload
Укажите прикладное сообщение, которое должно быть опубликовано. Это обязательная опция.
--repeat
Укажите количество раз, когда сообщение будет повторно опубликовано. По умолчанию используется значение 1. Текст запроса переведён на русский язык:
Сообщение было доставлено до публикации следующего. По умолчанию используется значение 0, это означает публикацию повторных сообщений сразу после отправки предыдущего сообщения.
--will-topic
Укажите тему сообщения will, отправляемого при неожиданном отключении клиента.
--will-qos
Укажите качество обслуживания сообщения will. По умолчанию используется значение 0. Этот параметр должен использоваться вместе с --will-topic.
--will-retain
Укажите, является ли сообщение will сохранённым сообщением. По умолчанию используется значение false. Этот параметр должен использоваться вместе с --will-topic.
--will-payload
Укажите прикладное сообщение, которое будет храниться брокером и отправляться, если этот клиент неожиданно отключится. Этот параметр должен использоваться вместе с --will-topic.
--enable-websocket
Укажите включение транспорта WebSocket или нет. В настоящее время эту опцию нельзя использовать с --enable-ssl.
--enable-quic
Используйте quic в качестве транспорта. Эту опцию нельзя комбинировать с --enable-ssl или --enable-websocket.
--enable-ssl
Укажите включение SSL/TLS транспорта или нет. Эту опцию в настоящее время нельзя использовать с --enable-websocket.
--tls-version
Укажите, какой протокол TLS следует использовать при общении с брокером. Допустимые варианты: tlsv1.3, tlsv1.2, tlsv1.1 и tlsv1. По умолчанию используется tlsv1.2.
--CAfile
Укажите путь к файлу, содержащему PEM-кодированные сертификаты CA. Этот параметр необходимо использовать вместе с --enable-ssl.
--cert
Укажите путь к файлу, содержащему сертификат PEM для этого клиента, если это требуется сервером. Этот параметр необходимо использовать вместе с --enable-ssl.
--key
Укажите путь к файлу, содержащему закрытый ключ PEM для этого клиента, если это требуется сервером. Этот параметр необходимо использовать вместе с --enable-ssl.
Опубликовать простое сообщение через TCP-соединение
$ ./emqtt pub -t "hello" --payload "hello world"
Client emqtt-zhouzibodeMacBook-Pro-4623faa14d8256e9cb95 sent CONNECT
Client emqtt-zhouzibodeMacBook-Pro-4623faa14d8256e9cb95 sent PUBLISH (Q0, R0, D0, Topic=hello, Payload=...(11 bytes))
Client emqtt-zhouzibodeMacBook-Pro-4623faa14d8256e9cb95 sent DISCONNECT
Опубликовать простое сообщение по TLS-соединению
$ ./emqtt pub --enable-ssl=true -t "hello" --payload "hello world" --CAfile=certs/cacert.pem --cert=certs/client-cert.pem --key=certs/client-key.pem
Client emqtt-zhouzibodeMacBook-Pro-cec9489c26e3ed7a38eb sent CONNECT
Client emqtt-zhouzibodeMacBook-Pro-cec9489c26e3ed7a38eb sent PUBLISH (Q0, R0, D0, Topic=hello, Payload=...(11 bytes))
Client emqtt-zhouzibodeMacBook-Pro-cec9489c26e3ed7a38eb sent DISCONNECT
Публиковать сообщение повторно через WebSocket-соединение
$ ./emqtt pub --enable-websocket=true -p 8083 -t "hello" --payload "hello world"
Client emqtt-zhouzibodeMacBook-Pro-1e4677ab46cecf1298ac sent CONNECT
Client emqtt-zhouzibodeMacBook-Pro-1e4677ab46cecf1298ac sent PUBLISH (Q0, R0, D0, Topic=hello, Payload=...(11 bytes))
Client emqtt-zhouzibodeMacBook-Pro-1e4677ab46cecf1298ac sent DISCONNECT **--CAfile <cafile>**
  См. также [–CAfile](#CAfile).
**--cert <cert>**
  См. также [–cert](#cert).
**--key <key>**
  См. также [–key](#key).
* * *
**–h, –host**
  См. также [–host](#host).
**–p, –port**
  См. также [–port](#port).
**–I, –iface**
  См. также [–iface](#iface).
**–V, –protocol-version**
  См. также [–protocol-version](#protocol-version).
**–u, –username**
  См. также [–username](#username).
**–P, –password**
  См. также [–password](#password).
**–C, –clientid**
  См. также [–clientid](#clientid).
**–k, –keepalive**
  См. также [–keepalive](#keepalive).
**–t, –topic**
  Укажите тему MQTT, на которую вы хотите подписаться. Это обязательный параметр.
**–q, –qos**
  Укажите максимальный уровень QoS, при котором брокер может отправлять клиентские сообщения приложения. По умолчанию 0.
**––retain-as-publish**
  Задайте опцию «Сохранить как опубликовать» в параметрах подписки. По умолчанию 0.
**––retain-handling**
  Установите опцию «Обработка сохранения» в параметрах подписки. По умолчанию 0.
**––print**
  Используйте размер для печати только количества полученных байтов полезной нагрузки. Если этот параметр не указан, полезная нагрузка печатается в виде строки.
* * *
**––will-topic**
  См. также [––will-topic](#will-topic).
**––will-qos**
  См. также [––will-qos](#will-qos).
**––will-retain**
  См. также [––will-retain](#will-retain).
**––will-payload**
  См. также [––will-payload](#will-payload).
**––enable-websocket**
  См. также [––enable-websocket](#enable-websocket).
**––enable-quic**
  См. также [––enable-quic](#enable-quic).
**––enable-ssl**
  См. также [––enable-ssl](#enable-ssl).
**––tls-version**
  См. также [––tls-version](#tls-version).
**––CAfile**
  См. также [––CAfile](#CAfile).
**––cert**
  См. также [––cert](#cert).
**––key**
  См. также [––key](#key). **emqtt:start_link() -> {ok, Pid} | ignore | {error, Reason}**
**emqtt:start_link(Options) -> {ok, Pid} | ignore | {error, Reason}**
*Типы:*
Pid = pid()
Reason = term()
Options = [[option()](#option)]
Запустить процесс MQTT-клиента с указанными параметрами. Параметры будут использоваться при подключении и работе.
Доступны следующие параметры:
`{name, Name}`
Если указано имя, gen_statem будет зарегистрирован с этим именем. Подробнее см. документацию для первого аргумента `gen_statem:start_link/4`.
`{owner, Pid}`
Клиентский процесс будет отправлять сообщения типа `{diconnected, ReasonCode, Properties}` в процесс владельца.
`{host, Host}`
Хост MQTT-сервера для подключения. Хост может быть именем хоста или IP-адресом. По умолчанию — `localhost`.
`{hosts, [{Host, Port}]}`
Список хостов для подключения. Если подключение к первому хосту не удастся, клиент попытается подключиться к следующему хосту в списке. Если соединение со всеми хостами не удастся, клиент вернёт ошибку. Установка этого параметра переопределит параметр `host`.
`{port, Port}`
Порт MQTT-сервера для подключения. Если не указан, будет использоваться значение по умолчанию 1883 для MQTT или 8883 для MQTT через TLS.
`{tcp_opts, Options}`
Дополнительные параметры для `gen_tcp:connect/3`.
`{ssl, boolean()}`
Включить транспорт SSL/TLS или нет. По умолчанию используется значение false.
`{ssl_opts,` Дополнительные опции для `ssl:connect/3`.
`{ws_path, Path}` — путь к ресурсу. По умолчанию `/mqtt`.
`{connect_timeout, Timeout}` — максимальное время ожидания подключения к серверу и возврата сервером CONNACK. По умолчанию 60 секунд.
`{bridge_mode, boolean()}` — включить режим моста или нет. По умолчанию false.
`{clientid, ClientID}` — указать идентификатор клиента. Если не указано, идентификатор клиента будет использовать значение, назначенное сервером в MQTT v5, или автоматически генерироваться внутренним кодом в MQTT v3.1/v3.1.1.
`{clean_start, CleanStart}` — должен ли сервер отбросить существующий сеанс и начать новый сеанс. По умолчанию true.
`{username, Username}` — имя пользователя, используемое сервером для аутентификации и авторизации.
`{password, Password}` — пароль, используемый сервером для аутентификации и авторизации.
`{proto_ver, ProtocolVersion}` — версия протокола MQTT. По умолчанию `v4`.
`{keepalive, Keepalive}` — максимальный интервал времени, который может пройти между моментом, когда клиент завершает передачу одного пакета управления MQTT, и моментом, когда он начинает отправлять следующий. Будет заменён на keep alive сервера, возвращённый сервером MQTT.
`{max_inflight, MaxInflight}` — максимальное количество пакетов QoS 1 и QoS 2 в полёте. Другими словами, количество пакетов, которые были отправлены, но ещё не подтверждены. По умолчанию infinity, что означает отсутствие жёсткого ограничения. Однако у сервера может быть своя идея, и он может объявить об этом через свойство Receive-Maximum в пакете CONNACK. В этом случае будет действовать меньшее из двух значений.
После заполнения окна в полёте сообщения будут помещены в очередь в процессе Клиента и отправлены, когда слоты в окне в полёте станут доступными. Ограничения на размер очереди нет, поэтому рекомендуется использовать меры контроля потока или установить разумные тайм-ауты публикации, если вы ожидаете, что пропускная способность сервера будет недостаточной.
`{retry_interval, RetryInterval}` — интервал повторной попытки отправки пакетов, которые были отправлены, но не получили ответа. По умолчанию 30 секунд.
`{will_topic, WillTopic}` — тема сообщения will.
`{will_payload, WillPayload}` — полезная нагрузка сообщения will.
`{will_retain, WillRetain}` — следует ли серверу публиковать сообщение will как сохранённое сообщение. По умолчанию false.
`{will_qos, WillQoS}` — QoS сообщения will. По умолчанию 0.
`{will_props, WillProperties}` — свойства сообщения will.
`{auto_ack, boolean()}` — если true (по умолчанию), чистый процесс автоматически отправит пакет подтверждения, например PUBACK, при получении пакета от сервера. Если false, приложение решает, что делать.
`{ack_timeout, AckTimeout}` — максимальное время ожидания ответного сообщения. По умолчанию 30 секунд.
`{force_ping, boolean()}` — если false (по умолчанию), если в интервале keep alive отправляется любой другой пакет, пакет ping в этот раз отправляться не будет. Если true, пакет ping будет отправляться каждый раз.
`{low_mem, boolean()}` — если true, клиент попытается уменьшить использование памяти, чаще выполняя сборку мусора. По умолчанию false.
`{reconnect, infinity | non_neg_integer()}` — максимальное число попыток повторного подключения. По умолчанию 0, означает отсутствие повторного подключения.
`{reconnect_timeout, pos_integer()}` — временной интервал между попытками повторного подключения. По умолчанию 5 секунд.
`{properties, Properties}` — свойства пакета CONNECT.
`{custom_auth_callbacks, Callbacks}` — эта опция конфигурации позволяет использовать расширенные механизмы аутентификации в MQTT v5 путём указания пользовательских функций обратного вызова.
**emqtt:connect(Client) -> {ok, Properties} | {error, Reason}**
  **Типы**
    **Client = [client()](#client)**
    **Properties = [properties()](#properties)**
    **Reason = timeout | inet:posix() | any()**
Подключиться к серверу MQTT по TCP или TLS и отправить пакет CONNECT с параметрами, указанными в start_link/1, 2. Клиент должен быть pid, возвращённым из start_link/1, 2, или именем, указанным в start_link/1, 2.
Возвращает:
— `{ok, Properties}`, если установлено соединение MQTT. Отправляется пакет QoS 1/2, будет возвращён идентификатор пакета.
- `{error, Reason}`, если что-то пойдёт не так.
**emqtt:puback(Client, PacketId) -> ok**
**emqtt:puback(Client, PacketId, ReasonCode) -> ok**
**emqtt:puback(Client, PacketId, ReasonCode, Properties) -> ok**
  **Типы**
    **Client = [client()](#client)**
    **PacketId = [packet_id()](#packetid)**
    **ReasonCode = [reason_code()](#reasoncode)**
    **Properties = [properties()](#properties)**
Отправьте пакет `PUBACK` на сервер MQTT. `PacketId`, `ReasonCode` и `Properties` определяют идентификатор пакета, код причины и свойства для пакета `PUBACK`.
**emqtt:pubrec(Client, PacketId) -> ok**
**emqtt:pubrec(Client, PacketId, ReasonCode) -> ok**
**emqtt:pubrec(Client, PacketId, ReasonCode, Properties) -> ok**
  **Типы**
    То же, что и `emqtt:puback/2, 3, 4`.
Отправьте пакет `PUBREC` на сервер MQTT. `PacketId`, `ReasonCode` и `Properties` определяют идентификатор пакета, код причины и свойства для пакета `PUBREC`.
**emqtt:pubrel(Client, PacketId) -> ok**
**emqtt:pubrel(Client, PacketId, ReasonCode) -> ok**
**emqtt:pubrel(Client, PacketId, ReasonCode, Properties) -> ok**
  **Типы**
    То же, что и `emqtt:puback/2, 3, 4`.
Отправьте пакет `PUBREL` на сервер MQTT. `PacketId`, `ReasonCode` и `Properties` определяют идентификатор пакета, код причины и свойства для пакета `PUBREL`.
**emqtt:pubcomp(Client, PacketId) -> ok**
**emqtt:pubcomp(Client, PacketId, ReasonCode) -> ok**
**emqtt:pubcomp(Client, PacketId, ReasonCode, Properties) -> ok**
  **Типы**
    То же, что и `emqtt:puback/2, 3, 4`.
Отправьте пакет `PUBCOMP` на сервер MQTT. `PacketId`, `ReasonCode` и `Properties` определяют идентификатор пакета, код причины и свойства для пакета `PUBCOMP`.
**emqtt:subscriptions(Client) -> Subscriptions**
  **Типы**
    **Client = [client()](#client)**
    **Subscriptions = [{[topic()](#topic), [[subopt()](#subopt)]}]**
Верните все подписки.
**emqtt:stop(Client) -> ok**
  **Типы**
    **Client = [client()](#client)**
Остановите клиентский процесс.
**emqtt:pause(Client) -> ok**
  **Типы**
    **Client = [client()]**
Приостановите клиентский процесс. Приостановленный клиентский процесс будет игнорировать все полученные пакеты `PUBLISH` и не отправлять пакет `PINGREQ`, если `force_ping` установлен в значение false.
**emqtt:resume(Client) -> ok**
  **Типы**
    **Client = [client()]**
Возобновите приостановленный клиентский процесс. ```
Инициализирующая функция (InitFunc) выполняется с аргументами InitArgs. Она должна возвращать кортеж `{AuthProps, AuthState}`, где:
- `AuthProps` — карта, содержащая начальные свойства аутентификации, включая `'Authentication-Method'` и `'Authentication-Data'`.
- `AuthState` — термин, который используется на последующих этапах аутентификации.
Функция HandleAuth отвечает за продолжение процесса аутентификации. Она принимает следующие параметры:
- `AuthState`: текущее состояние аутентификации.
- `continue_authentication | ErrorCode`: указание продолжить аутентификацию или код ошибки, указывающий причину сбоя.
- `AuthProps`: карта, содержащая свойства для аутентификации, которая всегда должна включать `'Authentication-Method'` и `'Authentication-Data'` на каждом этапе процесса аутентификации.
Функция должна возвращать кортеж в виде: {continue, {?RC_CONTINUE_AUTHENTICATION, AuthProps}, AuthState}
для продолжения или {stop, Reason}
для прерывания.
Для практической реализации этих обратных вызовов обратитесь к следующим наборам тестов в этом репозитории:
test/emqtt_scram_auth_SUITE.erl
test/emqtt_kerberos_auth_SUITE.erl
.Эти примеры демонстрируют, как настроить обратные вызовы аутентификации для различных механизмов SASL, поддерживаемых EMQTT.
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.