PHP에서 MQTT를 사용하는 방법

PHP은 널리 사용되는 오픈 소스 다목적 스크립팅 언어로, HTML에 포함할 수 있으며 특히 웹 개발에 적합합니다.

이 기사는 PHP 프로젝트에서 php-mqtt/client 클라이언트 라이브러리를 사용하여 MQTT clientMQTT server 사이의 연결, 구독, 구독 취소, 메시지 수신 및 전송 기능을 구현하는 방법을 주로 소개합니다.

MQTT 클라이언트 라이브러리 선택



이 기사에서는 컴포저에서 가장 많이 다운로드되는 클라이언트 라이브러리php-mqtt/client를 선택합니다. 더 많은 PHP-MQTT 클라이언트 라이브러리는 Packagist-Search MQTT에서 확인하십시오.

php-mqtt/client에 대한 자세한 내용은 Packagist php-mqtt/client을 참조하십시오.

MQTT 통신은 HTTP 시스템 외부의 네트워크 통신 시나리오에 속합니다. PHP 특성의 한계로 인해 PHP 시스템에서 Swoole/Workerman과 같은 네트워크 통신을 위한 확장을 사용하면 더 나은 경험을 얻을 수 있습니다. 이 문서에서는 해당 사용을 반복하지 않습니다. 관련 MQTT 클라이언트 라이브러리는 다음과 같습니다.

  • workerman/mqtt :workerman 기반의 PHP용 비동기식 MQTT 클라이언트.

  • simps/mqtt : MQTT protocol PHP용 분석 및 코루틴 클라이언트.

  • 프로젝트 초기화



    PHP 버전 확인



    이 프로젝트는 개발 및 테스트를 위해 7.4.21을 사용합니다. 독자는 다음 명령으로 PHP 버전을 확인할 수 있습니다.

    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
    


    Composer를 사용하여 php-mqtt/client 설치



    Composer는 PHP 프로젝트에 필요한 모든 종속성을 관리할 수 있는 PHP용 종속성 관리 도구입니다.

    composer require php-mqtt/client
    


    PHP MQTT 사용법



    MQTT 서버에 연결



    이 기사에서는 EMQX의 Free Public MQTT Server에서 생성된 EMQX에서 제공하는 MQTT Cloud Service을 사용합니다. 서버 접속 정보는 다음과 같습니다.
  • 브로커: broker.emqx.io
  • TCP 포트: 1883
  • SSL/TLS 포트: 8883

  • Composer 자동 로드 파일 및 php-mqtt/client 가져오기




    require('vendor/autoload.php');
    
    use \PhpMqtt\Client\MqttClient;
    


    MQTT 브로커 연결 매개변수 설정



    MQTT Broker 연결 주소, 포트 및 주제를 설정합니다. 동시에 PHPrand 함수를 호출하여 임의로 MQTT 클라이언트 ID를 생성합니다.

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


    MQTT 연결 기능 작성



    위의 매개변수를 사용하여 연결하고 다음과 같이 ConnectionSettings를 통해 연결 매개변수를 설정합니다.

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


    구독하다


    emqx/test의 주제를 구독하도록 프로그램하고 수신된 메시지를 처리하기 위해 구독에 대한 콜백 함수를 구성합니다. 여기에서 구독에서 얻은 주제와 메시지를 인쇄합니다.

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


    게시



    페이로드를 구성하고 publish 함수를 호출하여 emqx/test 주제에 메시지를 게시합니다. 게시 후 클라이언트는 수신 메시지와 재전송 대기열을 처리하기 위해 폴링 상태를 입력해야 합니다.

    for ($i = 0; $i< 10; $i++) {
      $payload = array(
        'protocol' => 'tcp',
        'date' => date('Y-m-d H:i:s'),
        'url' => 'https://github.com/emqx/MQTT-Client-Examples'
      );
      $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);
    


    완전한 코드



    서버 연결, 메시지 게시 및 수신 코드.

    <?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' => 'https://github.com/emqx/MQTT-Client-Examples'
      );
      $mqtt->publish(
        // topic
        'emqx/test',
        // payload
        json_encode($payload),
        // qos
        0,
        // retain
        true
      );
      printf("msg $i send\n");
      sleep(1);
    }
    
    $mqtt->loop(true);
    
    


    테스트



    MQTT 메시지 게시 코드를 실행한 후 클라이언트가 성공적으로 연결되고 메시지가 하나씩 게시되고 성공적으로 수신되었음을 확인할 수 있습니다.

    php pubsub_tcp.php
    




    요약



    지금까지 php-mqtt/client를 사용하여 public MQTT server에 연결하고 테스트 클라이언트와 MQTT 서버 간의 연결, 메시지 게시 및 구독을 구현했습니다.

    좋은 웹페이지 즐겨찾기