MQTT는 게시/구독 모델을 기반으로 하는 "경량" 통신 프로토콜로, 오버헤드가 낮고 대역폭이 낮은 인스턴트 메시징 프로토콜로서 사물 인터넷의 중요한 부분이 되었습니다. 간단합니다.
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
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 ] ); } } });
php subscribe.php를 실행하면 다음과 같은 출력이 표시됩니다
array(3) { ["type"]=> int(9) ["message_id"]=> int(1) ["codes"]=> array(1) { [0]=> int(1) } }
구독이 성공했음을 나타내며 코드는 해당 구독의 QoS 수준에 해당합니다. topic
Publish
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); } });
코드는 매 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!