MQTT中文站
  • 首页
  • MQTT 学习
    • MQTT 入门
    • MQTT 进阶
    • MQTT 编程
    • MQTT 实例
    • MQTT 要点
    • MQTT5 要点
    • MQTT 工具
    • MQTT 客户端库
    • MQTT 服务器
    • Zigbee2MQTT
    • Sparkplug
    • Home Assistant
    • Node-RED
      • Node-RED 安装部署
      • Node-RED 用户指南
      • Node-RED 创建节点
      • Node-RED 示例教程
      • Node-RED 开发流程
      • Node-RED 接口参考
      • Node-RED 配置模板
      • Node-RED 常见问题
  • MQTT 规范
    • MQTT 5 规范
    • MQTT 3.1.1 规范
    • MQTT 3.1 规范
    • MQTT-SN v1.2规范
    • Sparkplug® v3.0.0规范
  • 产品中心
  • 解决方案
    • 环境监测
    • 工业制造
    • 智慧水利
    • 水利管网
    • 积水监测
    • 综合管廊
    • 档案库房
    • 交通物流
    • 智慧城市
    • 智慧农业
    • 智慧养殖
    • 能源电力
    • 石油石化
    • 智能家居
    • 物联网
    • 汽车与出行
  • 使用文档
  • MQTT 云平台
  • 登录
  • 注册

使用Mosquitto-PHP库进行MQTT通信的完整指南

2 年前 • MQTT 客户端库

https://github.com/mgdm/Mosquitto-PHP

Mosquitto-PHP是一个用于与MQTT(Message Queuing Telemetry Transport)协议交互的PHP扩展,它允许PHP应用程序通过MQTT与消息代理进行通信。以下是有关Mosquitto-PHP的一些关键信息:

1. Mosquitto-PHP扩展介绍:

  • Mosquitto-PHP是一个PHP扩展,它提供了与Eclipse Mosquitto MQTT客户端库的集成,使PHP开发者能够轻松地编写MQTT客户端应用程序。

2. PHP 7支持:

  • Mosquitto-PHP扩展已更新以支持PHP 7版本,这意味着它可以在PHP 7及更高版本上运行。这扩展的PHP 7支持得益于Sara Golemon的工作。

3. 扩展要求:

  • PHP版本要求:Mosquitto-PHP扩展要求PHP 5.3及更高版本。
  • libmosquitto版本要求:它需要使用libmosquitto库的1.2.x版本或更高版本。
  • 支持的操作系统:通常在Linux和Mac OS X上工作,但未明确支持Windows。不过,欢迎开发人员提交Windows支持的贡献。

4. 安装Mosquitto-PHP:

  • 您可以使用PECL来安装Mosquitto-PHP扩展。例如,使用以下命令来安装:
  pecl install Mosquitto-alpha

或者,您也可以使用传统的扩展构建过程来手动构建和安装它:

  phpize
  ./configure --with-mosquitto=/path/to/libmosquitto
  make
  make install

最后,将extension=mosquitto.so添加到您的php.ini文件中以启用扩展。

5. 使用Mosquitto-PHP:

  • Mosquitto-PHP允许您以异步方式与MQTT代理进行交互。您需要使用回调函数来处理连接、发布、订阅和消息接收等事件。
  • 例如,以下是如何正确发布QoS为2的消息的示例:
  use Mosquitto\Client;

  $mid = 0;
  $c = new Mosquitto\Client("PHP");
  $c->onConnect(function() use ($c, &$mid) {
      $mid = $c->publish("mgdm/test", "Hello", 2);
  });

  $c->onPublish(function($publishedId) use ($c, $mid) {
      if ($publishedId == $mid) {
          $c->disconnect();
      }
  });

  $c->connect("localhost");
  $c->loopForever();
  • 您可以根据具体的MQTT应用程序要求,使用Mosquitto-PHP来创建定制的MQTT客户端。

总之,Mosquitto-PHP扩展使PHP开发者能够轻松地与MQTT代理进行通信,这对于构建物联网(IoT)应用程序和其他需要实时消息传递的应用程序非常有用。您可以使用它来连接、发布、订阅和处理MQTT消息。

event.php

<?php

$c = new Mosquitto\Client();
$c->onConnect(function($code, $message) {
    echo "I'm connected\n";
});

