Was funktioniert für PHP-Protokoll-Parsing- und Coroutine-Clients?

醉折花枝作酒筹
Freigeben: 2023-03-10 22:40:01
nach vorne
2408 Leute haben es durchsucht

MQTT ist ein „leichtes“ Kommunikationsprotokoll, das auf dem Publish/Subscribe-Modell basiert. Als Instant-Messaging-Protokoll mit geringem Overhead und geringer Bandbreite ist es zu einem wichtigen Bestandteil des Internets der Dinge geworden es. simps/mqtt.

Was funktioniert für PHP-Protokoll-Parsing- und Coroutine-Clients?

MQTT ist ein „leichtes“ Kommunikationsprotokoll, das auf dem Publish/Subscribe-Modus basiert. Als Instant-Messaging-Protokoll mit geringem Overhead und geringer Bandbreite ist es zu einem wichtigen Bestandteil des Internets der Dinge geworden Bietet PHP die Möglichkeit, IoT-Projekte zu entwickeln. Sobald die Option aktiviert ist, wird der MQTT-Paketheader analysiert. Das onReceive-Ereignis des Worker-Prozesses gibt natürlich jedes Mal ein vollständiges MQTT-Paket zurück Es gibt andere, wie die zuvor von Workerman bereitgestellte asynchrone MQTT-Client-Bibliothek und andere Open-Source-Bibliotheken. Ich werde sie hier nicht einzeln vorstellen. Die erste Version der MQTT-Bibliothek von Simps ist ein Verweis auf die Implementierung von Workerman. Damit es verwendet werden kann, haben die Coroutine-Fähigkeiten von Swoole auch einige Probleme behoben

Ich möchte auch @walkor für seinen Beitrag zum PHP-Ökosystem danken

Die Implementierung der ersten Version wurde in das Framework gestellt, was die Verwendung von einschränkte einige Benutzer. Also haben wir erneut mit dem Refactoring begonnen und MQTT in eine Bibliothek aufgeteilt, was nicht nur die Verwendung für Benutzer erleichtert, sondern auch das PHP-Ökosystem bereichert, sodass PHP-Programmierer nicht mehr auf die Webentwicklung beschränkt sind

Nach der Veröffentlichung der ersten Version In der Simps-Kommunikationsgruppe haben viele Benutzer auch nach MQTT gefragt. Die Verwendung von PHP + Swoole zur Entwicklung von IoT-bezogenen Projekten sollte nun noch leistungsfähiger sein Die MQTT-Bibliothek unterstützt nur MQTT 3.x, MQTT 5.0 nicht und es wurde keine relevante unterstützende Klassenbibliothek auf GitHub gefunden. Nach der Umgestaltung der 3.x-Version unterstützt sie daher auch MQTT 5.0

Vielleicht ist dies die erste, die das unterstützt MQTT v5.0-Protokoll PHP-Bibliothek...

Unterstützt die MQTT-Protokollversionen 3.1, 3.1.1 und 5.0, unterstützt QoS 0, QoS 1, QoS 2, dann ist es hier, verwenden Sie Composer zur Installation

composer require simps/mqtt
Nach dem Login kopieren

Nach der Installation ist Schauen wir uns das Abonnement und die Verwendung von Veröffentlichungen am Beispiel von MQTT5.0 an entsprechendes Thema. Erstellen Sie eine subscribe.php und schreiben Sie den folgenden Inhalt

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

use Simps\MQTT\Hex\ReasonCode;
use Swoole\Coroutine;
use Simps\MQTT\Client;
use Simps\MQTT\Types;

