php 是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 html 中,尤其适合 web 开发。
本文主要介绍如何在 php 项目中使用 php-mqtt/client 客户端库 ,实现 mqtt 客户端与 mqtt 服务器的连接、订阅、取消订阅、收发消息等功能。
mqtt 客户端库选择本文选择了 composer 上下载量最高的 php-mqtt/client 这个客户端库,更多 php-mqtt 客户端库可以在 packagist - search mqtt 中查看。
有关 php-mqtt/client 更多使用文档请参阅 packagist php-mqtt/client。
mqtt 通信属于 http 体系之外的网络通信场景,由于 php 特性限制,使用 php 体系中的 swoole/workerman 等专为网络通信打造的拓展可以带来更好的体验,其使用本文不再赘述,相关的 mqtt 客户端库如下:
workerman/mqtt:asynchronous mqtt client for php based on workerman.simps/mqtt:mqtt protocol analysis and coroutine client for php.项目初始化确认 php 版本本项目使用 7.4.21 进行开发测试,读者可用如下命令确认 php 的版本。
php --versionphp 7.4.21 (cli) (built: jul 12 2021 11:52:30) ( nts )copyright (c) the php groupzend 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 服务器本文将使用 emq x 提供的 免费公共 mqtt 服务器,该服务基于 emq x 的 mqtt 物联网云平台 创建。服务器接入信息如下:
broker: broker-cn.emqx.iotcp port: 1883ssl/tls port: 8883导入 composer autoload 文件和 php-mqtt/clientrequire('vendor/autoload.php');use \phpmqtt\client\mqttclient;
设置 mqtt broker 连接参数设置 mqtt broker 连接地址,端口以及 topic,同时我们调用 php rand 函数随机生成 mqtt 客户端 id。
$server = 'broker-cn.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) // last will 设置 ->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);
发布消息构造一个 payload,调用 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);}// 客户端轮询以处理传入消息和重发队列$mqtt->loop(true);
完整代码服务器连接、消息发布与接收代码。
<?phprequire('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) // last will 设置 ->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' => '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 服务器的连接、消息发布和订阅。
原文链接:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-php
作者:emq
推荐学习:《php视频教程》
以上就是一文快速了解php项目中怎么使用mqtt的详细内容。