用 Workerman 及 EMQX 做一个简单的 MQTT 示例

2025/04/30 计算机网络
$ docker run -d --name emqx -e EMQX_DASHBOARD__DEFAULT_PASSWORD=admin --network=lnmp -ti -p 18083:18083 -p 1883:1883 -p 8083-8084:8083-8084 -p 4370:4370 -p 5369:5369 emqx/emqx:5.8
$ composer require workerman/mqtt:2.1
<?php

use Workerman\Timer;
use Workerman\Worker;

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

$worker = new Worker();
$worker->onWorkerStart = function () {
    $mqttClients = [];
    for ($i = 0; $i < 10000; $i++) {
        $mqttClients[$i] = new Workerman\Mqtt\Client('mqtt://emqx:1883');
        $mqttClients[$i]->onConnect = function ($mqttClient) {
            $mqttClient->subscribe('test');
        };
        $mqttClients[$i]->onMessage = function ($topic, $content) use ($i) {
            echo $i, "\t", $topic, "\t", $content, "\n";
        };
        $mqttClients[$i]->connect();
    }

    $num = 1;
    Timer::add(1, function () use ($mqttClients, &$num) {
        try {
            $mqttClients[0]->publish('test', 'hello ' . $num);
            $num += 1;
        } catch (Throwable $e) {
            echo "Throwable:", $e->getMessage(), "\n";
        }
    });
};

try {
    Worker::runAll();
} catch (Throwable $e) {
    echo $e->getMessage(), "\n";
}

dashboard

subscribe_from_dashboard

Search

    Table of Contents