版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xianglingchuan/article/details/79386632 </div>
<div id="content_views" class="markdown_views">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<p>一直在微信公众号上使用mqtt协议控制智能设备,但新需求是要在小程序上运行。 <br>
小程序要求:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
重启服务之后无效果!
升级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
- 1
查看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}]}]},
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
直接将域名证书修改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';
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
修改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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
注意: 今天发现相关项目web端发送mqtt消息提示“com.actions.mqtt.PublishThread - Client is not connected”, 因为重启了emqttd服务,web端没有自动链接上mqtt,重新java项目后正常。