Skip to main content

MQTT

MQTT简介

MQTT(Message Queuing Telemetry Transport)是一种轻量级、开放标准的通信协议,设计用于在低带宽、高延迟或不稳定网络环境中实现设备之间的即时通信。MQTT最初由IBM开发,现在由OASIS(Organization for the Advancement of Structured Information Standards)维护。

以下是MQTT协议的一些关键特点和组成部分:

  1. 发布/订阅模型:

MQTT采用发布/订阅模型,允许客户端(设备)通过“主题(topic)”进行通信。发布者(publisher)将消息发布到特定主题,而订阅者(subscriber)则通过订阅特定主题来接收相关消息。这种模型使得设备之间的通信更为灵活。

  1. 主题(Topic):

主题是MQTT中消息的分类标识。发布者发布消息到特定主题,而订阅者通过订阅相应主题来接收相关消息。主题的命名可以是层次化的,例如:“home/living-room/lights”。

  1. QoS级别(Quality of Service Levels):

MQTT支持三个不同的消息传递质量级别:

  • QoS 0: 最多一次,消息发出后不进行确认,消息可能会丢失。
  • QoS 1: 至少一次,确保消息至少被传递一次,但可能重复。
  • QoS 2: 只有一次,确保消息仅被传递一次,通过多个步骤的握手协议来实现。
  1. 保留(Retained)消息:

发布者可以标记一条消息为“保留”,这意味着最新的保留消息将被存储在代理服务器上,并且新订阅者在订阅相应主题时会立即收到这条消息。

  1. 会话(Session)和持久性:

MQTT客户端可以选择保持会话,以确保在断开连接后可以接收到离线消息。持久性订阅允许客户端在重新连接后接收到它们订阅的主题上的未读消息。

  1. 遗嘱消息(Last Will and Testament):

客户端可以指定一个“遗嘱消息”,以便在其意外断开连接时,代理服务器可以发布这条消息到预定义的主题。

  1. 连接和认证:

MQTT使用TCP协议进行连接,也可以通过TLS/SSL进行加密。客户端在连接时可以提供用户名和密码进行认证。

  1. 轻量级:

MQTT协议设计为轻量级,适用于各种设备,包括传感器、嵌入式系统和移动设备。

MQTT广泛用于物联网(IoT)应用,其中大量设备需要进行实时通信,而且网络条件可能有所不同。其灵活性、轻量级和可靠性使其成为许多物联网解决方案的首选通信协议。

MQTT与WebSocket

WebSocket(WS)和MQTT(Message Queuing Telemetry Transport)是两种不同的协议,但它们通常一起使用以支持实时的双向通信。下面是它们之间的关系:

  1. WebSocket:

WebSocket是一种在单个TCP连接上提供全双工通信的协议,允许在客户端和服务器之间进行实时双向通信。它提供了更低的延迟和更少的开销,相比于一些传统的HTTP轮询技术,WebSocket更适合实时性要求较高的应用。WebSocket连接始终是打开的,允许服务器主动向客户端推送数据。

  1. MQTT:

MQTT是一种消息协议,通常用于设备之间的实时通信。它采用发布/订阅模型,使设备能够通过主题(topics)进行消息发布和订阅。MQTT适用于在不同设备之间传输轻量级的消息,例如在物联网(IoT)场景中,设备和服务器之间的通信。

  1. 关系:

WebSocket和MQTT通常结合使用,以利用WebSocket提供的实时通信特性来支持MQTT协议的消息传递。通过将MQTT协议嵌套在WebSocket连接中,可以在单个WebSocket连接上同时实现MQTT的发布/订阅模型和WebSocket的全双工通信。这种组合的优势在于,WebSocket提供了低延迟的双向通信,而MQTT提供了灵活的消息发布/订阅机制。

  1. MQTT over WebSocket:

为了在WebSocket上实现MQTT,通常会使用“MQTT over WebSocket”协议。这意味着MQTT消息被包装在WebSocket帧中传输,使得可以在WebSocket连接上使用MQTT。

总体而言,WebSocket和MQTT是两种不同的协议,但它们可以结合使用以满足不同应用场景中的通信需求。WebSocket提供了实时双向通信的能力,而MQTT提供了灵活的消息传递机制,通过结合使用它们,可以构建出适用于物联网等领域的高效通信系统。

MQTT与socket

MQTT(Message Queuing Telemetry Transport)和Socket都是用于实现通信的协议或技术,但它们有一些区别。下面是它们之间的一些关系和区别:

  1. MQTT是一种协议,Socket是一种通信技术:

MQTT是一种消息协议,用于在设备之间传递消息,通常在物联网(IoT)和实时通信的场景中使用。Socket是一种通信机制,提供了在计算机之间进行数据传输的底层接口。

  1. 抽象层次不同:

MQTT在协议层次上工作,提供了一种发布/订阅模型,通过主题(topics)进行消息的发布和订阅。Socket则更低层次,提供了一种基本的数据传输机制,允许在应用层之间建立连接并交换数据。

  1. MQTT可以运行在Socket之上:

MQTT协议可以使用底层的Socket技术来实现,通常在TCP/IP协议栈上运行。这意味着MQTT消息可以通过底层的Socket连接进行传输。

  1. MQTT over WebSocket:

为了在Web浏览器中实现MQTT通信,通常会使用WebSocket作为底层通信技术,通过将MQTT消息封装在WebSocket帧中传输,实现了MQTT over WebSocket。

  1. Socket是一般性的通信工具,而MQTT更专注于消息传递:

Socket可以用于各种通信需求,包括实时通信、文件传输等。它是一个通用的、低级别的接口。MQTT专注于提供一种灵活、轻量级的消息传递机制,特别适用于设备之间的通信,具有发布/订阅的模型。

在许多情况下,MQTT可以使用Socket作为其底层传输机制,而且MQTT通常使用TCP Socket。此外,MQTT over WebSocket也是一种常见的实践,特别是在Web浏览器中实现实时通信时。

总体而言,Socket是一种通用的通信技术,而MQTT是一种专门设计用于实现轻量级、灵活的消息传递的协议。在某些场景下,它们可以结合使用,利用Socket提供的基础通信能力来支持MQTT协议的高层消息传递。

Mosquitto

Mosquitto 是一个开源的 MQTT(Message Queuing Telemetry Transport)代理实现,它提供了一个轻量级的消息传递协议,专为低带宽、高延迟或不稳定网络环境设计。以下是关于 Mosquitto 的详细介绍:

  1. MQTT 协议支持:

Mosquitto 是一个 MQTT 3.1 和 3.1.1 协议的完整实现,支持 MQTT 协议的发布/订阅模型,以及QoS级别(Quality of Service Levels)0、1和2。

  1. 跨平台支持:

Mosquitto 是一个跨平台的 MQTT 代理,可以在多种操作系统上运行,包括Linux、Windows、macOS等。

  1. 服务端和客户端实现:

Mosquitto 提供了 MQTT 代理服务器的实现,用于处理连接、消息传递、订阅等。同时,它还提供了用于开发 MQTT 客户端的库和工具。

  1. 持久性支持:

Mosquitto 支持持久性会话,允许客户端在断开连接后重新连接时接收到未读的消息。这对于确保设备在重新连接后能够获取到之前错过的消息很重要。

  1. 安全性:

Mosquitto 提供了基本的身份验证机制,支持用户名和密码的认证。此外,它还支持使用TLS/SSL加密通信,以确保通信的安全性。

  1. ACL(Access Control List):

Mosquitto 具有 ACL 支持,可以定义访问控制列表以控制哪些客户端有权发布和订阅哪些主题。

  1. WebSocket 支持:

Mosquitto 支持 WebSocket,这使得可以通过 WebSocket 连接访问 MQTT 代理,方便在 Web 应用程序中使用 MQTT。

  1. Bridge 功能:

Mosquitto 具有桥接(Bridge)功能,允许连接到其他 MQTT 代理,实现 MQTT 代理之间的消息传递。

  1. 日志记录:

Mosquitto 提供了详细的日志记录,方便进行故障排除和监控。

  1. 灵活的配置:

Mosquitto 的配置文件允许用户根据具体需求进行配置,包括监听端口、持久性设置、日志级别等。

  1. 社区支持:

Mosquitto 是一个开源项目,有一个活跃的社区,用户可以获取支持、提出问题,并参与到项目的开发中。

Mosquitto 提供了一个可靠、高效的 MQTT 实现,适用于各种场景,特别是在物联网(IoT)应用中,它成为一个常用的 MQTT 代理选择。如果你需要搭建自己的 MQTT 服务器或者在项目中使用 MQTT,Mosquitto 是一个值得考虑的选择。

PHP连接 Mosquitto 代理服务器

在PHP中,你可以使用 PHP MQTT 客户端库,例如 phpMQTT,来连接 Mosquitto 代理服务器。以下是一个简单的例子,演示如何使用 phpMQTT 库连接 Mosquitto 并发布消息:

  1. 安装 phpMQTT 库:

你可以使用 Composer 进行安装。在命令行中执行以下命令:

composer require bluerhinos/phpmqtt
  1. 使用 phpMQTT 连接 Mosquitto 并发布消息:
<?php
require("vendor/autoload.php"); // 载入 phpMQTT 库

$mqttServer = "your-mosquitto-server";
$mqttPort = 1883;
$mqttTopic = "your-topic";
$mqttMessage = "Hello from PHP!";

$mqttClient = new Bluerhinos\phpMQTT($mqttServer, $mqttPort, "PHPMQTT_Client");

if ($mqttClient->connect()) {
$mqttClient->publish($mqttTopic, $mqttMessage, 0);
$mqttClient->close();
echo "Message published successfully!";
} else {
echo "Error connecting to Mosquitto server!";
}

?>

请替换 $mqttServer$mqttPort$mqttTopic$mqttMessage 为你 Mosquitto 服务器的实际信息和你想要发布的主题和消息。

  1. 注意事项:

请确保 Mosquitto 服务器在指定的地址和端口上运行,并且可以通过 PHP 访问。你需要在服务器上安装并启动 Mosquitto 服务。如果你的 Mosquitto 服务器启用了用户名和密码认证,你需要在 phpMQTT 连接中提供用户名和密码。

这只是一个简单的示例,实际应用中可能需要更多的错误处理和安全性措施。此外,你还可以使用其他 MQTT 客户端库,具体取决于你的项目需求。

安装mosquitto


# 查看cmake版本
cmake --version

# 如果cmake低于3.1版本需要升级

# 卸载旧版本cmake
yum remove cmake

# 安装依赖
yum install -y gcc gcc-c++ make

# 下载源码安装包
wget https://github.com/Kitware/CMake/releases/download/v3.21.0/cmake-3.21.0.tar.gz

# 解压安装包
tar -zxvf cmake-3.21.0.tar.gz

# 进入目录
cd cmake-3.21.0

# 配置和编译
./bootstrap
make
make install

# 创建软连接
ln -s /usr/local/bin/cmake /usr/bin/cmake

# 安装依赖
yum install -y gcc-c++ openssl-devel libuuid-devel

# 下载安装包
wget https://mosquitto.org/files/source/mosquitto-2.0.18.tar.gz

# 解压代码
tar -zxvf mosquitto-2.0.18.tar.gz

# 进入目录
cd mosquitto-2.0.18

# 编译安装
cmake .
make
make install

# 创建 Mosquitto 用户和组
useradd -r -m -d /var/lib/mosquitto -s /sbin/nologin mosquitto
chown -R mosquitto: /var/lib/mosquitto

# 创建配置文件
mkdir /etc/mosquitto/
cp mosquitto.conf /etc/mosquitto/

# 编辑配置
listener 1883
password_file /etc/mosquitto/passwd

# 创建密码文件
mosquitto_passwd -c /etc/mosquitto/passwd xycouture
mosquitto_passwd

