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();
消息回调,第一次可以显示回调的主题,以后进不能显示了
Ubuntu22.04
workerman v4.1.16
workerman\mqtt v1.6
把你的脚本拷贝了一遍,没改任何东西,测试正常。
mqtt服务端用的mosquitto
难道是我系统的php版本的问题吗?我的php版本是7.4。我再测试下吧。
更换php版本后一样的问题,我暂时找不到哪里的问题了。
和php版本没关系,可能是mqtt客户端不是最新,或者mqtt服务端有问题。
我测试的环境版本如下
workerman/mqtt 1.6
mqtt服务端 mosquitto 2.0.18
好的,我的mqtt的服务器是emqx v1.0.1 可能和mqtt服务器有关系。