$c->connect('localhost', 1883, 60);
$c->subscribe('#', 1);
$c->onMessage(function($m) {
    var_dump($m);
});

$socket = $c->getSocket();

$base = new EventBase();
$ev = new Event($base, $socket, Event::READ | Event::PERSIST, 'cb', $base);

function cb($fd, $what, $arg) {
    global $c;
    echo "Triggered\n";
    var_dump(func_get_args());
    $c->loop();
}

$ev->add();
$base->dispatch();

这段 PHP 代码演示了如何使用 Mosquitto-PHP 扩展与 MQTT 服务器进行通信,并使用 libevent 库创建一个事件驱动的应用程序。以下是对代码的详细解释:

  1. 创建 Mosquitto 客户端对象:
$c = new Mosquitto\Client();

在这里,您创建了一个 Mosquitto 客户端对象 $c。

  1. 设置连接回调函数:
$c->onConnect(function($code, $message) {
    echo "I'm connected\n";
});

这个回调函数会在成功连接到 MQTT 服务器时执行,它简单地打印出 "I'm connected"。

  1. 连接到 MQTT 服务器:
$c->connect('localhost', 1883, 60);

这行代码连接到 MQTT 服务器,指定了服务器的主机名为 'localhost',端口号为 1883,超时时间为 60 秒。

  1. 订阅 MQTT 主题:
$c->subscribe('#', 1);

这里使用 subscribe 方法订阅了 MQTT 主题 '#',表示订阅所有主题。第二个参数 1 表示使用 QoS 1 等级。

  1. 设置接收消息的回调函数:
$c->onMessage(function($m) {
    var_dump($m);
});

这个回调函数将在接收到 MQTT 消息时执行,它简单地使用 var_dump 打印消息内容。

  1. 获取 Mosquitto 客户端的套接字:
$socket = $c->getSocket();

这里通过 $c->getSocket() 获取 Mosquitto 客户端的套接字,以便后续在 libevent 中使用。

  1. 创建 libevent 基础对象和事件对象:
$base = new EventBase();
$ev = new Event($base, $socket, Event::READ | Event::PERSIST, 'cb', $base);

这里创建了 libevent 基础对象 $base 和事件对象 $ev。事件对象监听 Mosquitto 客户端套接字的可读事件,并在事件触发时调用 'cb' 函数。

  1. 定义事件触发后的回调函数:
function cb($fd, $what, $arg) {
    global $c;
    echo "Triggered\n";
    var_dump(func_get_args());
    $c->loop();
}

这是事件触发后执行的回调函数 'cb'。它会在事件触发时打印 "Triggered" 和一些调试信息,然后调用 Mosquitto 客户端的 loop 方法来处理 MQTT 消息。

  1. 将事件对象添加到 libevent 循环:
$ev->add();

这行代码将事件对象 $ev 添加到 libevent 的事件循环中,以便监听 Mosquitto 客户端套接字的可读事件。

  1. 启动 libevent 事件循环:
$base->dispatch();

最后,这行代码启动 libevent 的事件循环,使其开始监听事件并执行回调函数。这将允许 Mosquitto 客户端接收和处理 MQTT 消息。

总之,这段代码创建了一个 Mosquitto 客户端,连接到 MQTT 服务器,订阅所有主题,并使用 libevent 库实现了一个事件驱动的应用程序,该应用程序能够异步接收和处理 MQTT 消息。当 Mosquitto 客户端接收到消息时,会触发 libevent 事件,然后执行回调函数来处理消息。

pub.php

<?php

$client = new Mosquitto\Client();
$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');
$client->connect("localhost", 1883, 5);
$client->subscribe('/#', 1);

while (true) {
	$client->loop();
	$mid = $client->publish('/hello', "Hello from PHP at " . date('Y-m-d H:i:s'), 1, 0);
	echo "Sent message ID: {$mid}\n";
	$client->loop();

	sleep(2);
}

$client->disconnect();
unset($client);

function connect($r) {
	echo "I got code {$r}\n";
}

function subscribe() {
	echo "Subscribed to a topic\n";
}

function message($message) {
	printf("Got a message ID %d on topic %s with payload:\n%s\n\n", $message->mid, $message->topic, $message->payload);
}

function disconnect() {
	echo "Disconnected cleanly\n";
}

这段 PHP 代码演示了如何使用 Mosquitto-PHP 扩展与 MQTT 服务器进行通信以及订阅和发布 MQTT 消息。以下是代码的详细解释:

  1. 创建 Mosquitto 客户端对象:
