MQTT开发,thinkphp6配合workerman/mqtt做物联网mqtt订阅与发布消息,支持长连接、断开重连
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这篇文章主在帮助使用tp6开发mqtt物联网网友:
首先:你要明白什么是mqtt,建议先看官网文档:MQTT 协议快速入门:基础知识和实用教程 | EMQ
其次:要会thinkphp6:ThinkPHP官方手册
最后你要了解workerman/mqtt是怎么简单使用的:workerman/mqtt
提示:开始搭建部署
一、部署thinkphp6
使用composer安装tp6:不了解composer的请先学习:Composer 中文网致力于推广 PHP 世界的包管理工具
# 安装命令
composer create-project topthink/think=6.0.x tp
完成之后进入tp目录
然后安装 topthink/think-worker
# 安装命令
composer require topthink/think-worker
其次再安装workerman/mqtt
# 安装命令
composer require workerman/mqtt
二、配置文件
1.用Visual Studio Code打开tp项目文件
打开config下的worker_server.php的配置文件
配置项worker_class
'worker_class' => [ // 自定义Workerman服务类名 支持数组定义多个服务
'mqtt\Mqtt'
],
如图
2.编写Mqtt类
在extend目录创建mqtt目录,在mqtt下创建Mqtt类
编写Mqtt类
namespace mqtt;
use think\facade\Log;
use think\worker\Server;
use Workerman\Worker;
// mqtt类继承think\worker\Server
class Mqtt extends Server
{
private $connection = null;
public function onWorkerStart($worker)
{
$options = [
'keepalive'=>60,
'client_id'=>"PUBLISH002",
'clean_session'=>true,
'reconnect_period'=>10,
'username'=>"admin",
"password"=>"Admin@1234567890"
];
$mqtt = new \Workerman\Mqtt\Client('mqtt://mqt.test.com:1883',$options); // mqtt://mqt.test.com:1883 这个域名请填写自己Broker的 域名
$this->connection = $mqtt;
// 订阅mqtt主题消息
$mqtt->onConnect = function($mqtt) {
$mqtt->subscribe('pub/#');// 订阅mqtt主题 pub/# 根据实际开发修改
};
$mqtt->onMessage = function($topic, $content){// 在此监听主题消息
$data = json_decode($content,true);
print_r('------订阅的主题消息-------');
var_dump($data);
//这里是你的业务代码下面是我的业务代码,根据时间需求开发即可
Log::write('onWorkerStart==:'.var_export($data,true));// 打印日志看看
};
$mqtt->connect();
// 内部端口调用 用于本地发布消息的时候调用
$inner_text_worker = new Worker('text://0.0.0.0:1884'); //内部调用端口
$inner_text_worker->onMessage = function ($connection, $message){
print_r('------发布消息-------');
var_dump($message);
$this->connection->publish('sub/PUBLISH001', $message);
$connection->send('ok');
};
$inner_text_worker->listen();
}
}
3.运行并测试监听主题消息是否正常
首先需要有自己的MQTT Broker服务,没有的不会的请先了解https://www.emqx.com/zh/blog/the-ultimate-guide-to-mqtt-broker-comparison,或者搭建自己的私有MQTT-broke服务
至此Mqtt类已经写好
3.1 在tp根目录执行启动命令
# 启动命令 如果要守护的话 在命令后面加 -d 如:php think worker:server -d
php think worker:server
如果启动出现 Error: Class ‘Workerman\Timer’ not found in F:\study\mqtt\tp\vendor\workerman\mqtt\src\Client.php:877 如图
那么说明安装Workerman\mqtt的版本出现点问题
修改一下文件workerman\mqtt\src\Client.php
use \Workerman\Protocols\Mqtt;
use \Workerman\Timer;
// 修改后
use \Workerman\Mqtt\Protocols\Mqtt;
use \Workerman\Lib\Timer;
如图
然后再次执行启动命令php think worker:server
这样就启动成功了
3.2 在Broker服务端看是否链接成功
不错,已经了成功,测试一下订阅的主题是否能收到消息
主题订阅的消息也没有问题,链接也很稳定
4.编写测试方法测试mqtt发布消息
在app/controller/Index.php文件中编写一个测试方法sendMsg 发布消息
public function sendMsg()
{
$arr = ['test'=>'发布消息测试!'];
if(empty($arr)) return false;
try {
$client = stream_socket_client('tcp://127.0.0.1:1884', $errno, $errmsg, 1);
}catch (\ErrorException $e){
return false;
}
fwrite($client, json_encode($arr) . "\n");
$_ok = trim(fread($client, 8192));//8192读取数据字节的长度
dd($_ok);
}
如图
终端运行 php think run 启动项目 访问 http://127.0.0.1:8000/index/sendMsg
看上图发布消息也是可以的,至此tp6配合workerman/mqtt做物联网mqtt订阅与发布消息简单开发就介绍到这里
总结
开发及对接MQTT物联网牵扯到方方面面的技术,需要耐心的花时间去了解和学习,不明白不了解的大家相互学习讨论。
如要搭建搭建自己的私有MQTT-broke服务,可以查看MQTT物联网开发,搭建自己的私有MQTT-broke服务,linux部署EMQX
作者:维护老旧PHP系统