当前位置: 首页 > 后端技术 > PHP

如何在PHP项目中使用MQTT

时间:2023-03-29 19:39:37 PHP

PHP是一种广泛使用的开源多用途脚本语言,可以嵌入HTML,特别适用于Web开发。本文主要介绍如何在PHP项目中使用php-mqtt/client客户端库实现MQTT客户端与MQTT服务端之间的连接、订阅、取消订阅、收发消息等功能。MQTT客户端库选择本文选择composer上下载量最高的客户端库php-mqtt/client。更多PHP-MQTT客户端库可以在Packagist-SearchMQTT查看。更多php-mqtt/client的使用文档,请参考Packagistphp-mqtt/client。MQTT通信属于HTTP体系之外的网络通信场景。由于PHP特性的限制,在PHP系统中使用Swoole/Workerman等专门为网络通信设计的扩展可以带来更好的体验。本文将不介绍其使用。相关MQTT客户端库如下:workerman/mqtt:基于workerman.simps/mqtt:MQTTProtocolAnalysisandCoroutineClientforPHP的异步MQTT客户端。项目初始化确认PHP版本。本项目使用7.4.21进行开发测试。读者可以使用如下命令来确认PHP的版本。php--versionPHP7.4.21(cli)(内置:2021年7月12日11:52:30)(NTS)版权所有(c)ThePHPGroupZendEnginev3.4.0,版权所有(c)ZendTechnologieswithZendOPcachev7.4.21,版权所有(c),ZendTechnologies使用Composer客户端安装php-mqtt/clientComposer是PHP的依赖项管理工具,用于管理PHP项目所需的所有依赖项。composer需要使用php-mqtt/clientPHPMQTT连接MQTT服务器本文将使用EMQX提供的免费公共MQTT服务器,该服务器基于EMQX的MQTT物联网云平台打造。服务器访问信息如下:Broker:broker-cn.emqx.ioTCP端口:1883SSL/TLS端口:8883导入composerautoload文件和php-mqtt/clientrequire('vendor/autoload.php');use\PhpMqtt\Client\MqttClient;设置MQTTBroker连接参数设置MQTTBroker连接地址、端口和主题,我们调用PHPrand函数随机生成MQTT客户端id。$server='broker-cn.emqx.io';$port=1883;$clientId=rand(5,15);$username='emqx_user';$password=null;$clean_session=false;编写MQTT连接函数使用以上参数进行连接,通过ConnectionSettings设置连接参数,如$connectionSettings=newConnectionSettings();$connectionSettings->setUsername($username)->setPassword(null)->setKeepAliveInterval(60)//最后遗嘱设置->setLastWillTopic('emqx/test/last-will')->setLastWillMessage('clientdisconnect')->setLastWillQualityOfService(1);订阅消息编写代码订阅emqx/test主题,并为订阅配置回调函数来处理接收到的消息,这里我们打印订阅的主题和消息://subscribe$mqtt->subscribe('emqx/test',function($topic,$message){printf("收到关于主题[%s]的消息:%s\n",$topic,$message);},0);发布消息构建payload,调用publish函数发布消息到emqx/test主题,发布完成后,客户端需要进入轮询状态处理传入的Message和重传队列:for($i=0;$i<10;$i++){$payload=array('protocol'=>'tcp','date'=>date('Y-m-dH:i:s'),'url'=>'https://github.com/emqx/MQTT-Client-Examples');$mqtt->publish(//topic'emqx/test',//payloadjson_encode($payload),//qos0,//retaintrue);printf("消息$i发送\n");sleep(1);}//客户端轮询以处理传入消息并重新发送队列$mqtt->loop(true);完整的代码服务器连接、消息发布和接收代码setUsername($username)->setPassword(null)->setKeepAliveInterval(60)//LastWill设置->setLastWillTopic('emqx/test/last-will')->setLastWillMessage('clientdisconnect')->setLastWillQualityOfService(1);$mqtt=newMqttClient($server,$port,$clientId);$mqtt->connect($connectionSettings,$clean_session);printf("客户端连接\n");$mqtt->subscribe('emqx/test',function($topic,$message){printf("收到关于主题[%s]的消息:%s\n",$topic,$message);},0);for($i=0;$i<10;$i++){$payload=array('protocol'=>'tcp','date'=>date('Y-m-dH:i:s'),'url'=>'https://github.com/emqx/MQTT-Client-Examples');$mqtt->publish(//主题'emqx/test',//负载json_encode($payload),//qos0,//保留true);printf("msg$i发送\n");睡眠(1);}$mqtt->循环(真);测试并运行MQTT消息发布代码,我们会看到客户端已经连接成功,并且消息一条一条发布并接收成功:phppubsub_tcp.php至此,我们就完成了对php-mqtt/client客户端连接公共MQTT服务器,实现测试客户端与MQTT服务器的连接、消息发布与订阅版权声明:本文为EMQ原创,转载请注明出处。

最新推荐
猜你喜欢