thinkphp6安装php-mqtt/client,并实现实时消息收发写入日志

thinkphp6安装php-mqtt/client,并实现实时消息收发写入日志

系统:centos7

第一步:宝塔面板安装php环境8.0;

第二步:宝塔自带安装composer;

第三步:下载thinkphp6

create project composer require topthink/think:6.0.0 tp

tp是 新建的站点名称,设置php的访问目录到public下的index.php的入口文件;
建议开启:调试模式;

第四步 下载

composer require php-mqtt/client
参考地址和用法:https://gitcode.com/gh_mirrors/client9/client/blob/master/tests/TestCase.php

第五步:重点来了:
我这里采用单应用的模式(多应用的自行调整):
5.0文档编辑完了,发现发送主体没有编辑,来把 🐆补个;

<?php
namespace app\controller;use app\BaseController;
use Exception;
use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\ConnectionSettings;
use PhpMqtt\Client\Exceptions\ConfigurationInvalidException;
use PhpMqtt\Client\Exceptions\ConnectingToBrokerFailedException;
use PhpMqtt\Client\Exceptions\DataTransferException;
use PhpMqtt\Client\Exceptions\ProtocolNotSupportedException;
use PhpMqtt\Client\Exceptions\RepositoryException;
use React\EventLoop\Factory;
use think\facade\Log;class Index extends BaseController
{private $server = '118.*******';private $port = 1883;private $clientId = 'adminserver';private $username = 'adminserver';private $password = 'adminserver';/*** @throws ConnectingToBrokerFailedException* @throws ConfigurationInvalidException* @throws RepositoryException* @throws ProtocolNotSupportedException* @throws DataTransferException*/public function index(){
//        测试消息发送ok$this->publish('testtopic/1', 'Hello, MQTT!');}
public function publish($topic, $message, $qos = 2){try {// 创建 MQTT 客户端实例$mqtt = new MqttClient($this->server, $this->port, $this->clientId);// 设置连接选项$connectionSettings = (new ConnectionSettings)->setUsername($this->username) // 如果需要认证,设置用户名->setPassword($this->password) // 如果需要认证,设置密码->setKeepAliveInterval(60); // 设置心跳间隔
//                ->setReconnectAutomatically(true); // 设置为干净会话// 连接到 MQTT 服务器$mqtt->connect($connectionSettings, true);// 发布消息$mqtt->publish($topic, $message, $qos);// 断开连接$mqtt->disconnect();echo "消息已成功发布到主题: $topic\n";} catch (\Exception $e) {// 捕获并处理异常echo "发生错误: " . $e->getMessage() . "\n";}}

5.1/yourprject/app/command/定义:MqttSubscribe.php

<?php
namespace app\command;use think\console\Command;
use think\console\Input;
use think\console\Output;
use PhpMqtt\Client\MqttClient;
use PhpMqtt\Client\ConnectionSettings;
use PhpMqtt\Client\Exceptions\ConfigurationInvalidException;
use PhpMqtt\Client\Exceptions\ConnectingToBrokerFailedException;
use PhpMqtt\Client\Exceptions\DataTransferException;
use PhpMqtt\Client\Exceptions\ProtocolNotSupportedException;
use PhpMqtt\Client\Exceptions\RepositoryException;
use think\facade\Log;class MqttSubscribe extends Command
{protected function configure(){$this->setName('mqtt:subscribe')->setDescription('Subscribe to an MQTT topic');}protected function execute(Input $input, Output $output){$server   = '118.***'; // MQTT 服务器地址$port     = 1883;        // MQTT 服务器端口$clientId = 'adminserver'; // 客户端 ID$mqtt = new MqttClient($server, $port, $clientId);$connectionSettings = (new ConnectionSettings)->setUsername($clientId) // 可选->setPassword($clientId) // 可选->setKeepAliveInterval(60);             // 可选// ->setConnectTimeout(10)        // 可选// ->setWriteTimeout(5);          // 可选$mqtt->connect($connectionSettings, true);$topic = 'test/topic';// $mqtt->subscribe($topic, function ($topic, $message) {//     log::info("Received message on topic [$topic]: $message");//     // 进行数据处理操作// }, 0);$mqtt->subscribe($topic, function ($topic, $message) use ($output) {echo "Received message on topic [{$topic}]: {$message}";// 写入日志log::info("Received message on topic [{$topic}]: {$message}");// 控制台输出// 进行数据处理操作// 例如:处理接收到的消息}, 0);$mqtt->loop(true);$mqtt->disconnect();}
}

5.2/yourprject/app/command/定义:Command.php

<?php
namespace app\command;use think\console\Command as BaseCommand;
use think\console\Input;
use think\console\Output;
use think\facade\App;class Command extends BaseCommand
{protected function configure(){$this->addCommands(['app\command\MqttSubscribe',]);}
}

5.3/yourprject/config/修改,如果没有就创建:Command.php

<?phpreturn ['commands' => ['mqtt:subscribe' => 'app\command\MqttSubscribe',],
];

5.4/yourprject/config/console.php:

<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return ['commands' => [\app\command\MqttSubscribe::class,],
];

```powershell
提示:
//重新生成命令:
php think optimize//启动 
php think mqtt:subscribe//清除会话
php think clear

后端实时接收效果截图
在这里插入图片描述
客户端发起主体截图
在这里插入图片描述
日志与终端同时写入的效果图
日志写入在这里插入图片描述
6.至此,实时接收做完成(注意这个是持续会话连接,无需再次启停),接下来是php封装调用;

7.封装报错:
Call to undefined function app\controller\shell_exec()
7.1解决方案:用官方文档的办法,现在需要解决守护进程和动态传入主题;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

K8S资源限制之ResourceQuota

ResourceQuota介绍 在K8S中&#xff0c;大部分资源都可以指定到一个名称空间下&#xff0c;因此可以对一个名称空间的计算资源&#xff0c;存储资源&#xff0c;资源数量等维度做资源限制。 如限制pod数量、svc数量&#xff0c;控制器数量&#xff0c;限制PVC请求的存储量 注…

永磁同步电机无速度算法--滑模观测器(PLL)

一、原理介绍 在永磁同步电机滑模观测器控制中&#xff0c;转子的位置和转速信息与反动电势密切相关。滑模观测器控制基本设计思路是&#xff1a;利用永磁同步电机的电压、电流信息&#xff0c;通过永磁同步电机数学模型&#xff0c;估算出电机在两相静止坐标系中的反电动势信…

NIO 与传统 IO:深入理解与应用场景

在 Java 编程中&#xff0c;IO&#xff08;输入/输出&#xff09;操作是不可或缺的一部分。Java 提供了两种主要的 IO 机制&#xff1a;传统的阻塞式 IO&#xff08;Blocking IO&#xff09;和非阻塞式 IO&#xff08;Non-blocking IO&#xff09;&#xff0c;后者通常被称为 N…

TensorFlow 2.0 windows11 GPU 训练环境配置

前言 在一切开始之前&#xff0c;请确保你的cmd命令行和powershell命令行可以正常打开。如果不能&#xff0c;建议重装系统。我不确定这是否会影响你最终的结果&#xff0c;毕竟windows的坑太多了。 安装顺序&#xff1a;visual studio -> cuda -> cudnn -> python…

使⽤MATLAB进⾏⽬标检测

目录 数据准备定义模型并训练用测试集评估性能推理过程⼀⾏代码查看⽹络结构⼀⾏代码转onnx结语 ⼈⽣苦短&#xff0c;我⽤MATLAB。 Pytorch在深度学习领域占据了半壁江⼭&#xff0c;最主要的原因是⽣态完善&#xff0c;⽽且api直观易⽤。但谁能想到现在MATLAB⽤起来⽐Pytorch…

【Java】实战:多数元素

一、题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#x…

JAVA:探索 PDF 文字提取的技术指南

1、简述 随着信息化的发展&#xff0c;PDF 文档成为了信息传播的重要媒介。在许多应用场景下&#xff0c;如数据迁移、内容分析和信息检索&#xff0c;我们需要从 PDF 文件中提取文字内容。JAVA提供了多种库来处理 PDF 文件&#xff0c;其中 PDFBox 和 iText 是最常用的两个。…

vue3+vant实现弹幕循环播放~

1、效果图 <!-- 弹幕 --> <div style"height: 88px"><van-barragev-model"list"duration"5000":rows"rows":gap"gap":loop"loop"style"--move-distance: -345px" ><div class&quo…

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的&#xff1a; 本实验通过手动输入二叉树结点信息&#xff0c;构建相应的二叉树&#xff0c;并通过图形化界面动态演示先序遍历算法的过程。通过本次实验&#xff0c;我可以深入理解二叉树的数据结构、先序遍历算法…

大数据挖掘期末复习

大数据挖掘 数据挖掘 数据挖掘定义 技术层面&#xff1a; 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …

【Anomaly Detection论文阅读记录】Resnet网络与WideResNet网络

Resnet网络 网络结构&#xff1a;(层数计算不包括max pool、average pool、softmax等操作) 层数计算&#xff08;以Resnet-18为例子&#xff09;&#xff1a; conv1conv2_xconv3_xconv4_xconv5_xfc1(22)(22)(22)(22)118 WideResNet网络 WideResNet提出了一种新的体系结构&#…

基于YOLOv8深度学习的汽车车身车损检测系统研究与实现(PyQt5界面+数据集+训练代码)

本文研究并实现了一种基于YOLOV8深度学习模型的汽车车身车损检测系统&#xff0c;旨在解决传统车损检测中效率低、精度不高的问题。该系统利用YOLOV8的目标检测能力&#xff0c;在单张图像上实现了车身损坏区域的精确识别和分类&#xff0c;尤其是在车身凹痕、车身裂纹和车身划…

【前端学习笔记】Javascript学习二(运算符、数组、函数)

一、运算符 运算符&#xff08;operator&#xff09;也被称为操作符&#xff0c;是用于实现赋值、比较和执行算数运算等功能的符号。 JavaScript中常用的运算符有&#xff1a; 算数运算符、递增和递减运算符、比较运算符、逻辑运算符、赋值运算符 算数运算符&#xff1a; 、-…

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中&#xff0c;测试接口的有效性与响应情况变得尤为重要。本文将指导…

网络安全之信息收集-实战-1

请注意&#xff0c;本文仅供合法和授权的渗透测试使用&#xff0c;任何未经授权的活动都是违法的。 实战&#xff1a;补天公益src“吉林通用航空职业技术学院” 奇安信&#xff5c;用户登录https://www.butian.net/Loo/submit?cid64918 域名或ip&#xff1a;https://www.jlth…

鸿蒙实战:使用隐式Want启动Ability

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙应用项目2.2 修改Index.ets代码2.3 创建LuzhouAbility2.4 创建Luzhou页面2.5 设置模块配置文件 3. 测试效果4. 实战总结 1. 实战概述 本次鸿蒙应用实战&#xff0c;先创建项目“ImplicitWantStartAbility”&#xff0c;接着修改In…

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备&#xff0c;凭借其便携性…

【Node.js】Node.js 和浏览器之间的差异

Node.js 是一个强大的运行时环境&#xff0c;它在现代 JavaScript 开发中扮演着重要角色。然而&#xff0c;许多开发者在使用 Node.js 时常常会感到困惑&#xff0c;尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异&#xff0c;帮助你全面理解两者的设计…

qt之telnet连接目标设备在线调试功能

一、前言 在QT下使用telnet连接目标设备&#xff0c;进行在线命令调试&#xff0c;也可配合ftp或ssh使用。 telnet某些库在qt5下不可用&#xff0c;无法获取登录信息&#xff0c;只能获取到连接信息&#xff0c;这里我用自己的方式判断是否成功登录 二、环境 window qt5.7…