So verwenden Sie MQTT in PHP

PHP ist eine weit verbreitete Open-Source-Mehrzweck-Skriptsprache, die in HTML eingebettet werden kann und sich besonders für die Webentwicklung eignet.

Dieser Artikel stellt hauptsächlich die Verwendung von vor php-mqtt/client Client-Bibliothek in PHP-Projekten, um die Funktionen Verbindung, Abonnement, Abbestellen, Empfangen und Senden von Nachrichten zu implementieren MQTT-Client und MQTT-Server.

Auswahl der MQTT-Client-Bibliothek

In diesem Artikel wird die Clientbibliothek ausgewählt php-mqtt/client, die die höchsten Downloads auf Composer hat. Weitere PHP-MQTT-Client-Bibliotheken finden Sie unter [Packagist-Search MQTT]( =mqtt).

Weitere Dokumentation zu php-mqtt/client finden Sie unter Paketist php-mqtt/client.

Die MQTT-Kommunikation gehört zu einem Netzwerkkommunikationsszenario außerhalb des HTTP-Systems. Aufgrund der Einschränkung der PHP-Eigenschaften kann die Verwendung von Erweiterungen für die Netzwerkkommunikation wie Swoole/Workerman im PHP-System eine bessere Erfahrung bringen. Seine Verwendung wird in diesem Artikel nicht wiederholt. Die relevanten MQTT-Client-Bibliotheken lauten wie folgt:

Projektinitialisierung

Bestätigen Sie die PHP-Version

Dieses Projekt verwendet 7.4.21 für Entwicklung und Tests. Leser können die PHP-Version mit dem folgenden Befehl bestätigen.

php --version

PHP 7.4.21 (cli) (built: Jul 12 2021 11:52:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.21, Copyright (c), by Zend Technologies

Verwenden Sie Composer, um php-mqtt/client zu installieren

Composer ist ein Abhängigkeitsverwaltungstool für PHP, das alle Abhängigkeiten verwalten kann, die Ihr PHP-Projekt benötigt.

composer require php-mqtt/client

Verwendung von PHP MQTT

Verbinden Sie sich mit dem MQTT-Server

Dieser Artikel verwendet die Kostenloser öffentlicher MQTT-Server bereitgestellt von EMQX, das auf EMQX erstellt wird MQTT-Cloud-Dienst. Die Serverzugriffsinformationen lauten wie folgt:

  • Makler: broker.emqx.io
  • TCP-Port: 1883
  • SSL/TLS-Port: 8883

Importieren Sie die Composer Autoload-Datei und php-mqtt/client

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;

Legen Sie die MQTT-Broker-Verbindungsparameter fest

Legen Sie die MQTT Broker-Verbindungsadresse, den Port und das Thema fest. Gleichzeitig nennen wir das PHP rand Funktion zum zufälligen Generieren der MQTT-Client-ID.

$server="broker.emqx.io";
$port = 1883;
$clientId = rand(5, 15);
$username="emqx_user";
$password = null;
$clean_session = false;

Schreiben Sie die MQTT-Verbindungsfunktion

Verwenden Sie die obigen Parameter, um eine Verbindung herzustellen, und stellen Sie die Verbindungsparameter durch ConnectionSettingswie zum Beispiel:

$connectionSettings = new ConnectionSettings();
$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);

Programm zum Thema abonnieren emqx/test, und konfigurieren Sie eine Rückruffunktion für das Abonnement, um die empfangene Nachricht zu verarbeiten. Hier drucken wir das aus dem Abonnement erhaltene Thema und die Nachricht aus:

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

Veröffentlichen

Konstruieren Sie eine Nutzlast und rufen Sie die auf publish Funktion zum Veröffentlichen von Nachrichten an die emqx/test Thema. Nach der Veröffentlichung muss der Client den Abrufstatus eingeben, um die eingehenden Nachrichten und die Warteschlange für die erneute Übertragung zu verarbeiten:

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => '
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

// The client loop to process incoming messages and retransmission queues
$mqtt->loop(true);

Vollständiger Code

Serververbindung, Nachrichtenveröffentlichung und Empfangen von Code.

<?php

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;
use \PhpMqtt\Client\ConnectionSettings;

$server="broker.emqx.io";
$port = 1883;
$clientId = rand(5, 15);
$username="emqx_user";
$password = null;
$clean_session = false;

$connectionSettings = new ConnectionSettings();
$connectionSettings
  ->setUsername($username)
  ->setPassword(null)
  ->setKeepAliveInterval(60)
  ->setLastWillTopic('emqx/test/last-will')
  ->setLastWillMessage('client disconnect')
  ->setLastWillQualityOfService(1);

$mqtt = new MqttClient($server, $port, $clientId);

$mqtt->connect($connectionSettings, $clean_session);
printf("client connected\n");

$mqtt->subscribe('emqx/test', function ($topic, $message) {
    printf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);

for ($i = 0; $i< 10; $i++) {
  $payload = array(
    'protocol' => 'tcp',
    'date' => date('Y-m-d H:i:s'),
    'url' => '
  );
  $mqtt->publish(
    // topic
    'emqx/test',
    // payload
    json_encode($payload),
    // qos
    0,
    // retain
    true
  );
  printf("msg $i send\n");
  sleep(1);
}

$mqtt->loop(true);

Prüfen

Nach dem Ausführen des MQTT-Nachrichtenveröffentlichungscodes sehen wir, dass der Client erfolgreich eine Verbindung hergestellt hat und die Nachrichten nacheinander veröffentlicht und erfolgreich empfangen wurden:

php pubsub_tcp.php

PHP-MQTT-Test

Bisher haben wir die verwendet php-mqtt/client um sich mit dem zu verbinden öffentlicher MQTT-Serverund implementierte die Verbindung, die Nachrichtenveröffentlichung und das Abonnement zwischen dem Testclient und dem MQTT-Server.

Ursprünglich erschienen bei

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *