workerman/mqtt
MQTT는 클라이언트-서버 아키텍처의 퍼블리시/서브스크라이브 모델의 메시지 전송 프로토콜로, IoT의 중요한 구성 요소가 되었습니다. 그것의 디자인 사고는 가벼움, 개방성, 간단함, 규격화이며, 구현하기 쉽습니다. 이러한 특징들은 제한된 환경에서의 기계 간 통신(M2M) 및 IoT 환경과 같은 많은 상황에서 좋은 선택이 됩니다.
workerman\mqtt는 workerman 기반의 비동기 MQTT 클라이언트 라이브러리로, MQTT 프로토콜 메시지를 수신하거나 전송하는 데 사용할 수 있습니다. QoS 0, QoS 1, QoS 2를 지원합니다. MQTT 3.1, 3.1.1, 5 버전을 지원합니다.
프로젝트 주소
https://github.com/walkor/mqtt
설치
composer require workerman/mqtt
지원
- MQTT
- MQTT5
- WebSocket을 통한 MQTT
예시
subscribe.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->subscribe('test');
};
$mqtt->onMessage = function($topic, $content){
var_dump($topic, $content);
};
$mqtt->connect();
};
Worker::runAll();
명령행에서 실행 php subscribe.php start 시작
publish.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker();
$worker->onWorkerStart = function(){
$mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
$mqtt->onConnect = function($mqtt) {
$mqtt->publish('test', 'hello workerman mqtt');
};
$mqtt->connect();
};
Worker::runAll();
명령행에서 실행 php publish.php start 시작.
workerman\mqtt\Client 인터페이스
Client::__construct()Client::connect()Client::publish()Client::subscribe()Client::unsubscribe()Client::disconnect()Client::close()callback onConnectcallback onMessagecallback onErrorcallback onClose
__construct (string $address, [array $options])
mqtt 클라이언트 인스턴스를 생성합니다.
-
$addressmqtt 서버 주소, 형식은 'mqtt://test.mosquitto.org:1883'와 유사합니다. -
$options클라이언트 옵션 배열로, 다음 옵션을 설정할 수 있습니다:keepalive: 클라이언트가 서버에 보내는 심장 박동의 시간 간격, 기본값은 50초, 0으로 설정하면 심장 박동을 비활성화합니다.client_id: 클라이언트 ID, 설정하지 않으면 기본적으로"workerman-mqtt-client-".mt_rand()됩니다.protocol_name: 프로토콜 이름,MQTT(3.1.1 버전) 또는MQIsdp(3.1 버전), 기본값은MQTT입니다.protocol_level: 프로토콜 수준,protocol_name이MQTT일 경우 값은4,protocol_name이MQIsdp일 경우 값은3입니다.clean_session: 세션을 정리합니다, 기본값은true입니다.false로 설정하면QoS 1및QoS 2수준의 오프라인 메시지를 수신할 수 있습니다.reconnect_period: 재연결 시간 간격, 기본값1초,0이면 재연결하지 않습니다.connect_timeout: mqtt 연결 초과 시간, 기본값은30초입니다.username: 사용자 이름, 선택 사항입니다.password: 비밀번호, 선택 사항입니다.will: 유서 메시지, 클라이언트가 연결이 끊어졌을 경우 Broker가 다른 클라이언트에게 자동으로 유서 메시지를 발송합니다. 형식은:topic: 주제content: 내용qos:QoS수준retain:retain플래그
resubscribe: 연결이 비정상적으로 끊어지고 재연결되었을 때 이전 주제를 다시 구독할지 여부, 기본값은 true입니다.bindto로컬에서 어떤 IP와 포트를 사용하여 Broker에 연결할지를 지정하는 데 사용되며, 기본값은 ''입니다.sslSSL 옵션, 기본값은false입니다.true로 설정하면 SSL 방식으로 연결됩니다. SSL 컨텍스트 배열을 전달하여 로컬 인증서 등을 구성할 수 있으며, SSL 컨텍스트는 https://php.net/manual/en/context.ssl.php를 참조하십시오.debug디버그 모드를 활성화할지 여부, 디버그 모드는 Broker와의 통신에 대한 자세한 정보를 출력할 수 있으며, 기본값은false입니다.uriWebSocket을 통한 mqtt uri 주소, 일반적으로/mqtt입니다.
connect()
Broker에 연결합니다.
publish(String $topic, String $content, [array $options], [callable $callback])
특정 주제에 메시지를 발행합니다.
$topic주제$content메시지$options옵션 배열, 포함되어야 할 사항:qosQoS수준, 기본값은0retainretain 플래그, 기본값은falsedup재전송 플래그, 기본값은false
$callback-function (\Exception $exception = null),(QoS가 0일 경우 이 설정을 지원하지 않음)오류가 발생했거나 발행이 성공했을 때 트리거됩니다.$exception은 예외 객체이며, 오류가 발생하지 않으면$exception은null입니다, 이하 동일합니다.
subscribe(mixed $topic, [array $options], [callable $callback])
하나 또는 여러 주제를 구독합니다.
$topic은 문자열(하나의 주제를 구독) 또는 배열(여러 주제를 구독) 입니다.
여러 주제를 구독할 때는$topic이 주제는 키,QoS는 값의 배열로, 예를 들어array('topic1'=> 0, 'topic2'=> 1)입니다.$options구독 옵션 배열이며, 다음 설정을 포함합니다:qosQoS수준, 기본값은0
$callback-function (\Exception $exception = null, array $granted = [])
콜백 함수로, 구독이 성공하거나 오류가 발생했을 때 트리거됩니다.exception예외 객체이며, 오류가 발생하지 않으면null입니다, 이하 동일합니다.granted구독 결과 배열로 유사한array('topic' => 'qos', 'topic' => 'qos')형태이며, 여기서:topic은 구독된 주제입니다.qos는 Broker가 수락한QoS수준입니다.
unsubscribe(mixed $topic, [callable $callback])
구독 해제합니다.
$topic은 문자열 또는 문자열 배열, 예:array('topic1', 'topic2')입니다.$callback-function (\Exception $e = null), 성공 또는 실패 시 트리거되는 콜백입니다.
disconnect()
Broker와의 연결을 정상적으로 끊습니다. DISCONNECT 패킷이 Broker로 송신됩니다.
close()
Broker와의 연결을 강제로 끊습니다. DISCONNECT 패킷이 Broker로 송신되지 않습니다.
callback onConnect(Client $mqtt)
Broker와의 연결이 완료된 후 트리거됩니다. 이때 이미 Broker의 CONNACK 패킷을 수신했습니다.
callback onMessage(String $topic, String $content, Client $mqtt)
function (topic, message, packet) {}
클라이언트가 Publish 패킷을 수신했을 때 트리거됩니다.
$topic수신된 주제$content수신된 메시지 내용$mqttmqtt 클라이언트 인스턴스입니다.
callback onError(\Exception $exception = null)
연결에 오류가 발생했을 때 트리거됩니다.
callback onClose()
연결이 종료될 때 트리거됩니다. 클라이언트가主动적으로 종료하든 서버가 종료하든간에 onClose가 트리거됩니다.