EMQ2.3 开启wss、映射去掉端口号

一直在微信公众号上使用mqtt协议控制智能设备,但新需求是要在小程序上运行。
小程序要求:
1、要求接口使用HTTPS,SSL1.2以上,
2、ws需要修改为wss,wss后面不能跟端口号。
花费了一些时间解决,记录整个过程。
这里写图片描述

开启配置WSS

修改emq.conf配置文件

首先想到的是修改emq.conf配置文件
位置是:/etc/emqttd/emq.conf
根据官方文档添加相关证书

##--------------------------------------------------------------------
## External MQTT/WebSocket/SSL Listener

listener.wss.external = 8084

listener.wss.external.acceptors = 4

listener.wss.external.max_clients = 64

listener.wss.external.access.1 = allow all

## SSL Options
listener.wss.external.handshake_timeout = 15s

#listener.wss.external.keyfile = /etc/emqttd/certs/key.pem
 listener.wss.external.keyfile = /etc/emqttd/certs/web.com.key

#listener.wss.external.certfile = /etc/emqttd/certs/cert.pem
 listener.wss.external.certfile = /etc/emqttd/certs/web.com.pem

## listener.wss.external.cacertfile = /etc/emqttd/certs/cacert.pem

## listener.wss.external.verify = verify_peer

## listener.wss.external.fail_if_no_peer_cert = true

重启服务之后无效果!

升级EMQ版本

后来考虑到可能是版本的问题,将2.3.0升级到最新2.3.4版本,但还是不行。

解决方法

通过ps -ef | grep emqttd发现配置文件引入的不是/etc/emqttd/emq.conf,
而是-config /var/lib/emqttd/configs/app.2018.02.26.17.56.21.config

emqtt    18682 18665  0 Feb26 pts/1    00:01:03 /usr/lib64/emqttd/erts-9.0/bin/beam.smp -W w -e 256000 -Q 65536 -P 256000 -A 32 -K true -zdbbl 32768 -- -root /usr/lib64/emqttd -progname usr/sbin/emqttd -- -home /var/lib/emqttd -- -boot /usr/lib64/emqttd/releases/2.3/emqttd -mode embedded -boot_var ERTS_LIB_DIR /usr/lib64/emqttd/erts-9.0/../lib -mnesia dir "/var/lib/emqttd/mnesia/emq@127.0.0.1" -config /var/lib/emqttd/configs/app.2018.02.26.17.56.21.config -kernel net_ticktime 60 -smp auto -setcookie emqsecretcookie -name emq@127.0.0.1 -vm_args /var/lib/emqttd/configs/vm.2018.02.26.17.56.21.args -- console

这里写图片描述
查看config内容
内容如下:

          {ssl,8883,
               [{connopts,[]},
                {sockopts,
                    [{backlog,1024},
                     {send_timeout,15000},
                     {send_timeout_close,true},
                     {nodelay,true},
                     {reuseaddr,true}]},
                {sslopts,
                    [{handshake_timeout,15000},
                     {keyfile,"/etc/emqttd/certs/key.pem"},
                     {certfile,"/etc/emqttd/certs/cert.pem"},
                     {reuse_sessions,true}]},
                {acceptors,16},
                {max_clients,1024},
                {access,[{allow,all}]}]},
           {wss,8084,
               [{connopts,[]},
                {sockopts,
                    [{backlog,1024},
                     {send_timeout,15000},
                     {send_timeout_close,true},
                     {nodelay,true},
                     {reuseaddr,true}]},
                {sslopts,
                    [{handshake_timeout,15000},
                     {keyfile,"/etc/emqttd/certs/key.pem"},
                     {certfile,"/etc/emqttd/certs/cert.pem"},
                     {reuse_sessions,true}]},
                {acceptors,4},
                {max_clients,64},
                {access,[{allow,all}]}]},

这里写图片描述
直接将域名证书修改key.pem和cert.pem,然后重启。
测试成功!
这里写图片描述

wss映射方法

nginx配置

        location /mqtt {
           access_log /wwwlogs/com.log;
           proxy_pass https://localhost:8084/mqtt;
           proxy_read_timeout 60s;
           proxy_set_header Host $host;
           proxy_set_header X-Real_IP $remote_addr;
           proxy_set_header X-Forwarded-for $remote_addr;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection 'Upgrade';
        }

修改mqttws库

修改mqttws31.js库中的内容,去掉端口号

      if (arguments.length == 2) {
          // host: must be full ws:// uri
          // port: clientId
          clientId = port;
          uri = host;
          var match = uri.match(/^(wss?):\/\/((\[(.+)\])|([^\/]+?))(:(\d+))?(\/.*)$/);
          if (match) {
              host = match[4]||match[2];
              port = parseInt(match[7]);
              path = match[8];
          } else {
              throw new Error(format(ERROR.INVALID_ARGUMENT,[host,"host"]));
          }
      } else {
          if (arguments.length == 3) {
        clientId = path;
        path = "/mqtt";
      }
      if (typeof port !== "number" || port < 0)
        throw new Error(format(ERROR.INVALID_TYPE, [typeof port, "port"]));
      if (typeof path !== "string")
        throw new Error(format(ERROR.INVALID_TYPE, [typeof path, "path"]));

      var ipv6AddSBracket = (host.indexOf(":") != -1 && host.slice(0,1) != "[" && host.slice(-1) != "]");
      // uri = "ws://"+(ipv6AddSBracket?"["+host+"]":host)+":"+port+path;
      //去端口号
      uri = "ws://"+(ipv6AddSBracket?"["+host+"]":host)+path;
    }

注意: 今天发现相关项目web端发送mqtt消息提示“com.actions.mqtt.PublishThread - Client is not connected”, 因为重启了emqttd服务,web端没有自动链接上mqtt,重新java项目后正常。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值