Heim >Backend-Entwicklung >PHP-Problem >Was funktioniert für PHP-Protokoll-Parsing- und Coroutine-Clients?
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.
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
composer require simps/mqttNach 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['keep_alive']) && $timeSincePing < (time() - $config['keep_alive'])) { $buffer = $client->ping(); if ($buffer) { echo 'send ping success' . PHP_EOL; $timeSincePing = time(); } else { $client->close(); break; } } // QoS1 发布回复 if ($buffer['type'] === Types::PUBLISH && $buffer['qos'] === 1) { $client->send( [ 'type' => Types::PUBACK, 'message_id' => $buffer['message_id'], 'code' => ReasonCode::SUCCESS ] ); } } });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) } }Zeigt an, dass das Abonnement erfolgreich ist und die Codes dem QoS-Level des entsprechenden Abonnements entsprechen ThemaVeröffentlichenErstellen 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__ . '/vendor/autoload.php'; use Swoole\Coroutine; use Simps\MQTT\Client; $config = [ 'host' => 'broker.emqx.io', 'port' => 1883, 'time_out' => 5, 'user_name' => 'user002', 'password' => 'adIJS1D482sd', 'client_id' => Client::genClientID(), 'keep_alive' => 20, '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 (!$client->connect()) { Coroutine::sleep(3); $client->connect(); } while (true) { $response = $client->publish( 'simps-mqtt/user001/get', '{"time":' . time() . '}', 1, 0, 0, ['topic_alias' => 1] ); var_dump($response); Coroutine::sleep(3); } });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ütztStudenten, 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 arbeitenEmpfohlen 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!