$client = new Mosquitto\Client();

在这里,您创建了一个 Mosquitto 客户端对象 $client。

  1. 设置连接、订阅、消息和断开连接的回调函数:
$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');

这些回调函数分别用于处理连接成功时的事件('connect')、断开连接时的事件('disconnect')、订阅主题时的事件('subscribe')、接收到消息时的事件('message')。

  1. 连接到 MQTT 服务器:
$client->connect("localhost", 1883, 5);

这行代码连接到 MQTT 服务器,指定了服务器的主机名为 'localhost',端口号为 1883,超时时间为 5 秒。

  1. 订阅 MQTT 主题:
$client->subscribe('/#', 1);

这里使用 subscribe 方法订阅了 MQTT 主题 '/#',表示订阅所有以 '/' 开头的主题。第二个参数 1 表示使用 QoS 1 等级。

  1. 进入循环并发送消息:
while (true) {
    $client->loop();
    $mid = $client->publish('/hello', "Hello from PHP at " . date('Y-m-d H:i:s'), 1, 0);
    echo "Sent message ID: {$mid}\n";
    $client->loop();

    sleep(2);
}

这个 while 循环会持续运行,其中包含了 Mosquitto 客户端的 loop 方法,以便处理 MQTT 消息和事件。在循环中,它会使用 publish 方法发布一条带有时间戳的消息到主题 '/hello'。然后等待 2 秒继续下一轮循环。

  1. 断开连接和清理:
$client->disconnect();
unset($client);

最后,代码在循环结束后手动断开了与 MQTT 服务器的连接,并释放了 Mosquitto 客户端对象。

  1. 回调函数的定义:
function connect($r) {
    echo "I got code {$r}\n";
}

function subscribe() {
    echo "Subscribed to a topic\n";
}

function message($message) {
    printf("Got a message ID %d on topic %s with payload:\n%s\n\n", $message->mid, $message->topic, $message->payload);
}

function disconnect() {
    echo "Disconnected cleanly\n";
}

这些回调函数分别用于处理连接成功、订阅成功、接收到消息和断开连接的事件。在这些函数中,您可以自定义处理逻辑以响应不同事件。

总之,这段代码创建了一个 Mosquitto 客户端,连接到 MQTT 服务器,订阅主题,并周期性地发布消息。它还设置了回调函数来处理不同的事件,使您能够根据需要自定义处理逻辑。最后,代码手动断开了连接并清理资源。

subclass.php

<?php

class MyClient extends Mosquitto\Client {

	protected $pendingSubs = [];
	protected $grantedSubs = [];

	protected $subscribeCallback = null;

	public function __construct($id = null, $cleanSession = false) {
		parent::__construct($id, $cleanSession);
		parent::onSubscribe(array($this, 'subscribeHandler'));
	}

	public function subscribeHandler($mid, $qosCount, $grantedQos) {
		if (!isset($this->pendingSubs[$mid])) {
			return;
		}

		$topic = $this->pendingSubs[$mid];
		$this->grantedSubs[$topic] = $grantedQos;
		echo "Subscribed to topic {$topic} with message ID {$mid}\n";

		if (is_callable($this->subscribeCallback)) {
			$this->subscribeCallback($mid, $qosCount, $grantedQos);
		}
	}

	public function subscribe($topic, $qos) {
		$mid = parent::subscribe($topic, $qos);
		$this->pendingSubs[$mid] = $topic;
	}

	public function onSubscribe(callable $callable) {
		$this->subscribeCallback = $callable;
	}

	public function getSubscriptions() {
		return $this->grantedSubs;
	}
}

$c = new MyClient('subscriptionTest');
$c->onSubscribe(function() { echo "Hello, I got subscribed\n"; });
$c->connect('localhost', 1883, 50);
$c->subscribe('#', 1);

for ($i = 0; $i < 5; $i++) {
	$c->loop(10);
}

var_dump($c->getSubscriptions());

这段 PHP 代码演示了如何创建一个自定义的 Mosquitto 客户端类 MyClient,该类继承了 Mosquitto 客户端,并添加了一些自定义功能。以下是代码的详细解释:

  1. 创建自定义 Mosquitto 客户端类 MyClient:
class MyClient extends Mosquitto\Client {
    // ...
}

