RabbitMQ插件之MQTT
如何安装rabbitmq
,请移步:http://www.cuiwei.net/p/1371869141
启用mqtt插件
vi enabled_plugins
[...,rabbitmq_mqtt,rabbitmq_web_mqtt].
重启rabbitmq
后,访问 RabbitMQ Management
可以看到
- http/web-mqtt服务(ws)已经启动了,在15675端口上了
- https/web-mqtt服务(wss)已经启动了,在15676端口上了
- mqtt服务(tcp)已经启动了,在1883端口上
- mqtt/ssl服务(ssl)已经启动了,在8883端口上
tcp/ssl
tcp://localhost:1883
ssl://localhost:8883
cat /etc/rabbitmq/conf.d/15-mqtt-ssl.conf
ssl_options.cacertfile = /etc/rabbitmq/cert/ca.cer
ssl_options.certfile = /etc/rabbitmq/cert/www.cuiwei.net.pem
ssl_options.keyfile = /etc/rabbitmq/cert/www.cuiwei.net.key
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
# default TLS-enabled port for MQTT connections
mqtt.listeners.ssl.default = 8883
mqtt.listeners.tcp.default = 1883
TLS (WSS)
具体项目中,是使用ws
,还是wss
,取决于当前域名,如果当前域名是https
,就只能使用wss
,如果当前域名是http
,就只能使用ws
这个插件默认支持ws
,直接用ws://127.0.0.1:15675/ws
就行
wss需要一些配置才能使用wss://127.0.0.1:15676/ws
1️⃣
cat /etc/rabbitmq/conf.d/20-web-mqtt-ssl.conf
web_mqtt.ssl.port = 15676
web_mqtt.ssl.backlog = 1024
web_mqtt.ssl.cacertfile = /etc/rabbitmq/cert/ca.cer
web_mqtt.ssl.certfile = /etc/rabbitmq/cert/www.cuiwei.net.pem
web_mqtt.ssl.keyfile = /etc/rabbitmq/cert/www.cuiwei.net.key
如上,用到3个文件,这些文件和配置https用的是一样的。
如果你用的是阿里云的免费证书(DV单域名证书)
- 先选择
nginx
下载
得到.pem
和.key
两个文件
- 再选择
根证书下载
得到Digicert-OV-DV-root.cer
文件,重命名为ca.cer
调试工具
MQTTBox
多年未更新,mqtt+tls不支持
MQTTBox 是一个带有可视化的界面的 MQTT 的客户端工具
主要用来测试。下载链接已经打不开了,应用商店也搜索不到了,可能是多年没更新了,但可以直接打开应用商店链接
Github:workswithweb/MQTTBox
使用
增加一个mqtt client
订阅和发布
MQTTX
非常方便,4种连接都支持
JS
如下,安装的是最新版,目前最新版是4.3.7
yarn add mqtt
测试代码
mounted() {
this.initMqtt()
this.mqttReceive()
},
methods: {
initMqtt() {
let vm = this
let commonApi = 'ws://localhost:15675/ws'
const options = {
//mqtt客户端的id
clientId: 'client_' + Math.random().toString(16).substr(2, 8),
username: 'guest',
password: 'guest',
clean: true,
connectTimeout: 30 * 1000
}
vm.client = mqtt.connect(commonApi, options)
this.client.on('connect', function () {
console.log('连接成功....')
})
//如果连接错误,打印错误
vm.client.on('error', function (err) {
console.log('err=>', err)
vm.client.end()
})
},
mqttReceive() {
let topic = 'room_' + this.window.IM_ROOM_ID //要接收的主题
const vm = this
vm.client.subscribe(topic, function (err) {
if (!err) {
console.log('subscribe success!')
} else {
console.log('err', err)
}
})
vm.client.on('message', function (topic, message) {
console.log(message.toString())
let msg = JSON.parse(message.toString())
if (!vm.messageList.find((element, index, array) => element.id === msg.id)) {
vm.messageList = [...vm.messageList, msg]
}
})
},
destroyed() {
if (this.client.end) this.client.end()
}
}
另一种,详见 https://juejin.cn/post/6979414392773279752
PHP
如下,安装的是最新版,目前最新版是1.1
composer require php-mqtt/client
测试代码
https://github.com/chudaozhe/php-demo/tree/master/rabbitmq/mqtt
参考
1️⃣如果没成功,可以参考下官方文档 https://www.rabbitmq.com/web-mqtt.html#tls
其中一项是:在线解析证书
cuiwei@weideMacBook-Pro cert % openssl s_client -connect localhost:15676 -cert www.cuiwei.net.pem -key www.cuiwei.net.key -CAfile ca.cer
CONNECTED(00000005)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Encryption Everywhere DV TLS CA - G1
verify return:1
depth=0 CN = www.cuiwei.net
verify return:1