使用PHP进行MQTT开发指南

MQTTをPHPで使う方法

英文博客:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-php

PHP是一种广泛使用的开源通用脚本语言,可以嵌入HTML,特别适用于Web开发。

在这篇文章中,主要介绍了在PHP项目中使用php-mqtt/client客户端库来实现MQTT客户端与MQTT代理之间的连接、订阅、取消订阅、接收和发送消息功能。

选择MQTT客户端库

在这篇文章中,我们选择了Composer中最受欢迎的php-mqtt/client库进行下载。如果想了解其他PHP-MQTT客户端库,请查看Packagist-Search MQTT。

请参阅Packagist php-mqtt/client,以获取有关php-mqtt/client的详细文档。

以下为相关的MQTT客户端库:

– Paho MQTT:一种流行的开源MQTT客户端库,提供多种不同编程语言的实现。
– Mosquitto:一个轻量级的MQTT代理和客户端库,可用于C和C++开发。
– Eclipse MQTT:由Eclipse基金会维护的一组用于Java、JavaScript和Python的MQTT客户端库。
– EMQX MQTT:一个高度可扩展的开源MQTT代理和客户端库,支持多种编程语言。
– HiveMQ MQTT:一个经过测试且易于使用的MQTT代理和客户端库,适用于Java和JavaScript。
– AWS IoT SDK:提供了用于使用AWS IoT服务的MQTT客户端库,适用于Java、Python、C++等多种语言。

workerman/mqtt:Workermanベースの非同期MQTTクライアント。

simps/mqtt:PHP用のMQTTプロトコル解析とコルーチンクライアント。

项目的初始化

确认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提供的免费公开MQTT代理。这是在EMQX的MQTT云服务上创建的。服务器访问信息如下:

    • ブローカー: broker.emqx.io

TCPポート: 1883

SSL/TLSポート: 8883

MQTTブローカー選択の実践的ガイド

选择MQTT代理的实践指南

请下载这份实用指南,并了解选择MQTT代理时需要考虑的因素。

获取电子书籍

导入Composer的自动加载文件和php-mqtt/client。

require('vendor/autoload.php');

use \PhpMqtt\Client\MqttClient;

设置MQTT Broker连接参数

请设置MQTT代理连接地址、端口和主题。同时,调用PHP中的rand函数,随机生成MQTT客户端ID。

$server   = 'broker.emqx.io';
$port     = 1883;
$clientId = rand(5, 15);
$username = 'emqx_user';
$password = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;

MQTT连接功能的描述

使用上述参数进行连接,并通过ConnectionSettings来设置连接参数。例如:

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

订阅 yuè)

创建一个程序来订阅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 = 'public';
$clean_session = false;
$mqtt_version = MqttClient::MQTT_3_1_1;

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


$mqtt = new MqttClient($server, $port, $clientId, $mqtt_version);

$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 テスト

总结

我过去使用php-mqtt/client在免费的公共MQTT代理服务器上进行连接,并成功实现了测试客户端与MQTT服务器之间的连接、消息发布和订阅功能。

接下来,您可以查看EMQ提供的MQTT协议入门指南系列文章,学习MQTT协议的功能,并探索MQTT的高级应用,从而顺利开始开发MQTT应用程序和服务。

广告
将在 10 秒后关闭
bannerAds