在这里,您创建了一个名为 MyClient 的类,它继承自 Mosquitto 客户端。

  1. 构造函数 __construct:
public function __construct($id = null, $cleanSession = false) {
    parent::__construct($id, $cleanSession);
    parent::onSubscribe(array($this, 'subscribeHandler'));
}

在构造函数中,您首先调用了父类(Mosquitto 客户端)的构造函数,并注册了 subscribeHandler 方法作为订阅事件的回调函数。

  1. 订阅处理函数 subscribeHandler:
public function subscribeHandler($mid, $qosCount, $grantedQos) {
    // ...
}

这个方法会在成功订阅主题时被调用。它会处理订阅事件的回调,并将订阅的主题和相应的 QoS 存储到 grantedSubs 数组中。然后,它会触发 subscribeCallback 回调函数(如果已设置)。

  1. 订阅主题方法 subscribe:
public function subscribe($topic, $qos) {
    $mid = parent::subscribe($topic, $qos);
    $this->pendingSubs[$mid] = $topic;
}

这个方法用于订阅主题,并将主题和消息 ID 存储到 pendingSubs 数组中。

  1. 设置订阅回调方法 onSubscribe:
public function onSubscribe(callable $callable) {
    $this->subscribeCallback = $callable;
}

这个方法允许您设置订阅事件的回调函数,以便在订阅时执行自定义逻辑。

  1. 获取订阅信息方法 getSubscriptions:
public function getSubscriptions() {
    return $this->grantedSubs;
}

这个方法用于获取已订阅的主题及其对应的 QoS。

  1. 创建 MyClient 对象,设置回调和执行订阅:
$c = new MyClient('subscriptionTest');
$c->onSubscribe(function() { echo "Hello, I got subscribed\n"; });
$c->connect('localhost', 1883, 50);
$c->subscribe('#', 1);

在这里,您创建了一个 MyClient 对象,并设置了订阅回调函数。然后,连接到 MQTT 服务器,订阅了以 '#' 开头的所有主题。

  1. 使用 loop 方法运行客户端循环:
for ($i = 0; $i < 5; $i++) {
    $c->loop(10);
}

这个循环允许客户端运行,并处理 MQTT 消息和事件。loop(10) 意味着每次循环会等待 10 毫秒来处理事件。

  1. 获取订阅信息并输出:
var_dump($c->getSubscriptions());

最后,您使用 getSubscriptions 方法获取已订阅的主题信息,并将其输出。

总之,这段代码演示了如何创建自定义的 Mosquitto 客户端类,以处理 MQTT 订阅事件,并提供了一些自定义功能,例如获取已订阅的主题信息和设置订阅回调函数。这使您能够更灵活地与 MQTT 服务器进行通信和处理订阅。

test.php

<?php

$client = new Mosquitto\Client();
$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');
$client->connect("localhost", 1883, 5);
$client->onLog('logger');
$client->subscribe('#', 1);

for ($i = 0; $i < 10; $i++) {
    $client->loop();
}

$client->unsubscribe('#');

for ($i = 0; $i < 10; $i++) {
    $client->loop();
}

function connect($r, $message) {
	echo "I got code {$r} and message {$message}\n";
}

function subscribe() {
	echo "Subscribed to a topic\n";
}

function unsubscribe() {
	echo "Unsubscribed from a topic\n";
}

function message($message) {
	printf("Got a message on topic %s with payload:\n%s\n", $message->topic, $message->payload);
}

function disconnect() {
	echo "Disconnected cleanly\n";
}

function logger() {
	var_dump(func_get_args());
}

这段 PHP 代码演示了如何使用 Mosquitto 客户端库与 MQTT 代理(通常在 localhost 上运行)进行通信,并定义了一些回调函数来处理不同的 MQTT 事件。以下是这段代码的详细解释:

1. 创建 Mosquitto 客户端对象:

$client = new Mosquitto\Client();

这行代码创建了一个 Mosquitto 客户端对象,用于连接到 MQTT 代理并执行 MQTT 操作。

2. 设置回调函数:

$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');
$client->onLog('logger');

这些行设置了不同事件的回调函数。当客户端连接成功时,onConnect 回调函数将被调用,当客户端断开连接时,onDisconnect 回调函数将被调用,以此类推。这些回调函数会在后面的代码中定义。

3. 连接到 MQTT 代理:

$client->connect("localhost", 1883, 5);

这行代码连接到本地 MQTT 代理,通常运行在 localhost 主机的 1883 端口上。连接的超时时间设置为 5 秒。

4. 订阅 MQTT 主题:

$client->subscribe('#', 1);

这行代码订阅了名为 # 的 MQTT 主题,这个特殊的主题表示订阅所有主题。订阅的 QoS(服务质量)级别设置为 1。

5. 运行 MQTT 客户端循环:

for ($i = 0; $i < 10; $i++) {
    $client->loop();
}

这个循环运行 MQTT 客户端,允许它接收和处理来自 MQTT 代理的消息以及触发不同事件的回调函数。

6. 取消订阅 MQTT 主题:

$client->unsubscribe('#');

这行代码取消订阅之前订阅的 # 主题,即停止接收与该主题相关的消息。

7. 再次运行 MQTT 客户端循环:

for ($i = 0; $i < 10; $i++) {
    $client->loop();
}

这段代码再次运行 MQTT 客户端循环,确保处理所有取消订阅后的事件。

8. 定义各种事件回调函数:

下面是定义的不同事件的回调函数:

  • connect($r, $message):当客户端成功连接到 MQTT 代理时,此回调被调用,显示连接结果代码 $r 和消息 $message。
  • subscribe():当客户端成功订阅主题时,此回调被调用,显示 "Subscribed to a topic"。
  • unsubscribe():当客户端成功取消订阅主题时,此回调被调用,显示 "Unsubscribed from a topic"。
  • message($message):当客户端接收到新消息时,此回调被调用,显示消息的主题和有效载荷。
  • disconnect():当客户端与 MQTT 代理断开连接时,此回调被调用,显示 "Disconnected cleanly"。
  • logger():此回调用于记录日志信息,它将输出回调函数的所有参数。

总之,这段代码创建了一个 MQTT 客户端并设置了回调函数,然后连接到 MQTT 代理,订阅主题,运行客户端循环以接收消息和处理事件,并在不同的事件发生时触发相应的回调函数,从而实现了 MQTT 通信。这对于与 MQTT 代理进行互动和处理消息非常有用。

testOnpublish.php

<?php
class MQ {
    public static $publish = array();
    public static $receive = array();
    public static function addPublish($mid, $msg) {
        $msg->id = $mid;
        self::$publish[$mid] = $msg;
    }

    public static function confirm($mid) {
        if(array_key_exists($mid, self::$publish)) {
            self::$publish[$mid]->state = true;
        }
    }

    public static function addReceive($msg) {
        $msg = Message::factory($msg, true);
        self::$receive[$msg->id] = $msg;
    }
}

class Message {
    public $id;
    public $state = false;
    public $msg;
    public static function factory(Mosquitto\Message $msg, $state = false) {
        $message = new Message();
        $message->state = $state;
        $message->msg = $msg;
        $message->id = $msg->mid;
        return $message;
    }
}
$client = new Mosquitto\Client('client.terminal.onpublish', false);

$client->onMessage(function($msg) {
    print_r(array('receive', $msg));
    MQ::addReceive($msg);
});

$client->onPublish(function($mid) {
    MQ::confirm($mid);
    print_r(array('comfirm publish', MQ::$publish[$mid]));
});
$client->onConnect(function($rc, $msg) {
    print_r(array('rc' => $rc, 'message' => $msg));
});

$client->connect('localhost', 1883, 60);

sleep(1);


$client->subscribe('/test/publish', 1);
$msg = Message::factory(new Mosquitto\Message());
$msg->msg->topic = '/test/publish';
$msg->msg->payload = 'hello from on publish';
$msg->msg->qos = 1;
$mid = $client->publish($msg->msg->topic, $msg->msg->payload, $msg->msg->qos);
print_r(array('publish', $msg));
MQ::addPublish($mid, $msg);

sleep(1);

$client->loopForever();

这段PHP代码演示了如何使用Mosquitto客户端库创建一个MQTT客户端,该客户端具有自定义的消息确认和处理机制。以下是代码的详细解释:

1. 创建MQ类:

class MQ {
    public static $publish = array();
    public static $receive = array();

    public static function addPublish($mid, $msg) {
        $msg->id = $mid;
        self::$publish[$mid] = $msg;
    }

    public static function confirm($mid) {
        if(array_key_exists($mid, self::$publish)) {
            self::$publish[$mid]->state = true;
        }
    }

