workerman/mqtt
MQTT — это протокол передачи сообщений с архитектурой клиент-сервер, использующий модель публикации/подписки, ставший важной частью Интернета вещей. Его идеи дизайна заключаются в легкости, открытости, простоте и стандартизации, что облегчает его реализацию. Эти характеристики делают его отличным выбором для множества сценариев, особенно для ограниченных сред, таких как связь «машина-машина» (M2M) и среды Интернета вещей (IoT).
workerman\mqtt — это асинхронная библиотека клиента MQTT на основе workerman, которая может использоваться для приема или отправки сообщений по протоколу MQTT. Поддерживает QoS 0, QoS 1, QoS 2. Поддерживает версии MQTT 3.1 3.1.1 5.
Проект
https://github.com/walkor/mqtt
Установка
composer require workerman/mqtt
Поддержка
- MQTT
- MQTT5
- MQTT через веб-сокеты
Пример
subscribe.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->subscribe('test');
};
$mqtt->onMessage = function($topic, $content){
var_dump($topic, $content);
};
$mqtt->connect();
};
Worker::runAll();
Запустите команду php subscribe.php start для старта
publish.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->publish('test', 'hello workerman mqtt');
};
$mqtt->connect();
};
Worker::runAll();
Запустите команду php publish.php start для старта.
workerman\mqtt\Client интерфейс
Client::__construct()Client::connect()Client::publish()Client::subscribe()Client::unsubscribe()Client::disconnect()Client::close()callback onConnectcallback onMessagecallback onErrorcallback onClose
__construct (string $address, [array $options])
Создает экземпляр клиента mqtt.
-
$addressадрес сервера mqtt, формат как 'mqtt://test.mosquitto.org:1883'. -
$optionsмассив опций клиента, в который можно установить следующие параметры:keepalive: интервал времени, через который клиент отправляет сигнал о «живости» серверу, по умолчанию 50 секунд, установка в 0 означает отключение «живости»client_id: идентификатор клиента, если не установлен, по умолчанию будет"workerman-mqtt-client-".mt_rand()protocol_name: имя протокола,MQTT(версия 3.1.1) илиMQIsdp(версия 3.1), по умолчаниюMQTTprotocol_level: уровень протокола, когдаprotocol_nameэтоMQTT, значение4, когдаprotocol_nameэтоMQIsdp, значение3clean_session: очистка сессии, по умолчаниюtrue. Установка вfalseпозволяет получать оффлайн сообщения уровнейQoS 1иQoS 2reconnect_period: интервал времени для повторного подключения, по умолчанию1секунда,0означает, что повторное подключение не производитсяconnect_timeout: время ожидания подключения к mqtt, по умолчанию30секундusername: имя пользователя, необязательноpassword: пароль, необязательноwill: завещательное сообщение, когда клиент теряет соединение, Broker автоматически отправит завещательное сообщение другим клиентам. Формат:topic: темаcontent: содержимоеqos: уровеньQoSretain: флагretain
resubscribe: после неожиданного отключения и повторного подключения, следует ли заново подписываться на предыдущие темы, по умолчанию truebindtoиспользуется для указания локального IP и порта, с которых инициируется подключение к Broker, по умолчанию значение ''sslопции ssl, по умолчаниюfalse, если установлено вtrue, подключается через ssl. Также поддерживает передачу массива ssl контекста для настройки локального сертификата и т.д., справка по ssl контексту на https://php.net/manual/en/context.ssl.phpdebugвключить ли режим отладки, режим отладки может выводить подробную информацию о связи с Broker, по умолчаниюfalseuriадрес uri для mqtt через веб-сокеты, обычно/mqtt
connect()
Подключение к Broker
publish(String $topic, String $content, [array $options], [callable $callback])
Опубликовать сообщение в тему
$topicтема$contentсообщение$optionsмассив параметров, включаяqosуровеньQoS, по умолчанию0retainфлаг retain, по умолчаниюfalsedupфлаг повторной отправки, по умолчаниюfalse
$callback-function (\Exception $exception = null)(не поддерживается при QoS 0), срабатывает при возникновении ошибки или успешной публикации,$exception— объект исключения, при отсутствии ошибок$exceptionравенnull, аналогично для остальных.
subscribe(mixed $topic, [array $options], [callable $callback])
Подписаться на одну или несколько тем
$topicэто строка (подписка на одну тему) или массив (подписка на несколько тем),
при подписке на несколько тем,$topic— это массив, где ключ — это тема, а значение — уровеньQoS, напримерarray('topic1'=> 0, 'topic2'=> 1)$optionsмассив опций подписки, включает в себя следующие настройки:qosуровеньQoS, по умолчанию0
$callback-function (\Exception $exception = null, array $granted = [])
Обратный вызов, срабатывает при успешной подписке или возникновении ошибкиexceptionобъект исключения, при отсутствии ошибок он равенnullgrantedмассив результатов подписки, похожий наarray('topic' => 'qos', 'topic' => 'qos'), где:topic— это подписанная темаqos— уровеньQoS, принятый Broker
unsubscribe(mixed $topic, [callable $callback])
Отменить подписку
$topicэто строка или массив строк, напримерarray('topic1', 'topic2')$callback-function (\Exception $e = null), обратный вызов, срабатывающий при успехе или неудаче
disconnect()
Корректное отключение от Broker, сообщение DISCONNECT будет отправлено в Broker.
close()
Принудительное отключение от Broker, сообщение DISCONNECT не будет отправлено в Broker.
callback onConnect(Client $mqtt)
Срабатывает, когда соединение с Broker установлено. В этот момент уже получено сообщение CONNACK от Broker.
callback onMessage(String $topic, String $content, Client $mqtt)
function (topic, message, packet) {}
Срабатывает, когда клиент получает сообщение Publish
$topicполученная тема$contentполученное сообщение$mqttэкземпляр клиента mqtt.
callback onError(\Exception $exception = null)
Срабатывает при возникновении ошибки соединения
callback onClose()
Срабатывает при закрытии соединения, независимо от того, закрыл ли клиент или сервер соединение.