php 中使用MQTT

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

本文主要介绍如何在 PHP项目中使用composer require php-mqtt/client库 ,实现客户端与 MQTT 服务器 的连接、订阅、收发消息等功能。

<?php

namespace app\command;

use PhpMqtt\Client\ConnectionSettings;
use PhpMqtt\Client\MqttClient;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use util\LogHelperUtil;

// composer require php-mqtt/client
class Mqtt extends Command
{
    protected function configure()
    {
        $this->setName('mqtt')
            ->setDescription('mqtt Hello');
    }

    protected function execute(Input $input, Output $output)
    {
        $mqttConfig = config('mqtt');
        // MQTT代理的配置
        $server = $mqttConfig['host'] ?? ''; // MQTT代理的地址
        $port = $mqttConfig['port'] ?? 1883; // MQTT代理的端口
        $username = 'test_mqtt'; // MQTT代理的用户名(如果需要)
        $password = '123456'; // MQTT代理的密码(如果需要)
        $clientId = 'service-mqtt-' . time(); // 客户端ID
        try {
            // 创建MQTT客户端实例
            $mqtt = new MqttClient($server, intval($port), $clientId);
            $settings = (new ConnectionSettings())->setUsername($username)->setPassword($password)
                ->setKeepAliveInterval(10)   // 根据需要设置心跳间隔
                ->setReconnectAutomatically(true) // 是否会尝试自动重新连接
                ->setDelayBetweenReconnectAttempts(2000) // 定义重新连接尝试之间的延迟(毫秒)。
                ->setMaxReconnectAttempts(10); // 重新连接的最大尝试次数
            $mqtt->connect($settings); // 连接到MQTT代理

            // 订阅一个主题
            $topic = 'testtopic/#';
            $mqtt->subscribe($topic, function ($topic, $message) use ($mqtt) {
                $time = self::getTime("Y年m月d日G时i分s秒x毫秒");
                echo "{$time} 主题:{$topic} - 收到:" . ($message) . PHP_EOL;
            
                if ($topic != 'testtopic/service/2' && $topic != 'testtopic/golang') {
                    $mqtt->publish('testtopic/service/2', "hello[{$topic}]", 2, true);
                }
            }, 2);

            // 保持脚本运行,以便接收消息
//            while ($mqtt->isConnected()) {
//                $mqtt->loop();
//            }
            $mqtt->loop();
//            $mqtt->disconnect(); // 断开连接
        } catch (\Exception $e) {
            echo "MQTT Error: " . $e->getMessage();
        }

        $output->writeln("Received message on topic");
    }

    private static function getTime($tag)
    {
        list($usec, $sec) = explode(" ", microtime());
        $now_time = $sec . '.' . substr($usec, 2, 4);
        list($usec, $sec) = explode(".", $now_time);
        $date = date($tag, $usec);
        return str_replace('x', $sec, $date);
    }
}
### 如何在PHP Webman框架中使用MQTT协议 为了实现在Webman框架内集成并利用MQTT协议,可以借鉴基于Workerman实现MQTT的方式[^1]。具体来说,在Webman项目里同样需要引入必要的依赖库来支持MQTT通信功能。 #### 安装依赖包 首先通过Composer安装`workerman/mqtt`扩展以及其它可能需要用到的相关组件: ```bash composer require workerman/mqtt ``` #### 创建订阅者脚本 (subscribe.php) 下面是一个简单的例子展示怎样设置一个MQTT客户端用于接收消息: ```php <?php use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker(); $worker->onWorkerStart = function(){ $mqtt = new \Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883'); // 当成功建立连接时触发此回调函数 $mqtt->onConnect = function($mqtt){ echo "Connected\n"; // 订阅主题 $mqtt->subscribe('webman/test', function(\Workerman\Mqtt\Message $message, string $topic) { printf("Received message on topic [%s]: %s\n", $topic, $message); }); }; // 连接到服务器 try { $mqtt->connect(); } catch (\Exception $e) { die($e->getMessage()); } }; // 启动所有工作进程 Worker::runAll(); ``` 这段代码展示了如何配置一个基本的MQTT客户端去监听来自指定主题的消息,并打印接收到的内容到控制台。 #### 发布消息 (publish.php) 对于发送数据给其他设备或应用程序,则可以通过另一个文件定义发布逻辑如下所示: ```php <?php use Workerman\Worker; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker(); $worker->onWorkerStart = function() { // 初始化一个新的MQTT客户端实例 $mqtt = new \Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883'); // 成功连接后的操作 $mqtt->onConnect = function($mqtt) { global $argv; if (!isset($argv[2])) exit("Usage: php {$argv[0]} start 'your message'\n"); // 将命令行参数作为要发布的消息体 $mqtt->publish('webman/test', $argv[2]); echo "Message published.\n"; // 断开连接结束程序执行 $mqtt->disconnect(); }; // 开始尝试与远程代理建立TCP/IP会话 try { $mqtt->connect(); } catch (\Exception $e) { die($e->getMessage()); } }; // 执行启动指令 if ($argc >= 2 && $argv[1] === 'start') { Worker::runAll(); } else { echo "Please run this script by command line like:\nphp publish.php start 'Your Message Here'"; } ``` 上述两个示例分别代表了一个完整的MQTT消费者和服务端点之间的交互过程;前者负责监听特定话题下的更新通知,后者则用来向该渠道推送新信息。 需要注意的是实际部署环境中应当替换掉测试用Broker地址(`mqtt://test.mosquitto.org`)为自己的私有化MQTT Broker服务地址,并根据需求调整安全性和性能选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值