    public static function addReceive($msg) {
        $msg = Message::factory($msg, true);
        self::$receive[$msg->id] = $msg;
    }
}

这个类用于管理发布和接收的消息。它包括以下方法:

  • addPublish($mid, $msg):将发布的消息添加到 $publish 数组中,以便稍后进行确认。
  • confirm($mid):确认已发布的消息,将其状态标记为已确认。
  • addReceive($msg):将接收的消息添加到 $receive 数组中。

2. 创建消息类Message:

class Message {
    public $id;
    public $state = false;
    public $msg;

    public static function factory(Mosquitto\Message $msg, $state = false) {
        $message = new Message();
        $message->state = $state;
        $message->msg = $msg;
        $message->id = $msg->mid;
        return $message;
    }
}

这个类表示MQTT消息。它包括以下属性:

  • $id:消息ID。
  • $state:消息状态,用于确认是否已接收。
  • $msg:实际的Mosquitto消息对象。

还包括一个工厂方法factory,用于从Mosquitto消息创建Message对象。

3. 创建Mosquitto客户端对象:

$client = new Mosquitto\Client('client.terminal.onpublish', false);

这行代码创建了一个Mosquitto客户端对象,并为其指定了客户端ID和cleanSession标志。

4. 设置回调函数:

$client->onMessage(function($msg) {
    print_r(array('receive', $msg));
    MQ::addReceive($msg);
});

$client->onPublish(function($mid) {
    MQ::confirm($mid);
    print_r(array('comfirm publish', MQ::$publish[$mid]));
});

$client->onConnect(function($rc, $msg) {
    print_r(array('rc' => $rc, 'message' => $msg));
});

这些回调函数用于处理不同的MQTT事件:

  • onMessage:处理接收到的消息,将消息添加到MQ::$receive数组中。
  • onPublish:处理已发布的消息的确认,将消息标记为已确认。
  • onConnect:处理连接事件,打印连接结果。

5. 连接到MQTT代理:

$client->connect('localhost', 1883, 60);

这行代码连接到本地MQTT代理,通常运行在localhost上的1883端口上。连接的超时时间设置为60秒。

6. 发布消息和处理:

sleep(1);

$client->subscribe('/test/publish', 1);
$msg = Message::factory(new Mosquitto\Message());
$msg->msg->topic = '/test/publish';
$msg->msg->payload = 'hello from on publish';
$msg->msg->qos = 1;
$mid = $client->publish($msg->msg->topic, $msg->msg->payload, $msg->msg->qos);
print_r(array('publish', $msg));
MQ::addPublish($mid, $msg);

sleep(1);

$client->loopForever();

这段代码的主要功能是:

  • 订阅主题/test/publish。
  • 创建一个要发布的消息对象$msg。
  • 发布消息,并将消息添加到MQ::$publish数组中以进行后续确认。
  • 使用loopForever方法持续运行MQTT客户端以处理消息和事件。

总之,这段代码创建了一个具有自定义消息确认和处理机制的MQTT客户端,它可以发布和接收消息,并在处理时跟踪消息的状态。这对于实现更高级的MQTT消息管理非常有用。

testwill.php

<?php

$client = new Mosquitto\Client();
$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');
$client->setWill('/hello', "Client died :-(", 1, 0);
$client->connect("localhost", 1883, 5);
$client->subscribe('/#', 1);

$client->loopForever();

function connect($r) {
	echo "I got code {$r}\n";
}

function subscribe() {
	echo "Subscribed to a topic\n";
}

function message($message) {
	printf("Got a message on topic %s with payload:\n%s\n", $message->topic, $message->payload);
}

function disconnect() {
	echo "Disconnected cleanly\n";
}

这段PHP代码演示了如何创建一个Mosquitto MQTT客户端,该客户端具有以下功能:

1. 创建Mosquitto客户端对象:

$client = new Mosquitto\Client();

这行代码创建了一个Mosquitto客户端对象。

2. 设置连接和事件回调:

$client->onConnect('connect');
$client->onDisconnect('disconnect');
$client->onSubscribe('subscribe');
$client->onMessage('message');

这些行代码设置了不同MQTT事件的回调函数,当客户端连接、断开连接、订阅主题或接收消息时,将调用相应的回调函数。

3. 设置遗嘱消息(Will Message):

