我想使用带有HTTPS的Web套接字在Web浏览器上运行mqtt客户端.使用HTTP,我没有问题.以下是使用HTTP时Web浏览器上的代码.
<script>
var client = mqtt.connect( 'wss://127.0.0.1:3000', {username:'test_user', password:'test_password'} );
client.subscribe("mqtt/test");
client.on("message", function(topic, payload) {
alert([topic, payload].join(": "));
client.end();
});
client.publish("mqtt/test", "testing hello world!");
</script>
Run Code Online (Sandbox Code Playgroud)
这就是我启动独立的mosca代理以在websockets上使用HTTPS的方法.
mosca --very-verbose --key ./tls-key.pem --cert ./tls-cert.pem --credentials ./credentials.json --https-port 3000 --https-bundle --https-static ./ | pino
Run Code Online (Sandbox Code Playgroud)
我应该如何在浏览器上更改我的mqtt客户端代码以通过HTTPS连接到websockets上的Mosca代理?
我创建了一个简单的经纪人:
var mosca = require("mosca");
var settings = {
port: 1883,
};
var server = new mosca.Server(settings);
server.on("ready", function () {
console.log("ready");
});
Run Code Online (Sandbox Code Playgroud)
当我运行文件时出现此错误:
/home//Documents/mqtt/node_modules/jsonschema/lib/validator.js:107
throw new SchemaError('Expected `schema` to be an object or boolean');
^
SchemaError: Expected `schema` to be an object or boolean
at Validator.validate (/home//Documents/mqtt/node_modules/jsonschema/lib/validator.js:107:11)
at Object.validate (/home//Documents/mqtt/node_modules/mosca/lib/options.js:264:26)
at new Server (/home//Documents/mqtt/node_modules/mosca/lib/server.js:104:34)
at Object.<anonymous> (/home//Documents/mqtt/broker.js:16:14)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47 {
schema: undefined …Run Code Online (Sandbox Code Playgroud) Mosca 给出了这个错误:
TypeError: Client is not a constructor
at new KafkaAscoltatore (/home/x/Desktop/broker/node_modules/mosca/node_modules/ascoltatori/lib/kafka_ascoltatore.js:59:26)
at Object.build (/home/x/Desktop/broker/node_modules/mosca/node_modules/ascoltatori/lib/ascoltatori.js:77:12)
at /home/x/Desktop/broker/node_modules/mosca/lib/server.js:181:40
at makeCall (/home/x/Desktop/broker/node_modules/fastseries/series.js:117:7)
at ResultsHolder.release (/home/x/Desktop/broker/node_modules/fastseries/series.js:96:9)
at series (/home/x/Desktop/broker/node_modules/fastseries/series.js:39:14)
at Object.series (/home/x/Desktop/broker/node_modules/steed/steed.js:90:7)
at new Server (/home/x/Desktop/broker/node_modules/mosca/lib/server.js:171:9)
at Object.<anonymous> (/home/x/Desktop/broker/broker.js:118:14)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
Run Code Online (Sandbox Code Playgroud)
我打开/home/x/Desktop/broker/node_modules/mosca/node_modules/ascoltatori/lib/kafka_ascoltatore.js
并查看下面的行后发现问题与 kafka-node 版本有关:
this._opts.kafka = this._opts.kafka || require("kafka-node");
Run Code Online (Sandbox Code Playgroud)
当我删除时this._opts.kafka,它开始正常工作。然后我打印了两个我发现新版本中没有 Client …
我正在尝试使用下面的包实现一个带有TLS的node.js mqtt客户端;
https://www.npmjs.com/package/mqtt#client
没有TLS运行mqtt客户端的代码如下:
var mqtt = require('mqtt')
var client = mqtt.connect('mqtt://test.mosquitto.org')
client.on('connect', function () {
client.subscribe('presence')
client.publish('presence', 'Hello mqtt')
})
client.on('message', function (topic, message) {
// message is Buffer
console.log(message.toString())
client.end()
})
Run Code Online (Sandbox Code Playgroud)
如何修改上述代码以在mqtt客户端上使用TLS?
使用以下命令,mosca MQTT代理作为独立运行;
mosca --key ./tls-key.pem --cert ./tls-cert.pem --http-port 3000 --http-bundle --http-static ./ | pino
Run Code Online (Sandbox Code Playgroud) 我计划使用Mosca或Mosquitto代理(因为它们是开源代码),以实现具有消息队列复制的可扩展体系结构,以避免在代理最终失败时丢失代理尚未提供的消息.
正如我所读到的,mosquitto是一种成熟且非常稳定的解决方案,具有使用桥接器的水平可扩展性.但我找不到任何插件将消息写入数据库(所有代理通用),所以我认为这是一个限制,因为如果我们有两个代理负载平衡,其中一个死,然后所有的消息在经纪人恢复之前,经纪人无法交付.另一方面,Mosca允许我们使用Redis进行扩展,如果代理1死亡,那么broker2仍然可以传递消息,因为它们存储在公共数据库中.通过这种方式,我可以使用redis的主从配置来避免单点故障.
所以我的问题是:
1)mosca是生产的好选择吗?
2)是否可以使用redis分配带mosquitto的消息队列?