# 密码文件权限
chmod o+r /etc/mosquitto/passwd

# 设置自启动
vim /etc/systemd/system/mosquitto.service

# 写入配置
[Unit]
Description=Mosquitto MQTT Broker
Documentation=man:mosquitto(8) https://mosquitto.org/

[Service]
ExecStart=/usr/local/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Restart=always
User=mosquitto
Type=simple

[Install]
WantedBy=multi-user.target

# 启动
systemctl start mosquitto

# 开机自启动
systemctl enable mosquitto

# 创建软连接
ln -s /usr/local/lib64/libmosquitto.so.1 /usr/lib64/libmosquitto.so.1

# 命令行测试
mosquitto_sub -h localhost -t hotel/common/11 -u xycouture -P 821177cb
mosquitto_pub -h localhost -t hotel/common/11 -m "aaa" -u xycouture -P 821177cb

命令行测试

mosquitto_sub -h localhost -t test -u admin -P admin
mosquitto_pub -h localhost -t test -m "aaa" -u admin -P admin

phpMQTT demo

<?php

require_once 'vendor/autoload.php';
use Bluerhinos\phpMQTT;

$mqttServer = "127.0.0.1";
$mqttPort = 1883;
$mqttTopic = "test";
$mqttMessage = "Hello from PHPMQTT_Client";
$username = "admin";
$password = "admin";

$flag = empty($argv[1]) ? "" : $argv[1];

$mqttClient = new phpMQTT($mqttServer, $mqttPort, "PHPMQTT_Client" . $flag);

if ($mqttClient->connect(true, null, $username, $password)) {
$mqttClient->debug = true;

if (!empty($flag)) {
/**
* 订阅消息逻辑
*/
$mqttClient->subscribe([
$mqttTopic => [
"qos" => 0,
"function" => function ($topic, $message) {
var_dump($topic, $message);
}
]
]);

while ($mqttClient->proc()) {
usleep(100000);
}

} else {
/**
* 发布消息
*/
while (true) {
$mqttClient->publish($mqttTopic, $mqttMessage, 0);
sleep(2);
}
}

} else {
echo "MQTT服务连接失败\n";
}
exit;

其他服务端

Yes, 有一些与 Mosquitto 类似的 MQTT 服务端,提供了相似的 MQTT 协议支持。以下是一些常见的 MQTT 服务端实现:

  1. Eclipse Mosquitto:

Mosquitto 是一个开源的 MQTT 服务器,它是 Eclipse IoT 项目的一部分。它支持 MQTT v3.1 和 v3.1.1 协议,是一个轻量级且易于部署的 MQTT 服务器。你可以从官方网站获取更多信息:Eclipse Mosquitto

  1. EMQ (Erlang MQTT Broker):

EMQ 是一个使用 Erlang 语言编写的开源 MQTT 服务器。它支持 MQTT v3.1 和 v3.1.1,具有可扩展性和高性能。EMQ X 是 EMQ 的后续版本,提供更多功能,包括支持 MQTT v5 协议。了解更多信息:EMQ X

  1. VerneMQ:

VerneMQ 是一个使用 Erlang 构建的分布式 MQTT 服务器。它支持 MQTT v3.1 和 v3.1.1,具有高可用性和水平扩展性。它适用于构建大规模、可靠的 MQTT 通信系统。了解更多信息:VerneMQ

  1. HiveMQ:

HiveMQ 是一个专业的 MQTT 服务器,支持 MQTT v3.1 和 v3.1.1。它提供了企业级的功能,包括集群支持、可靠性、安全性等。了解更多信息:HiveMQ

  1. Aedes:

Aedes 是一个用 JavaScript 编写的 MQTT 服务器,可以运行在 Node.js 上。它轻量级且易于嵌入到 JavaScript 项目中。了解更多信息:Aedes

选择适合你需求的 MQTT 服务器取决于你的具体场景和要求,例如可扩展性、安全性、支持的 MQTT 协议版本以及其他特定功能。

EMQX

官网: https://www.emqx.com/zh