ホームページ  >  記事  >  PHPフレームワーク  >  SwooleとMQTTプロトコルを組み合わせた実装方法

SwooleとMQTTプロトコルを組み合わせた実装方法

WBOY
WBOYオリジナル
2023-06-25 11:00:342162ブラウズ

モノのインターネットの発展に伴い、リアルタイムのデータ送信と通信を必要とするアプリケーションがますます増えています。メッセージ キュー トランスポート プロトコル (MQTT) は、小型デバイスや低帯域幅環境に適した軽量プロトコルであり、IoT デバイスでのデータ送信によく使用されます。高性能、非同期、イベント駆動型のネットワーク通信フレームワークとして、Swoole は TCP/UDP/UnixSocket プロトコルの効率的な実装を提供し、MQTT プロトコルと併用してより効率的なシステム通信を提供できます。

この記事では、Swoole および MQTT プロトコルを使用して通信する方法を紹介し、実現可能なソリューションを提供します。

まず、MQTT プロトコルの基本的な知識を理解する必要があります。これは、デバイス間の双方向通信を可能にするパブリッシュ/サブスクライブ モデルに基づくプロトコルです。 MQTT プロトコルには、パブリッシャーとサブスクライバーという 2 つの主な役割があります。パブリッシャーはトピックにメッセージをパブリッシュし、サブスクライバーは関心のあるトピックをサブスクライブして、パブリッシャーによってパブリッシュされたメッセージをリアルタイムで受信できます。 MQTTプロトコルでは、トピックはパブリッシュ/サブスクライブの識別子として文字列として定義されます。

次に、Swoole フレームワークと組み合わせて MQTT プロトコルのパブリッシュ/サブスクライブ モデルを実装します。

Swoole を使用して MQTT プロトコルを実装する前に、MQTT ライブラリをインストールする必要があります。 Swoole は MQTT 通信に php-mqtt ライブラリを使用でき、composer を使用してそれをインストールできます。

composer require bluerhinos/phpmqtt dev-master

インストールが成功したら、Swoole を使用して MQTT プロトコルとの通信を開始できます。

まず、Swoole フレームワークに基づいて TCP サーバーを作成する必要があります。この TCP サーバーでは、データ送信に MQTT プロトコルを使用します。 Swoole フレームワークでは、次のコードを使用して TCP サーバーを作成できます。

$server = new SwooleServer('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

次に、クライアント要求を処理できるように、サーバーの起動時にサービス フックを登録する必要があります。この例では、onConnect、onReceive、および onClose メソッドを使用します。

$server->on('connect', function ($serv, $fd) {
    echo "Client: Connect.
";
});

$server->on('receive', function ($serv, $fd, $from_id, $data) {
    echo "Receive Data: $data
";

    // 处理MQTT消息
});

$server->on('close', function ($serv, $fd) {
    echo "Client: Close.
";
});

クライアント要求を受信すると、MQTT メッセージを解析します。この記事の焦点は、Swoole を使用して MQTT プロトコルを実装する方法であるため、MQTT メッセージを解析する方法のみに焦点を当てます。 MQTT メッセージは、php-mqtt ライブラリを使用して簡単に解析でき、それをメソッドにカプセル化できます:

function handleMqttMessage($client_id, $topic, $message)
{
    echo "Mqtt Message Received: 
";
    echo "Client ID: $client_id
";
    echo "Topic: $topic
";
    echo "Message: $message
";
}

残りの作業は、MQTT メッセージの解析されたデータを、受信を希望するクライアントに送信することです。 。 MQTT プロトコルでは、パブリッシュ/サブスクライブ モードを使用して通信し、指定されたトピックにメッセージをパブリッシュできます。クライアントは、関心のあるトピックをサブスクライブし、そのトピックに関して公開されたメッセージを受信できます。 Swoole フレームワークでは、swoole_server->task() を使用して特定のクライアントにメッセージを送信できます。

次のコードは、MQTT メッセージを受信した後、対応するトピックにサブスクライブしているすべてのクライアントにメッセージを送信します。

$server->on('receive', function ($serv, $fd, $from_id, $data) {
    $mqtt = new BluerhinosphpMQTT('localhost', 1883, 'Swoole_Server');
    $mqtt->debug = false;
    if (!$mqtt->connect()) {
        exit(1);
    }
    $topics['topic_name'] = array('qos' => 0, 'function' => 'handleMqttMessage');
    $mqtt->subscribe($topics, 0);
    while ($mqtt->proc()) {
    };
    $mqtt->close();
    echo "Receive Data: $data
";

    $data = json_decode($data, true);
    $message = $data['message'];

    $client_ids = $serv->getClientList();
    foreach ($client_ids as $client_id) {
        $serv->task("$client_id:$message");
    }

});

クライアント メッセージが受信されるたびに、サブスクライブされたトピックはコールバック メソッド handleMqttMessage() を呼び出し、指定されたクライアントにメッセージを送信します。

最後に、Task イベントでメッセージをクライアントに送信する必要があります。

$server->on('task', function ($serv, $task_id, $from_id, $data) {
    $client_id = strstr($data, ':', true);
    $message = substr(strstr($data, ':'), 1);
    $serv->send($client_id, $message);
});

上記のコードは、メッセージをクライアントに送信し、送信が成功した後に対応する ACK メッセージを返します。

概要
この記事では、Swoole を使用して MQTT プロトコルを実装する方法を学びました。このようにして、効率的なリアルタイム通信を実現し、非同期のイベント駆動型アプローチを使用してクライアント要求をより適切に処理できます。 Swoole フレームワークは効率的な TCP/UDP/UnixSocket プロトコルの実装を提供し、大企業と小規模プロジェクトの両方に多くの利点をもたらします。将来的には、データ転送と通信に Swoole プロトコルと MQTT プロトコルを使用するアプリケーションがさらに増えることが予想されます。

以上がSwooleとMQTTプロトコルを組み合わせた実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。