使用php代码实现发布订阅。
演示服务环境:Ubuntu18,php7.4,Mosquitto(mosquitto is an MQTT v3.1.1/v3.1 broker)

需要安装mosquitto 的php扩展

实现发布、订阅,以下是很简单的代码。

1. 订阅者

subscriber.php

  1. <?php
  2. //Mosquitto客户端类
  3. $client = new Mosquitto\Client();
  4. //连接broker
  5. $client->connect('10.10.20.200', 1883, 5);
  6. //订阅的topic为chan,服务质量为2
  7. $client->subscribe('chan', 2);
  8. //打印订阅消息
  9. $client->onMessage(function($message) {
  10. var_dump($message);
  11. //var_dump(json_decode($message->payload));
  12. });
  13. $client->loopForever();

注意:服务质量为2时,且发布者的消息为持久的,每次订阅者连接broker时,都会收到。

2. 发布者

publisher.php

  1. <?php
  2. //Mosquitto客户端类
  3. $client = new Mosquitto\Client();
  4. //连接broker
  5. $client->connect('10.10.20.200', 1883, 5);
  6. $payload = [
  7. 'status' => 'offline',
  8. 'device_sn' => 'AB9CDDBDB62D',
  9. ];
  10. /**
  11. * publish($topic, $payload[, $qos = 0, $retain = false])
  12. * $topic (string) – 要发表的主题
  13. * $payload (string) – 消息体
  14. * $qos (int) – 服务质量,值0,``1或2
  15. * $retain (boolean) – 是否保留此消息,默认为false
  16. */
  17. //发布消息(注意:消息为持久的,每次订阅者连接broker时,都会收到)
  18. $client->publish('chan', json_encode($payload), 2, false);
  19. $client->loopForever();
  1. 执行 php subscriber.php ,php客户端窗口处于等待状态;
  2. 重新打开一新窗口,然后执行 php publisher.php

订阅者窗口开始有数据出来,说明订阅成功,打印消息如下:

  1. object(Mosquitto\Message)#3 (5) {
  2. ["mid"]=>
  3. int(2)
  4. ["topic"]=>
  5. string(4) "chan"
  6. ["payload"]=>
  7. string(47) "{"status":"offline","device_sn":"AB9CDDBDB62D"}"
  8. ["qos"]=>
  9. int(2)
  10. ["retain"]=>
  11. bool(false)
  12. }