>백엔드 개발 >PHP 문제 >PHP 프로토콜 구문 분석 및 코루틴 클라이언트에 작동하는 것

PHP 프로토콜 구문 분석 및 코루틴 클라이언트에 작동하는 것

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-06-28 15:44:352439검색

MQTT는 게시/구독 모델을 기반으로 하는 "경량" 통신 프로토콜로, 오버헤드가 낮고 대역폭이 낮은 인스턴트 메시징 프로토콜로서 사물 인터넷의 중요한 부분이 되었습니다. 간단합니다.

PHP 프로토콜 구문 분석 및 코루틴 클라이언트에 작동하는 것

MQTT는 게시/구독 모드를 기반으로 하는 "경량" 통신 프로토콜로, 낮은 오버헤드, 낮은 대역폭 인스턴트 메시징 프로토콜로서 사물 인터넷의 중요한 부분이 되었습니다.

Swoole. PHP는 IoT 프로젝트를 개발할 수 있는 기능을 제공합니다. open_mqtt_protocol 옵션만 설정하면 작업자 프로세스의 onReceive 이벤트가 매번 완전한 MQTT 패킷을 반환합니다. 이전에 Workerman에서 제공한 비동기 mqtt 클라이언트 라이브러리와 기타 오픈 소스 라이브러리는 여기서 하나씩 소개하지 않겠습니다.

Simps의 MQTT 라이브러리의 첫 번째 버전은 Workerman 구현에 대한 참조입니다. 사용할 수 있도록 Swoole의 코루틴 기능도 일부 문제를 해결했습니다

PHP 생태계에 기여한 @walkor에게도 감사의 말씀을 전하고 싶습니다

첫 번째 버전의 구현은 프레임워크에 배치되어 사용이 제한되었습니다. 일부 사용자. 그래서 우리는 다시 리팩토링을 시작했고 MQTT를 라이브러리로 분리하여 사용자가 사용하기 쉽게 할 뿐만 아니라 PHP 생태계를 풍부하게 하여 PHP 프로그래머가 더 이상 웹 개발에만 국한되지 않도록 했습니다

첫 번째 버전 출시 후 , Simps 커뮤니케이션 그룹에서도 많은 사용자들이 MQTT에 대해 문의해 왔습니다. Swoole은 일부 관련 버그도 수정했습니다. 이제 PHP + Swoole을 사용하여 IoT 관련 프로젝트를 개발하는 것이 더욱 강력해질 것입니다

동시에 첫 번째 버전은 MQTT 라이브러리는 MQTT 3.x만 지원하고 MQTT 5.0은 지원하지 않으며 GitHub에는 관련 지원 클래스 라이브러리가 없으므로 3.x 버전을 리팩토링한 후 MQTT 5.0도 지원합니다

아마도 이것이 처음으로 MQTT v5.0 프로토콜 PHP 라이브러리...

MQTT 프로토콜 버전 3.1, 3.1.1 및 5.0을 지원하고 QoS 0, QoS 1, QoS 2를 지원합니다. 그러면 작곡가를 사용하여 설치합니다.
composer require simps/mqtt

설치 후 성공했다면 MQTT5.0을 예로 들어 구독과 게시 사용을 살펴보겠습니다.

Subscription

가장 먼저 해야 할 일은 구독이 성공한 후에야 게시 메시지를 받을 수 있다는 것입니다. 해당 주제에 subscribe.php를 생성하고 다음 내용을 작성합니다

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
                ]
            );
        }
    }
});

php subscribe.php를 실행하면 다음과 같은 출력이 표시됩니다

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

구독이 성공했음을 나타내며 코드는 해당 구독의 QoS 수준에 해당합니다. topic

Publish

구독이 성공한 후, 게시를 테스트하기 위해 게시.php를 생성하세요

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);
    }
});

코드는 매 3 구독 주제에 메시지를 게시함을 의미합니다. simps-mqtt/user001/get 1초에 한 번씩

Open 새 터미널 창에서 phpPublish.php를 실행하면 다음과 같은 결과가 나옵니다.

array(4) {
  ["type"]=>
  int(4)
  ["message_id"]=>
  int(1)
  ["code"]=>
  int(0)
  ["message"]=>
  string(7) "Success"
}

메시지가 여기에 추가되어 사용자가 읽을 수 있도록 해당 코드의 의미를 찾으러 갈 필요가 없습니다

다음으로 돌아가세요. 구독 창을 열면 인쇄된 릴리스 정보가 표시됩니다

array(8) {
  ["type"]=>
  int(3)
  ["topic"]=>
  string(0) ""
  ["message"]=>
  string(19) "{"time":1608017156}"
  ["dup"]=>
  int(1)
  ["qos"]=>
  int(1)
  ["retain"]=>
  int(0)
  ["message_id"]=>
  int(4)
  ["properties"]=>
  array(1) {
    ["topic_alias"]=>
    int(1)
  }
}

이런 간단한 게시 및 구독 기능이 구현되었습니다

이 라이브러리에는 아직 최적화 및 개선할 가치가 있는 것들이 있습니다. MQTT5를 지원하지 않으며 일부 속성은 아직 지원되지 않습니다

참여를 원하는 학생은 PR을 제출할 수 있습니다. 질문이 있는 경우 이슈를 제출하여 PHP 생태계를 구축해 보세요

추천 학습 :

php 비디오 튜토리얼

위 내용은 PHP 프로토콜 구문 분석 및 코루틴 클라이언트에 작동하는 것의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제