跳至主内容
版本:4.3

RabbitMQ Web MQTT 插件

概述

Web MQTT 插件使得通过 WebSocket 连接使用 MQTT 成为可能。

该插件的目标是支持在 Web 应用程序中进行 MQTT 消息传递。

类似的插件 Web STOMP 插件 使得通过 WebSocket 使用 STOMP 成为可能。

工作原理

RabbitMQ Web MQTT 插件非常简单。它获取由 RabbitMQ MQTT 插件 提供的 MQTT 协议,并通过 WebSocket 将其暴露出来。

插件的安装与启用

rabbitmq_web_mqtt 插件随 RabbitMQ 一起发布。

要启用该插件,请运行 rabbitmq-plugins

rabbitmq-plugins enable rabbitmq_web_mqtt

用法

为了在 Web 浏览器环境中使用 MQTT,需要一个 JavaScript MQTT 库。我们已经使用 Paho JavaScript 客户端 进行了测试。它包含在 RabbitMQ Web MQTT 示例插件 中。

默认情况下,Web MQTT 插件会在 15675 端口暴露一个 WebSocket 端点。该 WebSocket 端点可在 /ws 路径下访问。

ws://127.0.0.1:15675/ws

要通过 WebSocket 从浏览器建立连接,您可以使用如下代码

<!-- include the client library -->
<script src="mqttws31.js"></script>
<script>
var wsbroker = location.hostname; // mqtt websocket enabled broker
var wsport = 15675; // port for above
var client = new Paho.MQTT.Client(wsbroker, wsport, "/ws",
"myclientid_" + parseInt(Math.random() * 100, 10));
client.onConnectionLost = function (responseObject) {
debug("CONNECTION LOST - " + responseObject.errorMessage);
};
client.onMessageArrived = function (message) {
debug("RECEIVE ON " + message.destinationName + " PAYLOAD " + message.payloadString);
print_first(message.payloadString);
};
// ...

一旦拥有了 client 对象,就可以遵循 Paho JavaScript 库 提供的 API。下一步通常是与代理建立 MQTT 连接

// ...

var options = {
timeout: 3,
keepAliveInterval: 30,
onSuccess: function () {
debug("CONNECTION SUCCESS");
client.subscribe('/topic/test', {qos: 1});
},
onFailure: function (message) {
debug("CONNECTION FAILURE - " + message.errorMessage);
}
};
if (location.protocol == "https:") {
options.useSSL = true;
}
debug("CONNECT TO " + wsbroker + ":" + wsport);
client.connect(options);
// ...

Web MQTT 示例

一些简单的 Web MQTT 示例作为 RabbitMQ Web MQTT 示例 插件提供。要运行它,请按照该插件的安装说明进行操作并启用插件

rabbitmq-plugins enable rabbitmq_web_mqtt_examples

这些示例可在 http://127.0.0.1:15670/ 地址访问。您将看到两个示例

  • “echo” - 展示如何使用 MQTT 进行简单的消息广播
  • “bunny” - 一个简单的协同绘图应用程序示例

我们鼓励您查看 源代码

配置

当未指定配置时,Web MQTT 插件将监听所有接口上的 15675 端口,并使用默认用户登录名和密码 guest/guest。请注意,该用户默认情况下仅 允许从本地主机 (localhost) 连接。我们强烈建议为生产系统创建一个单独的用户。

要更改监听端口,请编辑您的 配置文件,使其包含 rabbitmq_web_mqtt 应用的 port 变量。

例如,将监听端口更改为 9001 的完整配置文件如下所示

web_mqtt.tcp.port = 9001

更多信息,请参阅 RabbitMQ 网络指南

TLS (WSS)

该插件支持带有 TLS (WSS) 的 WebSocket 连接。请参阅 TLS 指南 以了解有关 RabbitMQ 中 TLS 支持的更多信息。

TLS 配置参数在 web_mqtt.ssl 部分提供

web_mqtt.ssl.port = 15676
web_mqtt.ssl.backlog = 1024
web_mqtt.ssl.cacertfile = /path/to/ca_certificate.pem
web_mqtt.ssl.certfile = /path/to/server_certificate.pem
web_mqtt.ssl.keyfile = /path/to/server_key.pem
# needed when private key has a passphrase
# web_mqtt.ssl.password = changeme

TLS 监听端口、服务器证书文件、私钥和 CA 证书包是必选选项。如果私钥使用了密码,则密码也是必填项。扩展的 TLS 设置列表与 核心服务器的设置 基本一致。该插件支持的选项完整列表可以在 Ranch 文档 中找到。

此外还提供了一份单独的 TLS 故障排除 指南。

启用的 TLS 版本和密码套件

您可以配置 RabbitMQ 使用的 TLS 版本和密码套件。请注意,并非所有套件在所有系统上都可用。

RabbitMQ TLS 指南包含 TLS 版本部分密码套件部分。以下是一个 高级配置文件格式 的示例,该示例为插件配置了密码套件以及其他一些 TLS 选项

web_mqtt.ssl.port = 15676
web_mqtt.ssl.backlog = 1024
web_mqtt.ssl.certfile = /path/to/server_certificate.pem
web_mqtt.ssl.keyfile = /path/to/server_key.pem
web_mqtt.ssl.cacertfile = /path/to/ca_certificate_bundle.pem
web_mqtt.ssl.password = changeme

web_mqtt.ssl.honor_cipher_order = true
web_mqtt.ssl.honor_ecc_order = true
web_mqtt.ssl.client_renegotiation = false
web_mqtt.ssl.secure_renegotiate = true

web_mqtt.ssl.versions.1 = tlsv1.2
web_mqtt.ssl.versions.2 = tlsv1.1
web_mqtt.ssl.ciphers.1 = ECDHE-ECDSA-AES256-GCM-SHA384
web_mqtt.ssl.ciphers.2 = ECDHE-RSA-AES256-GCM-SHA384
web_mqtt.ssl.ciphers.3 = ECDHE-ECDSA-AES256-SHA384
web_mqtt.ssl.ciphers.4 = ECDHE-RSA-AES256-SHA384
web_mqtt.ssl.ciphers.5 = ECDH-ECDSA-AES256-GCM-SHA384
web_mqtt.ssl.ciphers.6 = ECDH-RSA-AES256-GCM-SHA384
web_mqtt.ssl.ciphers.7 = ECDH-ECDSA-AES256-SHA384
web_mqtt.ssl.ciphers.8 = ECDH-RSA-AES256-SHA384
web_mqtt.ssl.ciphers.9 = DHE-RSA-AES256-GCM-SHA384

TLS (WSS) 故障排除

更多信息,请参阅 RabbitMQ TLSTLS 故障排除

代理协议

Web MQTT 插件支持 proxy 协议。该功能默认处于停用状态,要为 MQTT 客户端启用它,请执行以下操作

web_mqtt.proxy_protocol = true

有关代理协议的更多信息,请参阅 网络指南

高级选项

Web MQTT 插件底层使用 Cowboy HTTP 和 WebSocket 服务器。Cowboy 提供了 许多选项,可用于根据 WebSocket 连接处理自定义服务器行为。

其中一些设置是通用的 HTTP 设置,另一些则是 WebSocket 特有的。

HTTP 选项

通用 HTTP 服务器设置可以使用 web_mqtt.cowboy_opts.* 键来指定,例如

# connection inactivity timeout
web_mqtt.cowboy_opts.idle_timeout = 60000
# max number of pending requests allowed on a connection
web_mqtt.cowboy_opts.max_keepalive = 200
# max number of headers in a request
web_mqtt.cowboy_opts.max_headers = 100
# max number of empty lines before request body
web_mqtt.cowboy_opts.max_empty_lines = 5
# max request line length allowed in requests
web_mqtt.cowboy_opts.max_request_line_length

WebSocket 选项

# WebSocket traffic compression is enabled by default
web_mqtt.ws_opts.compress = true

# WebSocket connection inactivity timeout
web_mqtt.ws_opts.idle_timeout = 60000

web_mqtt.ws_opts.max_frame_size = 50000
© . This site is unofficial and not affiliated with VMware.