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 интерфейс


__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: уровень протокола, когда protocol_name это MQTT, значение 4, когда protocol_name это MQIsdp, значение 3
    • clean_session: очистка сессии, по умолчанию true. Установка в false позволяет получать оффлайн сообщения уровней QoS 1 и QoS 2
    • reconnect_period: интервал времени для повторного подключения, по умолчанию 1 секунда, 0 означает, что повторное подключение не производится
    • connect_timeout: время ожидания подключения к mqtt, по умолчанию 30 секунд
    • username: имя пользователя, необязательно
    • password: пароль, необязательно
    • will: завещательное сообщение, когда клиент теряет соединение, Broker автоматически отправит завещательное сообщение другим клиентам. Формат:
      • topic: тема
      • content: содержимое
      • qos: уровень QoS
      • retain: флаг retain
    • resubscribe : после неожиданного отключения и повторного подключения, следует ли заново подписываться на предыдущие темы, по умолчанию true
    • bindto используется для указания локального IP и порта, с которых инициируется подключение к Broker, по умолчанию значение ''
    • ssl опции ssl, по умолчанию false, если установлено в true, подключается через ssl. Также поддерживает передачу массива ssl контекста для настройки локального сертификата и т.д., справка по ssl контексту на https://php.net/manual/en/context.ssl.php
    • debug включить ли режим отладки, режим отладки может выводить подробную информацию о связи с Broker, по умолчанию false
    • uri адрес uri для mqtt через веб-сокеты, обычно /mqtt

connect()

Подключение к Broker


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, принятый 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()

Срабатывает при закрытии соединения, независимо от того, закрыл ли клиент или сервер соединение.

Дополнительные примеры examples/workerman