PHP

本文主要介绍如何在 PHP 项目中使用 php-mqtt/client 客户端库 ,实现 SX-IOT设备与 MQTT 服务器的连接、订阅、收发消息等功能。

前提条件

安装依赖包

1sudo apt install php composer -y

连接使用

连接设置

本文将使用自定义的接入认证方式,服务器接入信息如下:

  • Broker: mqtt.geek-smart.cn

  • TCP Port: 1883

  • WebSocket Port: 8083

导入依赖包

1require('vendor/autoload.php');
2
3use \PhpMqtt\Client\MqttClient;
4use \PhpMqtt\Client\ConnectionSettings;

定义连接地址、认证信息以及消息发布主题

设置 MQTT Broker 连接地址,端口以及 topic。

1 $server   = "mqtt.geek-smart.cn";
2 $port     = 1883;
3 $clientId = "php-client";
4 $username = '************';
5 $password = '************';
6 $clean_session = false;
7 $pub_topic = '/HYUGHV/lVtAcHuor***/4cebd60bf***/publish';
8 $sub_topic = '/HYUGHV/lVtAcHuor***/4cebd60bf***/subscribe';
9 $mqtt_version = MqttClient::MQTT_3_1_1;

定义消息发布函数

 1 $payload = array(
 2   'type' => 'info'
 3 );
 4
 5 $jsonp = json_encode($payload);
 6
 7 $mqtt->publish(
 8   // topic
 9   $pub_topic,
10   // payload
11   $jsonp,
12   // qos
13   0,
14   // retain
15   true
16 );

定义 on_message 回调函数,用于打印订阅主题接收的消息内容

1 $mqtt->subscribe($sub_topic, function ($topic, $message) {
2     printf("Received message on topic [%s]: %s\n", $topic, $message);
3 }, 0);

连接 MQTT

1 $mqtt = new MqttClient($server, $port, $clientId, $mqtt_version);
2
3 $mqtt->connect($connectionSettings, $clean_session);

完整代码

 1 <?php
 2
 3 require('vendor/autoload.php');
 4
 5 use \PhpMqtt\Client\MqttClient;
 6 use \PhpMqtt\Client\ConnectionSettings;
 7
 8 $server   = "mqtt.geek-smart.cn";
 9 $port     = 1883;
10 $clientId = "php-client";
11 $username = '************';
12 $password = '************';
13 $clean_session = false;
14 $pub_topic = '/HYUGHV/lVtAcHuor***/4cebd60bf***/publish';
15 $sub_topic = '/HYUGHV/lVtAcHuor***/4cebd60bf***/subscribe';
16 $mqtt_version = MqttClient::MQTT_3_1_1;
17
18 $connectionSettings  = (new ConnectionSettings)
19   ->setUsername($username)
20   ->setPassword($password)
21   ->setKeepAliveInterval(60);
22   // Last Will
23   //->setLastWillTopic('last-will/topic')
24   //->setLastWillMessage('client disconnect')
25   //->setLastWillQualityOfService(1);
26
27
28 $mqtt = new MqttClient($server, $port, $clientId, $mqtt_version);
29
30 $mqtt->connect($connectionSettings, $clean_session);
31 printf("client connected\n");
32
33 $payload = array(
34   'type' => 'info'
35 );
36
37 $jsonp = json_encode($payload);
38
39 $mqtt->publish(
40   // topic
41   $pub_topic,
42   // payload
43   $jsonp,
44   // qos
45   0,
46   // retain
47   true
48 );
49 printf("msg send $jsonp to $pub_topic\n");
50
51 $mqtt->subscribe($sub_topic, function ($topic, $message) {
52     printf("Received message on topic [%s]: %s\n", $topic, $message);
53 }, 0);
54
55 $mqtt->loop(true);

测试验证

运行

1php pubsub_tcp.php