$client->setWill('/hello', "Client died :-(", 1, 0);

这行代码设置了遗嘱消息,当客户端意外断开连接时,将自动发布遗嘱消息到主题/hello,消息内容是"Client died :-(",QoS级别为1,保留标志为0。

4. 连接到MQTT代理:

$client->connect("localhost", 1883, 5);

这行代码连接到MQTT代理,该代理通常运行在本地主机(localhost)的1883端口上。连接超时设置为5秒。

5. 订阅主题:

$client->subscribe('/#', 1);

这行代码订阅了以/#开头的所有主题,并将QoS级别设置为1。

6. 使用loopForever方法持续运行客户端:

$client->loopForever();

这行代码使客户端进入无限循环,以便处理MQTT消息和事件。客户端将保持连接状态,并在收到消息时调用相应的消息回调函数。

7. 定义连接、订阅、消息和断开连接的回调函数:

这些回调函数用于处理不同的MQTT事件:

  • connect($r):处理连接事件,其中$r参数包含连接的返回码。
  • subscribe():处理订阅事件,表示成功订阅主题。
  • message($message):处理接收到的消息,打印主题和消息内容。
  • disconnect():处理断开连接事件,表示客户端已经断开连接。

总之,这段代码创建了一个Mosquitto MQTT客户端,连接到MQTT代理,订阅了一组主题,并设置了各种事件的回调函数。它还配置了遗嘱消息,以便在客户端意外断开连接时发送通知。最后,客户端使用loopForever方法持续运行,以便处理MQTT消息和事件。

打赏赞微海报分享
mosquitto mqtt php 回调函数 通信

快速入门MQTTnet:在.NET 7中实现MQTT消息传输

MQTT的优缺点总结

猜你喜欢

改善基础设施:HiveMQ如何推动智能城市发展

改善基础设施:HiveMQ如何推动智能城市发展

08/07
2024
为什么企业选择全托管HiveMQ云进行MQTT部署

为什么企业选择全托管HiveMQ云进行MQTT部署

07/01
2024
MQTT 赋能工业 PLC 数据采集与应用

MQTT 赋能工业 PLC 数据采集与应用

06/30
2024
  • 解决方案
    • 智能家居
    • 汽车与出行
    • 工业制造
    • 能源电力
    • 石油石化
    • 交通物流
    • 零售
  • 学习
    • MQTT 规范
    • MQTT 教程
    • MQTT 软件
    • MQTT 客户端库
    • MQTT 服务器
    • 工具和应用程序
  • 关于我们
    • 了解创科慧仁
    • 加入创科慧仁
    • 投资者关系
    • 新闻动态
    • 合作伙伴
    • 联系我们
  • 友情链接
    • Modbus中文网
    • 跳动符号官网
    • 物联网世界
    • RFID世界网
    • 深圳物联网协会
    • isoftstone软通动力
    • 中国发展战略学研究会
    • B.P商业伙伴
  • 在线客服
  • 全国客户服务热线
    4006909885
  • 官方公众号
  • 联系邮箱
    contact@mqtt.cn
Copyright © 2025 MQTT中文站. All rights reserved.Designed by nicetheme. 京ICP备20029519号
在线客服

微信咨询

微信咨询

4006909885

服务热线 7*24小时

电话咨询
  • 首页
  • MQTT 学习
    • MQTT 入门
    • MQTT 进阶
    • MQTT 编程
    • MQTT 实例
    • MQTT 要点
    • MQTT5 要点
    • MQTT 工具
    • MQTT 客户端库
    • MQTT 服务器
    • Zigbee2MQTT
    • Sparkplug
    • Home Assistant
    • Node-RED
  • MQTT 规范
    • MQTT 5 规范
    • MQTT 3.1.1 规范
    • MQTT 3.1 规范
    • MQTT-SN v1.2规范
    • Sparkplug® v3.0.0规范
  • 产品中心
  • 解决方案
    • 环境监测
    • 工业制造
    • 智慧水利
    • 水利管网
    • 积水监测
    • 综合管廊
    • 档案库房
    • 交通物流
    • 智慧城市
    • 智慧农业
    • 智慧养殖
    • 能源电力
    • 石油石化
    • 智能家居
    • 物联网
    • 汽车与出行
  • 使用文档
  • MQTT 云平台
  • 登录
  • 注册
string(5) "2.0.0"