RabbitMQ Web MQTT 插件
概述
Web MQTT 插件使得可以通过 WebSocket 连接使用 MQTT。
此插件的目标是在 Web 应用程序中启用 MQTT 消息传递。
一个类似的插件,Web STOMP 插件,使得可以通过 WebSockets 使用 STOMP。
工作原理
RabbitMQ Web MQTT 插件相当简单。它采用由 RabbitMQ MQTT 插件 提供的 MQTT 协议,并通过 WebSockets 公开它。
安装和启用插件
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
这些示例将在 https://127.0.0.1:15670/ url 下可用。您将看到两个示例
- "echo" - 演示如何使用 MQTT 进行简单的消息广播
- "bunny" - 一个简单的协作画布绘画应用程序示例
我们鼓励您查看 源代码。
配置
如果没有指定配置,Web MQTT 插件将在端口 15675 上的所有接口上侦听,并且默认用户登录名和密码为 guest
/guest
。请注意,默认情况下,此用户仅 允许从本地主机连接。我们强烈建议为生产系统创建单独的用户。
要更改侦听器端口,请编辑您的 配置文件,使其包含 rabbitmq_web_mqtt
应用程序的 port
变量。
例如,一个完整的配置文件,将侦听器端口更改为 9001
,如下所示
web_mqtt.tcp.port = 9001
有关更多信息,请参阅 RabbitMQ 网络指南。
TLS (WSS)
该插件支持使用 TLS (WSS) 连接的 WebSockets。请参阅 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 TLS 和 TLS 故障排除。
代理协议
Web MQTT 插件支持 代理协议。此功能默认情况下处于禁用状态,要为 MQTT 客户端启用它
web_mqtt.proxy_protocol = true
有关代理协议的更多信息,请参阅 网络指南。
高级选项
Web MQTT 插件在后台使用 Cowboy HTTP 和 WebSocket 服务器。Cowboy 提供了 许多选项,可用于自定义服务器在 WebSocket 连接处理方面的行为。
某些设置是通用的 HTTP 设置,而其他设置是特定于 WebSockets 的。
HTTP 选项
可以使用 web_mqtt.cowboy_opts.*
键指定通用 HTTP 服务器设置,例如
# 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