MQTT
Репозиторий содержит MQTT-клиент, кодирование пакетов версий протокола 3/4/5 и вспомогательные классы MQTT 5 properties. MQTT используется для обмена сообщениями с broker: издатель отправляет payload в topic, подписчик получает сообщения по topic filters.
Пакет не является MQTT-broker и не хранит прикладные сообщения за пределами состояния соединения.
Composer и реальные namespaces
Заголовок раздела «Composer и реальные namespaces»В composer.json указаны пакет localzet/mqtt, зависимость Server ^4.1 и PSR-4-префикс localzet\MQTT\. Однако src/Client.php объявляет Workerman\Mqtt\Client и обращается к Workerman\Connection, Workerman\Timer и Workerman\Mqtt\....
Это несогласованность реализации с автозагрузкой и зависимостями. Обычный new localzet\MQTT\Client(...) не получает класс из этого файла. Не подставляйте такой пример в приложение, пока namespaces/transport адаптации не приведены к одному контракту. Добавление Composer-пакета само по себе не исправляет проблему.
Ниже описан фактический API класса, находящегося в исходнике. Он нужен для понимания интеграции и адаптации; ручное подключение одного Client.php не обеспечивает все требуемые классы и protocol aliases.
Порядок работы клиента
Заголовок раздела «Порядок работы клиента»- Конструктор получает адрес broker и options, выбирает MQTT/MQTT5 codec, создаёт AsyncTcpConnection.
connect()регистрирует callbacks transport и начинает подключение.- После TCP connect отправляется MQTT CONNECT; прикладной
onConnectвызывается после успешного CONNACK. - Подписки и публикации отправляют пакеты с message IDs, когда они нужны протоколу.
- После разрыва transport reconnect зависит от настройки reconnect_period и явного запрета переподключения.
Не публикуйте прикладное сообщение сразу по одному факту создания объекта: дождитесь подтверждённого MQTT-подключения.
Подписки
Заголовок раздела «Подписки»subscribe($topic, $options = [], $callback = null, $properties = []) принимает строку topic filter либо карту topics. Для обычного режима карта связывает topic с QoS; для MQTT 5 используются дополнительные параметры subscription.
Ответ подписки передаётся callback как ошибка либо карта granted-кодов. Отдельное сообщение приходит в onMessage($topic, $content, $client), а не в subscription callback. Payload остаётся данными приложения: JSON-декодирование не выполняется автоматически.
Класс сохраняет темы для resubscribe, если включена соответствующая настройка. Это локальный реестр процесса, а не persistent subscription database клиента.
Публикация
Заголовок раздела «Публикация»publish($topic, $content, $options = [], $callback = null, $properties = []) отправляет payload с параметрами qos, retain и dup. При QoS 0 сообщение не получает message ID и callback не превращается в подтверждение доставки брокером.
Для QoS с подтверждением callback связан с протокольным message ID. Подтверждение broker не означает, что подписчик завершил бизнес-операцию. Exactly-once эффект записи в вашу БД отдельно не обеспечивается MQTT-клиентом.
Retain — свойство хранения broker, не локального массива outgoing. Не кладите туда бессрочные секреты только ради удобства повторного получения.
Сессия и повторное подключение
Заголовок раздела «Сессия и повторное подключение»clean_session по умолчанию включён. resubscribe тоже включён, а reconnect_period равен одной секунде. Восстановление тем при reconnect зависит от сочетания clean_session/resubscribe и сохранённой карты тем.
disconnect() отправляет MQTT DISCONNECT и закрывает соединение; close() закрывает transport без отправки такого пакета. Для остановки используйте явный lifecycle, а не бесконечное ожидание reconnect после намеренного завершения.
Внутренний outgoing и message IDs находятся в памяти. Не считайте перезапуск PHP-процесса сохранением незавершённых delivery exchanges.
TLS и диагностика
Заголовок раздела «TLS и диагностика»Адрес mqtts://... включает SSL transport; ssl-array передаётся как socket context. Политику сертификатов нужно задавать и проверять в фактически используемом transport, не отключая проверку peer ради успешного подключения.
При debug = true CONNECT-log включает username и password, а публикации — topic и content. На реальных broker credentials этот режим недопустим без исправления редактирования чувствительных данных.
Параметры, callbacks и протокольные компоненты
Исходный код · AGPL-3.0