使用PHP进行MQTT开发指南
英文博客:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-php
PHP是一种广泛使用的开源通用脚本语言,可以嵌入HTML,特别适用于Web开发。
在这篇文章中,主要介绍了在PHP项目中使用php-mqtt/client客户端库来实现MQTT客户端与MQTT代理之间的连接、订阅、取消订阅、接收和发送消息功能。
选择MQTT客户端库
在这篇文章中,我们选择了Composer中最受欢迎的php-mqtt/client库进行下载。如果想了解其他PHP-MQTT客户端库,请查看Packagist-Search MQTT。
请参阅Packagist php-mqtt/client,以获取有关php-mqtt/client的详细文档。
以下为相关的MQTT客户端库:
– Paho MQTT:一种流行的开源MQTT客户端库,提供多种不同编程语言的实现。
– Mosquitto:一个轻量级的MQTT代理和客户端库,可用于C和C++开发。
– Eclipse MQTT:由Eclipse基金会维护的一组用于Java、JavaScript和Python的MQTT客户端库。
– EMQX MQTT:一个高度可扩展的开源MQTT代理和客户端库,支持多种编程语言。
– HiveMQ MQTT:一个经过测试且易于使用的MQTT代理和客户端库,适用于Java和JavaScript。
– AWS IoT SDK:提供了用于使用AWS IoT服务的MQTT客户端库,适用于Java、Python、C++等多种语言。
workerman/mqtt:Workermanベースの非同期MQTTクライアント。
simps/mqtt: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代理
本文中介绍了使用EMQX提供的免费公开MQTT代理。这是在EMQX的MQTT云服务上创建的。服务器访问信息如下:
-
- ブローカー: broker.emqx.io
TCPポート: 1883
SSL/TLSポート: 8883
选择MQTT代理的实践指南
请下载这份实用指南,并了解选择MQTT代理时需要考虑的因素。
获取电子书籍
导入Composer的自动加载文件和php-mqtt/client。
require('vendor/autoload.php');
use \PhpMqtt\Client\MqttClient;
设置MQTT Broker连接参数
请设置MQTT代理连接地址、端口和主题。同时,调用PHP中的rand函数,随机生成MQTT客户端ID。
$server = 'broker.emqx.io';
$port = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;
MQTT连接功能的描述
使用上述参数进行连接,并通过ConnectionSettings来设置连接参数。例如:
$connectionSettings = (new ConnectionSettings)
->setUsername($username)
->setPassword($password)
->setKeepAliveInterval(60)
->setLastWillTopic('emqx/test/last-will')
->setLastWillMessage('client disconnect')
->setLastWillQualityOfService(1);
订阅 yuè)
创建一个程序来订阅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' => 'https://github.com/emqx/MQTT-Client-Examples'
);
$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 = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;
$connectionSettings = (new ConnectionSettings)
->setUsername($username)
->setPassword($password)
->setKeepAliveInterval(60)
->setLastWillTopic('emqx/test/last-will')
->setLastWillMessage('client disconnect')
->setLastWillQualityOfService(1);
$mqtt = new MqttClient($server, $port, $clientId, $mqtt_version);
$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' => 'https://github.com/emqx/MQTT-Client-Examples'
);
$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/client在免费的公共MQTT代理服务器上进行连接,并成功实现了测试客户端与MQTT服务器之间的连接、消息发布和订阅功能。
接下来,您可以查看EMQ提供的MQTT协议入门指南系列文章,学习MQTT协议的功能,并探索MQTT的高级应用,从而顺利开始开发MQTT应用程序和服务。