昨天晚上写了一篇关于MQTT的笔记《Workerman MQTT协议通信指北》,通过上一篇笔记我们可以很直观的了解到PHP采用MQTT通讯时不只是安装workerman那么简单。还需要配置一个mqtt broker。
目前MQTT broker方面最老的是mosquitto,比较新的是emqx。安装方法很多,波波就不再说了,而且也很简单。
今天主要针对消息推送来进行分享和记录。
由于消息订阅可以实时获取MQTT broker中的信息,因此我们需要把订阅功能单独写出来,运行在CLI模式下。当然为了回复消息,订阅中也需要发布消息。与此同时,其他页面中的业务逻辑遇到需要推送的消息时怎么办?
为了解决mqtt消息的独立发布,我们需要将该功能独立出一个模块,在需要发布消息的业务单元中引入即可。
以ThinkPHP为例,我写了一个Model代码仅供参考。
1、引入类库phpMQTT
- composer require Bluerhinos\phpMQTT
2、Mqtt.php
- <?php
- namespace app\pigeon\model;
- use Bluerhinos\phpMQTT;
- use think\Model;
- /**
- *
- * Class Mqtt.php
- * @package app\admin\controller
- * @author 繁华如梦 <[email protected]>
- * @desc:Mqtt通讯模型
- * @date 2021/3/15 16:19
- */
- class Mqtt extends Model{
- /** MQTT 发送消息(发布)
- * @param string $topic 主题
- * @param object $content 消息
- * @param integer $qos 消息质量
- * @param bool $retain 离线发送
- */
- public function sender($topic,$content,$qos=0,$retain=false){
- require_once (VENDOR_PATH.'bluerhinos'.DS.'phpmqtt'.DS.'phpMQTT.php');
- $host = "127.0.0.1";
- $port = 1883;
- $username = "";
- $password = "";
- $mqtt = new phpMQTT($host,$port,"Server".rand(10000,99999));
- if($mqtt->connect(true,null,$username,$password)){
- //连接成功,发送消息
- $mqtt->publish($topic,$content,$qos,$retain);
- $mqtt->close();
- $data = ['code'=>200,'msg'=>"发送成功"];
- }else{
- $data = ['code'=>500,'msg'=>"服务器连接错误"];
- }
- return $data;
- }
- }
用户名和密码是连接broker时需要认证的。代码写入model后,可以在任意控制器中随意调用。也就实现了消息的自由发布。
以上代码我们同样可以用Workerman实现一遍,不同之处在于workerman的client创建方式。