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
Пример
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 onConnect
callback onMessage
callback onError
callback 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), по умолчаниюMQTT
protocol_level
: уровень протокола, равен4
приprotocol_name
равномMQTT
, и равен3
приprotocol_name
равномMQIsdp
clean_session
: очистка сеанса, по умолчаниюtrue
. Установка вfalse
позволяет принимать оффлайн-сообщения уровняQoS 1
иQoS 2
reconnect_period
: интервал времени для повторного соединения, по умолчанию1
секунда,0
означает отключение повторного соединенияconnect_timeout
: время ожидания соединения mqtt, по умолчанию30
секундusername
: имя пользователя, необязательноpassword
: пароль, необязательноwill
: сообщение о воле, когда клиент отключается, Брокер автоматически отправляет сообщение о воле другим клиентам. Формат:topic
: темаcontent
: содержаниеqos
: уровеньQoS
retain
: меткаretain
resubscribe
: при обрыве соединения и повторном подключении, повторно подписываться на предыдущие темы, по умолчаниюtrue
bindto
: указывает, через какой IP и порт создать соединение с Брокером, по умолчанию ''ssl
: настройки ssl, по умолчаниюfalse
, если установлено вtrue
, то соединение происходит через ssl. Также поддерживает передачу массива контекста ssl для настройки локальных сертификатов и т. д., см. контекст ssl: https://php.net/manual/en/context.ssl.phpdebug
: включить или отключить режим отладки, по умолчаниюfalse
connect()
Соединение с Брокером
publish(String $topic, String $content, [array $options], [callable $callback])
Публикация сообщения в определенную тему
$topic
- тема$content
- сообщение$options
- массив опций, включаетqos
- уровеньQoS
, по умолчанию0
retain
- меткаretain
, по умолчаниюfalse
dup
- флаг повторной отправки, по умолчанию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
- объект исключения, если ошибок нет, то он равенnull
granted
- массив результатов подписки, похожий наarray('topic' => 'qos', 'topic' => 'qos')
, где:topic
- подписанная темаqos
- уровеньQoS
, принятый Брокером
unsubscribe(mixed $topic, [callable $callback])
Отписка
$topic
- строка или массив строк, например,array('topic1', 'topic2')
$callback
-function (\Exception $e = null)
, срабатывает при успешном или неудачном выполнении
disconnect()
Нормальное отключение соединения с Брокером, отправляется сообщение DISCONNECT
на Брокер.
close()
Принудительное отключение от Брокера, сообщение DISCONNECT
не отправляется Брокеру.
callback onConnect(Client $mqtt)
Срабатывает после установления соединения с Брокером. В этот момент уже было получено сообщение CONNACK
от Брокера.
callback onMessage(String $topic, String $content, Client $mqtt)
function (topic, message, packet) {}
Срабатывает при получении клиентом сообщения Publish
$topic
- полученная тема$content
- содержание полученного сообщения$mqtt
- экземпляр клиента mqtt.
callback onError(\Exception $exception = null)
Срабатывает при возникновении ошибки соединения
callback onClose()
Срабатывает при закрытии соединения, независимо от того, закрыл ли клиент соединение самостоятельно или сервер закрыл соединение.