我的测试环境:

Linux: CentOS7

EMQX:V3.2.3

题外话:

这里主要介绍Websocket的支持问题。

对ws的支持比较正常,但是对wss的支持,调了较长的时间,没有成功。

JavaScript支持mqtt的工具有paho.mqtt.js和mqtt.js. 我这里为了研究wss,所以,重点采用的是mqtt.js.基于这两种工具包,ws的通信,我这里都很顺利的调通了,通信没有问题。

看代码

因为paho.mqtt.js没有看到有支持SSL的地方(至少从库里面的配置参数上,没有看到。。。),基于mqtt.js的wss配置,是有参数可以支持的,所以重点研究的是mqtt.js的使用。下面是我的wss代码。

<html>
<head>
<title>Ws mqtt.js</title>
<script src="./js/mqtt-3.0.0.min.js"></script>
</head>
<body>
<script>
var myca =
"-----BEGIN CERTIFICATE-----"+
"MIIDhDCCAmygAwIBAgIGAW2+wl6XMA0GCSqGSIb3DQEBCwUAMFcxFDASBgNVBAMTC0lPVFBMQVRG"+
"T1JNMQswCQYDVQQLEwJJVDELMAkGA1UEChMCVEsxCzAJBgNVBAcTAldIMQswCQYDVQQIEwJIQjEL"+
"MAkGA1UEBhMCQ04wHhcNMTkxMDEyMDY1NzUyWhcNNDkxMDEyMDY1NzUyWjBXMRQwEgYDVQQDEwtJ"+
"T1RQTEFURk9STTELMAkGA1UECxMCSVQxCzAJBgNVBAoTAlRLMQswCQYDVQQHEwJXSDELMAkGA1UE"+
"CBMCSEIxCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoBcnvo/P"+
"XT9keD5NC6nviy12hFQ7W+YCTMZJiGgi2lGI9uytYivzom7+WshLMqrUwE3E2BCTiLmGGGHv+GTd"+
"kkGbpF0wsZPpefTBw0czQNOQgMIKOw1t11GijakHvuzJKgRofjyfew2YqF+cBxOM/f0xhExfjft8"+
"qLUUJ80w9VEJDeBhmE20esH9if0KYfjHOJiw5h1p4qG/W6xIZhSm22bgsBGd75zE7HmYWxO2bSwb"+
"nt7boqk9Vyyeg/6XCujHHGekPpUKRsDfAPNDtYaUgSjqir6t4qDRHh3A2gxUlyWjQfCHhJOKSIi7"+
"BAV5qn3aHvXht9liSNiQHMhgeuJTjwIDAQABo1YwVDAfBgNVHSMEGDAWgBQN7Ujpzizp8uezK+Pm"+
"37StF+YJ1zASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBQN7Ujpzizp8uezK+Pm37StF+YJ"+
"1zANBgkqhkiG9w0BAQsFAAOCAQEAYPBChFSrAjjssqb6uwuZtD0JWZ4MiOKJFTNrfChmzcCOotYR"+
"IOEFF1UHw+vWbe/iYAFQvhG83DmbOVAgC/uTIXVL5W+H4Wh7SfToqDNMYR8hmtMYFyjzF/0eXN3c"+
"IvmusfZdDJrpkEhQ7OxlN58UQZSrakPz/q8mXN2pe9bRUGh1sQ0hlwuLI+M4GX8SK68XRxEZfC3S"+
"qvl+YLL7jQRwUduVvjK33SepXjG3JrM6ds8Q6pvXCFDcLymo5XuV6GX7HGuFIcg1u4PUnuM7xgw7"+
"vzSwQOvGXdkDZrsdrZa2b9wVxgLFc6VY0neLwjjFBVSHIziQ+vaDrbzhc8h06U1h4Q=="+
"-----END CERTIFICATE-----";
var mycert =
"-----BEGIN CERTIFICATE-----"+
"MIIDfTCCAmWgAwIBAgIGAW2+25yZMA0GCSqGSIb3DQEBCwUAMFcxFDASBgNVBAMTC0lPVFBMQVRG"+
"T1JNMQswCQYDVQQLEwJJVDELMAkGA1UEChMCVEsxCzAJBgNVBAcTAldIMQswCQYDVQQIEwJIQjEL"+
"MAkGA1UEBhMCQ04wHhcNMTkxMDEyMDY1NzUyWhcNMjkxMDEyMDcyNTI2WjBZMRYwFAYDVQQDEw0x"+
"MC45NS4yMDAuMTU1MQswCQYDVQQLEwJJVDELMAkGA1UEChMCVEsxCzAJBgNVBAcTAldIMQswCQYD"+
"VQQIEwJIQjELMAkGA1UEBhMCQ04wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCNncv+"+
"iY61KPT9GiHCsAs03EkW2s6usfHq8fgnrfOr4uEATBYsh+UuVM2dCEb37A57PYwBLY3ZgqnjkQke"+
"WHwf/iyofpte1c3zF64Qi9qt4xuDnWNxAE1DmxCNcKGD1oNEW/5/6g5kVaApD2EjD9DPbL2+/nHT"+
"oEyVuqi04JYVLslJOaE0kthtSOakcdzGAOlEYTZbrzlBexSTQxDlRlFnO6IT+DaFpFr0W9ovBVj8"+
"pp0a7PzjMB6mzUlq+tdU1n46YiuqzPHZK7ZdLl1Nbm7Dpmz8k09uIvUtpWTqbowq/SB3YX+yRg2T"+
"VAVgQb3u9faGYMmhHLiF11jNpxhkjHTfAgMBAAGjTTBLMB8GA1UdIwQYMBaAFA3tSOnOLOny57Mr"+
"4+bftK0X5gnXMAkGA1UdEwQCMAAwHQYDVR0OBBYEFHVOM4gj+f2AlNUzHfh2sWOo7n/uMA0GCSqG"+
"SIb3DQEBCwUAA4IBAQCP0gWTUuQ27gvNiqicOr7vFpQ/MNKOK6stY856kIZr5DDtRs4X3SPv37wL"+
"6VHx9hxFRJ8oYL+7QBsuFo7UIxsu1N7/Saf5jEjOcmzcgj2EVmyWNR3TcgF+qTeRIGZXKnHd1ted"+
"5D9D8RcLbKHSwTX3/7u8QNie5D+4XE4oMpJywjxyKv9ypxzEXmLU8/qIznkE9HdJctMyFiltHPGR"+
"x+cjIsy3kyIxz7LfL2bhDogEXbfofbCm/tEJ1EBNf7+mhZQhNfrU8CUBOXiWg/2weX/sh++TF+Oe"+
"DDj4I+gB4BK5293Lh9F9A3DpirxEFksUcGxdmeDYybwNTYjnByL1pxFd"+
"-----END CERTIFICATE-----";
var mykey =
"-----BEGIN PRIVATE KEY-----"+
"MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCNncv+iY61KPT9GiHCsAs03EkW"+
"2s6usfHq8fgnrfOr4uEATBYsh+UuVM2dCEb37A57PYwBLY3ZgqnjkQkeWHwf/iyofpte1c3zF64Q"+
"i9qt4xuDnWNxAE1DmxCNcKGD1oNEW/5/6g5kVaApD2EjD9DPbL2+/nHToEyVuqi04JYVLslJOaE0"+
"kthtSOakcdzGAOlEYTZbrzlBexSTQxDlRlFnO6IT+DaFpFr0W9ovBVj8pp0a7PzjMB6mzUlq+tdU"+
"1n46YiuqzPHZK7ZdLl1Nbm7Dpmz8k09uIvUtpWTqbowq/SB3YX+yRg2TVAVgQb3u9faGYMmhHLiF"+
"11jNpxhkjHTfAgMBAAECggEAGNUmxEeSwqmf7BH9AYqlLGvEVUGhJHkHls8/WJXkOKvcEJVG/iAG"+
"TA2K0JJ2/1phX7L3Le2zBgUnjUQNeUjC20lSw2kQDZ0oNAxe9X/QpNVCKd4bZeFLqyMxz9uENv4S"+
"npYTFpMQWv+4yfpsah2H3BeRXkB37UgapdbJZo5LQwNieJlKbZVazOg3We7d90epxToV1zrEO21h"+
"4VfN/OzpsQ4VeMoFSEozFZHU4E7rXhSw7zZqd7vZwnhfUAvLvzAMrfuVOTknNkooty9CzU1f6UEk"+
"bjSyUfHndGMUl45Nws4mWoWgDbF3sjytcjBUKxpqbduy0StBGEz3ipj86k7FwQKBgQDAnNV7pzlK"+
"BvnZ0FhoJn/rXIx3stt0O2w8k0oSdkZ67cValSQHSlS0bRwofj59TK5Wj8/DKerqJKXQgWt9MCcy"+
"5k7541NG31B7EEOeLYZcsQA1kNYYvgkghrj30OC3+SwbiUEU2E+LDF5Mq2VIdUqAKamH6n9Xc9mF"+
"UALHh59FKQKBgQC8OKYEbhQicUppLtk2d/5tzV6zZySZq2bZz3Yzs9AyegBs8eAUF5dk86t1DRg3"+
"+nXvqvB1BSL0kW7OWuwGw2LYP3xbSM2vQ/Yp5RwRFtBXbWyd6Brw3AZf33L0H/6EmUUZDZTSI8wn"+
"YP4av2zYqY0LErX+giyzDqYPjr0CSaRixwKBgQCUdo6q0Bt9buEYvdnW9Y32CZEQFmHHNqJYEqOu"+
"lVIAINPU3U42/FlL9SoWIDDkfb2HZTQcV2wF7BePHqKOjRY5yoGnZUxkPW8YXFHyU17UhW4G28va"+
"qGf6lT1vbqY3yCzyUJpEifLN18u7xwS7lATHwtU0uVBMRTSt6B0sVOIz+QKBgHYBykyiu2rwvqd9"+
"oN/ekZ1EEmjGdRMHfJ94y/IUfab4CMZFS6ktNVUs1MW5ZQLLvB98e+/SPZ06hU9JgAupepJ8Ezqk"+
"RZjqMi8IHvWz6QG3cE78U8/JExIO5WKboJaABet0MWci3H+f9xDMDbE1dGGJ5KLh+KZ2u7SrWGNT"+
"yoXHAoGBAKGwZM4/ZUOVnl1nMDg+m96A9+VaGT/d8mxImTDdDmEuarjmGuiqqygWMMJirgQDovsD"+
"BTZP3/a5N3TmqVt4RP+5Sd5T2svlC536etHOIltuyXeJSsYSrk0ifvdG94ePhlGBrWLt8wxKEaG6"+
"BLCty7md7EUHxNS19Oa4BV7JVN9t"+
"-----END PRIVATE KEY-----";
var options = {
protocolId: 'MQTT',
protocolVersion: ,
clean: true,
reconnectPeriod: ,
connectTimeout: * ,
clientId: 'emqx_mqtt_js001',
username: 'shihuc',
password: 'shihuc',
keepalive: ,
rejectUnauthorized: true, //若不是wss,这个参数改为false,然后下面的三个参数都不需要出现在options里面
key: mykey,
cert: mycert,
// The CA list will be used to determine if server is authorized
ca: myca
}
const sendTopic = "kkk/send";
const recvTopic = "kkk/recv";
const client = mqtt.connect('wss://10.95.200.13:8084/mqtt', options); //ws模式下,将protocol改为ws,端口改为8083 // 连接建立后,可以在此处设置应用逻辑作
client.on('connect', function () {
client.subscribe(recvTopic, {qos: });
client.publish(sendTopic, "connection is successful!", {qos: , retain: false }) ;
}) // 在这里可以添加业务逻辑,正常接收消息
client.on("message", function (topic, payload) {
console.log([topic, payload].join(": "));
}) // 重连成功,在这里设置重连的业务逻辑
client.on('reconnect', (error) => {
console.log('正在重连:', error);
}) // 这里显示连接错误的信息,可以添加业务逻辑
client.on('error', (error) => {
console.log('连接失败:', error);
client.end();
}) function send() {
var s = document.getElementById("msg").value;
if (s) {
s = "{time:" + new Date().Format("yyyy-MM-dd hh:mm:ss") + ", content:" + (s) + ", from: web console based on mqtt.js}";
client.publish(sendTopic, s);
document.getElementById("msg").value = "";
}
} var count = ; function start() {
window.tester = window.setInterval(function () {
if (client.connected) {
var s = "{time:" + new Date().Format("yyyy-MM-dd hh:mm:ss") + ", content:" + (count++) + ", from: web console based on mqtt.js}";
client.publish(sendTopic, s);
}
}, );
} function stop() {
window.clearInterval(window.tester);
} Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + , //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + ) / ), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$, (this.getFullYear() + "").substr( - RegExp.$.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$, (RegExp.$.length == ) ? (o[k]) : (("" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
</script>
<input type="text" id="msg" />
<input type="button" value="Send" onclick="send()" />
<input type="button" value="Start" onclick="start()" />
<input type="button" value="Stop" onclick="stop()" />
</body>
</html>

一直不成功,双向验证的时候,总是报服务端证书不对。

这个问题,让我想起来,之前研究EMQX的CoAP协议在DTLS安全通信模式下不工作的问题了。是EMQX目前不支持么?

有知道的看官,可以留言支招,若你有任何想法。。。

MQTT研究之EMQ:【EMQX使用中的一些问题记录(2)】的更多相关文章

  1. MQTT研究之EMQ:【CoAP协议应用开发】

    本博文的重点是尝试CoAP协议的应用开发,其中包含CoAP协议中一个重要的开源工具libcoap的安装和遇到的问题调研.当然,为了很好的将EMQ的CoAP协议网关用起来,也调研了下EMQ体系下,CoA ...

  2. MQTT研究之EMQ:【EMQ之HTTP认证/访问控制】

    今天进行验证的逻辑是EMQ的http的Auth以及ACL的逻辑. 首先,参照HTTP插件认证配置的说明文档进行基本的配置, 我的配置内容如下: ##-------------------------- ...

  3. MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】

    openssl创建私钥,获取公钥,创建证书都是比较简单的,就几个指令,很快就可以搞定,之所以说简单,是因为证书里面的基本参数配置不需要我们组装,只需要将命令行里面需要的几个参数配置进去即可.但是呢,用 ...

  4. MQTT研究之EMQ:【SSL证书链验证】

    1. 创建证书链(shell脚本) 客户端证书链关系: rootCA-->chainca1-->chainca2-->chainca3 ca caCert1 caCert2 caCe ...

  5. MQTT研究之EMQ:【EMQX使用中的一些问题记录(4)】

    最近比较忙,有些关于EMQ的使用问题,没有时间记录了,趁这个周末抽点时间,将最近遇到的,觉得比较有价值的一个问题,分享给大家吧. 这里是针对前面的一篇博客,做的一个深入研究,关于订阅系统总线判断设备上 ...

  6. MQTT研究之EMQ:【EMQX使用中的一些问题记录(1)】

    issue 1. EMQX的共享订阅 EMQX是一个非常强大的物联网通信消息总线,基于EMQX开展应用开发,要注意很多配置细节问题,这里要说到的就是共享订阅以及和cleanSession之间的关系问题 ...

  7. MQTT研究之EMQ:【EMQX使用中的一些问题记录(3)】

    EMQX功能强大,但是帮助信息或者可用资料的确有限,遇到个问题,比较难找到处理的头绪,今天,我要记录的是,使用中出现EMQX宕机,但是呢,启动也启动不了. 今天记录的内容,就以操作EMQX 3.2.3 ...

  8. MQTT研究之EMQ:【JAVA代码构建X509证书】

    这篇帖子,不会过多解释X509证书的基础理论知识,也不会介绍太多SSL/TLS的基本信息,重点介绍如何用java实现SSL协议需要的X509规范的证书. 之前的博文,介绍过用openssl创建证书,并 ...

  9. MQTT研究之EMQ:【基础研究】

    EMQ版本V2, emqttd-centos7-v2.3.11-1.el7.centos.x86_64.rpm 下载地址:http://emqtt.com/downloads/2318/centos7 ...

随机推荐

  1. The 2019 Asia Yinchuan First Round Online Programming F. Moving On

    t题目链接:https://nanti.jisuanke.com/t/41290 思路:题目意思很容易想到floyd,但是由于危险度的限制,我们该怎么跑floyd呢. 一开始理解错题目了,以为u-&g ...

  2. httprunner学习5-参数化与数据驱动

    前言 参数化是自动化测试离不开的话题,httprunner里面只要把上一篇声明变量学会了,参数化也就自然会了. 不同的地方在于声明变量时对应值只有一个,参数化是多个值,存放在list里面. httpr ...

  3. 大数据调度工具oozie详细介绍

    背景 之前项目中的sqoop等离线数据迁移job都是利用shell脚本通过crontab进行定时执行,这样实现的话比较简单,但是随着多个job复杂度的提升,无论是协调工作还是任务监控都变得麻烦,我们选 ...

  4. js动画--缓冲动画

    前面讲述的动画速度都是匀速的,现实生活中的运动速度的变化不一定是恒定的,存在一定的缓冲,就像火车进站一样,速度会越来越慢. 对于改变速度措施,其实只要将动画第一课的程序稍微的改变一下就可以了,我们来看 ...

  5. 《团队名称》第八次团队作业:Alpha冲刺day2

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十二 团队作业8-软件测试与ALPHA冲刺 团队名称 快活帮 作业学习目标 (1)掌握 ...

  6. 项目Beta冲刺(团队)--4/7

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺 团队名称:葫芦娃队 作业目标:进行新一轮的项目冲刺,尽力完成并完善项目 团队博客 队员学号 队员昵称 博客地址 04160242 ...

  7. 使用 application.properties 中配置的属性,举例:@Value("${server.port}")

    使用 application.properties 中配置的属性:@Value 注解. @RestController public class HelloWorldController { @Val ...

  8. 【转载】TCP协议

    首部格式 图释: 各个段位说明: 源端口和目的端口:各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现 序号:占 4 字节.TCP 连接中传送的数据流中的每一个 ...

  9. 兑换零钱-(dp)

    https://ac.nowcoder.com/acm/contest/910/B 本以为是组合数,没想到是dp求解,变成水题了,让我想起了第一次见到dp的爬楼梯,可以走一步和走两步,走40步,这里相 ...

  10. Codeforces Round #552 (Div. 3)-D-Walking Robot-(贪心)

    http://codeforces.com/contest/1154/problem/D 解题: 1.无光的时候优先使用太阳能电池. 2.有光的时候 (1)太阳能电池没满电,让它充,使用普通电池 (2 ...