Как использовать MQTT в PHP

PHP — это широко используемый многоцелевой язык сценариев с открытым исходным кодом, который можно встраивать в HTML и который особенно подходит для веб-разработки.

Эта статья в основном знакомит с тем, как использовать php-mqtt/client клиентская библиотека в проектах PHP для реализации функций подключения, подписки, отписки, приема и отправки сообщений между MQTT-клиент и MQTT-сервер.

Выбор клиентской библиотеки MQTT

В этой статье выбирается клиентская библиотека php-mqtt/client, который имеет наибольшее количество загрузок на composer. Дополнительные клиентские библиотеки PHP-MQTT см. в [Packagist-Search MQTT](=mqtt).

Для получения дополнительной документации о php-mqtt/client см. Упаковщик php-mqtt/клиент.

Связь MQTT относится к сценарию сетевой связи за пределами системы HTTP. Из-за ограничений характеристик PHP использование расширений для сетевого взаимодействия, таких как Swoole/Workerman, в системе PHP может улучшить работу. Его использование не будет повторяться в этой статье. Соответствующие клиентские библиотеки MQTT следующие:

Инициализация проекта

Подтвердите версию PHP

Этот проект использует 7.4.21 для разработки и тестирования. Читатели могут подтвердить версию PHP с помощью следующей команды.

php --version

PHP 7.4.21 (cli) (built: Jul 12 2021 11:52:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

Используйте Composer для установки php-mqtt/client

Composer — это инструмент управления зависимостями для PHP, который может управлять всеми зависимостями, необходимыми вашему PHP-проекту.

composer require php-mqtt/client

Использование PHP MQTT

Подключиться к MQTT-серверу

В этой статье будет использоваться Бесплатный общедоступный сервер MQTT предоставлено EMQX, созданным на платформе EMQX. Облачный сервис MQTT. Информация о доступе к серверу выглядит следующим образом:

  • Маклер: Broker.emqx.io
  • TCP-порт: 1883 г.
  • SSL/TLS-порт: 8883

Импорт файла автозагрузки Composer и php-mqtt/client

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;

Задайте параметры подключения MQTT Broker

Задайте адрес подключения, порт и тему MQTT Broker. В то же время мы вызываем PHP rand функция для случайной генерации идентификатора клиента MQTT.

$server="broker.emqx.io";
$port = 1883;
$clientId = rand(5, 15);
$username="emqx_user";
$password = null;
$clean_session = false;

Написать функцию подключения MQTT

Используйте вышеуказанные параметры для подключения, и установите параметры подключения через ConnectionSettingsтакой как:

$connectionSettings = new ConnectionSettings();
$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);

Программа для подписки на тему emqx/testи настройте функцию обратного вызова для подписки для обработки полученного сообщения. Здесь мы распечатываем тему и сообщение, полученные от подписки:

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

Публиковать

Создайте полезную нагрузку и вызовите publish функция публикации сообщений в emqx/test тема. После публикации клиенту необходимо войти в статус опроса для обработки входящих сообщений и очереди повторной передачи:

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => '
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

// The client loop to process incoming messages and retransmission queues
$mqtt->loop(true);

Полный код

Подключение к серверу, публикация сообщений и получение кода.

<?php

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;
use \PhpMqtt\Client\ConnectionSettings;

$server="broker.emqx.io";
$port = 1883;
$clientId = rand(5, 15);
$username="emqx_user";
$password = null;
$clean_session = false;

$connectionSettings = new ConnectionSettings();
$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);

$mqtt = new MqttClient($server, $port, $clientId);

$mqtt->connect($connectionSettings, $clean_session);
printf("client connected\n");

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => '
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

$mqtt->loop(true);

Тест

После запуска кода публикации сообщений MQTT мы увидим, что клиент успешно подключился, и сообщения были опубликованы одно за другим и успешно получены:

php pubsub_tcp.php

PHP MQTT-тест

До сих пор мы использовали php-mqtt/клиент подключиться к публичный MQTT-сервера также реализовано соединение, публикация сообщений и подписка между тестовым клиентом и сервером MQTT.

Первоначально опубликовано на

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *