RabbitMQ插件之MQTT

编辑于 2022-06-27 14:57 阅读 2904

如何安装rabbitmq,请移步:http://www.cuiwei.net/p/1371869141

启用mqtt插件

vi enabled_plugins
[...,rabbitmq_mqtt,rabbitmq_web_mqtt].

重启rabbitmq后,访问 RabbitMQ Management

WX202206271449532x.png

可以看到

  • 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/ws1️⃣

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两个文件

  • 再选择根证书下载

WX202205101900472x.png

得到Digicert-OV-DV-root.cer文件,重命名为ca.cer

调试工具

MQTTBox

多年未更新,mqtt+tls不支持

MQTTBox 是一个带有可视化的界面的 MQTT 的客户端工具

主要用来测试。下载链接已经打不开了,应用商店也搜索不到了,可能是多年没更新了,但可以直接打开应用商店链接

chrome 网上应用店

Github:workswithweb/MQTTBox

使用

增加一个mqtt client

WX202205081825142x.png

订阅和发布

WX202205081845332x.png

MQTTX

非常方便,4种连接都支持

WX202205122313192x.jpg

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

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验