mqtt使用protocol_level => 5 时消息回调有问题

a97663286

问题描述

workerman\mqtt在使用 'protocol_level' => 5 时连接,然后消息的回调第一次主题的参数是正确的,接收第二次以后得消息回调,主题就为空了

$mqtt->onMessage = function ($topic, $content, $packet) {
    echo $topic . ":" . $content . PHP_EOL;
};

第一次可以正常显示,第二次以后$topic 就为空了

程序代码或配置

<?php

require __DIR__ . '/vendor/autoload.php';

use Workerman\Timer;
use Workerman\Worker;

$worker = new Worker('websocket://0.0.0.0:8282');
$worker->name   = 'mqtt';
// 这里进程数必须设置为1
$worker->count = 1;

$worker->onWorkerStart = function (Worker $worker) {
    //初始化mqtt进行连接
    $mqtt = new Workerman\Mqtt\Client('mqtt://127.0.0.1:1883', array(
        'debug'          => false,
        "client_id"      => "workerman_server",
        "keepalive"      => 60,
        "username"       => "workerman_server", "password" => "Ufo@8888",
        "clean_session"  => false,
        'properties'     => [
            'session_expiry_interval' => 60,
            'receive_maximum'         => 65535,
            'topic_alias_maximum'     => 65535,
        ],
        'protocol_level' => 5, //使用协议5时接收到订阅消息回调函数中topic会有空值的问题,所以不能使用5的协议版本

    ));
    $mqtt->onConnect = function (Workerman\Mqtt\Client $mqtt)  {

        //连接成功后启动一个心跳主题进行定时发布
        Timer::add(5, function () use ($mqtt) {
            $mqtt->publish('heart',
                '{"cmd":"heart",  "time":"' . date('Y-m-d H:i:s') . '"}',
                [
                    'qos'    => 0,
                    'retain' => 0,
                    'dup'    => 0,
                ]
            );
        });
        //默认连接成功订阅 heart主题
        $mqtt->subscribe('heart');

    };
    $mqtt->onMessage = function ($topic, $content, $packet) {
        echo $topic . ":" . $content . PHP_EOL;
    };

    // 连接mqtt
    $mqtt->connect();
};

Worker::runAll();

重现问题的步骤

消息回调,第一次可以显示回调的主题,以后进不能显示了
截图

操作系统环境及workerman/webman等具体版本

Ubuntu22.04
workerman v4.1.16
workerman\mqtt v1.6

164 1 1
1个回答

walkor

把你的脚本拷贝了一遍,没改任何东西,测试正常。
截图

mqtt服务端用的mosquitto

  • a97663286 28天前

    难道是我系统的php版本的问题吗?我的php版本是7.4。我再测试下吧。

  • a97663286 28天前

    更换php版本后一样的问题,我暂时找不到哪里的问题了。

  • walkor 28天前

    和php版本没关系,可能是mqtt客户端不是最新,或者mqtt服务端有问题。
    我测试的环境版本如下
    workerman/mqtt 1.6
    mqtt服务端 mosquitto 2.0.18

  • a97663286 28天前

    好的,我的mqtt的服务器是emqx v1.0.1 可能和mqtt服务器有关系。

×
🔝