Как использовать 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/клиент подключиться к публичный MQTT-сервера также реализовано соединение, публикация сообщений и подписка между тестовым клиентом и сервером MQTT.
Первоначально опубликовано на