$config = [
    'host' => 'broker.emqx.io',
    'port' => 1883,
    'time_out' => 5,
    'user_name' => 'user001',
    'password' => 'hLXQ9ubnZGzkzf',
    'client_id' => Client::genClientID(),
    'keep_alive' => 10,
    'properties' => [
        'session_expiry_interval' => 60,
        'receive_maximum' => 200,
        'topic_alias_maximum' => 200,
    ],
    'protocol_level' => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, ['open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024]);
    while (!$data = $client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    $topics['simps-mqtt/user001/get'] = [
        'qos' => 1,
        'no_local' => true,
        'retain_as_published' => true,
        'retain_handling' => 2,
    ];
    $timeSincePing = time();
    $res = $client->subscribe($topics);
    // 订阅的结果
    var_dump($res);
    while (true) {
        $buffer = $client->recv();
        if ($buffer && $buffer !== true) {
            $timeSincePing = time();
            // 收到的数据包
            var_dump($buffer);
        }
        if (isset($config[&#39;keep_alive&#39;]) && $timeSincePing < (time() - $config[&#39;keep_alive&#39;])) {
            $buffer = $client->ping();
            if ($buffer) {
                echo &#39;send ping success&#39; . PHP_EOL;
                $timeSincePing = time();
            } else {
                $client->close();
                break;
            }
        }
        // QoS1 发布回复
        if ($buffer[&#39;type&#39;] === Types::PUBLISH && $buffer[&#39;qos&#39;] === 1) {
            $client->send(
                [
                    &#39;type&#39; => Types::PUBACK,
                    &#39;message_id&#39; => $buffer[&#39;message_id&#39;],
                    &#39;code&#39; => ReasonCode::SUCCESS
                ]
            );
        }
    }
});
Nach dem Login kopieren

Führen Sie php subscribe.php aus. Sie erhalten eine Ausgabe wie diese

array(3) {
  ["type"]=>
  int(9)
  ["message_id"]=>
  int(1)
  ["codes"]=>
  array(1) {
    [0]=>
    int(1)
  }
}
Nach dem Login kopieren

Zeigt an, dass das Abonnement erfolgreich ist und die Codes dem QoS-Level des entsprechenden Abonnements entsprechen Thema
Veröffentlichen

Erstellen Sie nach erfolgreichem Abonnement eine Publish.php, um die Veröffentlichung zu testen Öffnen Sie ein neues Terminalfenster und führen Sie phpPublish.php aus. Sie erhalten die Ausgabe:

include __DIR__ . &#39;/vendor/autoload.php&#39;;

use Swoole\Coroutine;
use Simps\MQTT\Client;

$config = [
    &#39;host&#39; => &#39;broker.emqx.io&#39;,
    &#39;port&#39; => 1883,
    &#39;time_out&#39; => 5,
    &#39;user_name&#39; => &#39;user002&#39;,
    &#39;password&#39; => &#39;adIJS1D482sd&#39;,
    &#39;client_id&#39; => Client::genClientID(),
    &#39;keep_alive&#39; => 20,
    &#39;properties&#39; => [
        &#39;session_expiry_interval&#39; => 60,
        &#39;receive_maximum&#39; => 200,
        &#39;topic_alias_maximum&#39; => 200,
    ],
    &#39;protocol_level&#39; => 5,
];

Coroutine\run(function () use ($config) {
    $client = new Client($config, [&#39;open_mqtt_protocol&#39; => true, &#39;package_max_length&#39; => 2 * 1024 * 1024]);
    while (!$client->connect()) {
        Coroutine::sleep(3);
        $client->connect();
    }
    while (true) {
        $response = $client->publish(
            &#39;simps-mqtt/user001/get&#39;,
            &#39;{"time":&#39; . time() . &#39;}&#39;,
            1,
            0,
            0,
            [&#39;topic_alias&#39; => 1]
        );
        var_dump($response);
        Coroutine::sleep(3);
    }
});
Nach dem Login kopieren

Die Nachricht wurde hier hinzugefügt. Um für Benutzer lesbar zu sein, müssen Sie nicht nach der Bedeutung des entsprechenden Codes suchen.

Zurück zum Abonnementfenster und Sie sehen die gedruckten Versionsinformationen Unterstützt MQTT5 nicht und einige Eigenschaften werden noch nicht unterstützt

Studenten, die teilnehmen möchten, können eine PR einreichen. Wenn Sie Fragen haben, können Sie auch ein Problem einreichen. Lassen Sie uns gemeinsam am Aufbau des PHP-Ökosystems arbeiten

Empfohlen Lernen:

php-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas funktioniert für PHP-Protokoll-Parsing- und Coroutine-Clients?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage