RabbitMQ Web MQTT 插件
概述
Web MQTT 插件使得可以通过 WebSocket 连接使用 MQTT。
此插件的目标是使 Web 应用程序能够进行 MQTT 消息传递。
一个类似的插件 Web STOMP 插件,使得可以通过 WebSocket 使用 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 示例
作为 RabbitMQ Web MQTT 示例 插件,提供了一些简单的 Web MQTT 示例。要运行它,请按照该插件的安装说明进行操作并启用该插件。
rabbitmq-plugins enable rabbitmq_web_mqtt_examples
示例将在 http://127.0.0.1:15670/ URL 下可用。您将看到两个示例
- "echo" - 展示了如何使用 MQTT 进行简单的消息广播。
- "bunny" - 一个简单的协作画布绘画应用程序的示例。
我们鼓励您查看 源代码。
配置
当未指定配置时,Web MQTT 插件将监听所有接口的端口 15675,并使用默认的用户名和密码 guest/guest。请注意,此用户默认只 允许从 localhost 连接。我们强烈建议为生产系统创建一个单独的用户。
要更改监听端口,请编辑您的 配置文件,在 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 插件支持 proxy protocol。此功能默认处于禁用状态,要为 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