Ubuntu Mosquitto代理websocket不工作

Ubuntu Mosquitto代理websocket不工作,websocket,mqtt,mosquitto,Websocket,Mqtt,Mosquitto,我是物联网和MQTT通信协议的新手。我正在尝试通过Websockets从我的Vue web应用程序连接在Amazon Ec2上运行的代理。我从以下几点开始mosquitto: root@ip-xxx-xx-xx-xx:~# mosquitto -c /etc/mosquitto/conf.d/default.conf 1618518468: mosquitto version 1.6.7 starting 1618518468: Config loaded from /etc/mosquitto

我是物联网和MQTT通信协议的新手。我正在尝试通过Websockets从我的Vue web应用程序连接在Amazon Ec2上运行的代理。我从以下几点开始mosquitto:

root@ip-xxx-xx-xx-xx:~# mosquitto -c /etc/mosquitto/conf.d/default.conf
1618518468: mosquitto version 1.6.7 starting
1618518468: Config loaded from /etc/mosquitto/conf.d/default.conf.
1618518468: Opening ipv4 listen socket on port 1883.
1618518468: Opening ipv6 listen socket on port 1883.
1618518468: Opening websockets listen socket on port 9001.
/etc/mosquitto/conf.d/default.conf文件包含:

listener 1883 
protocol mqtt 
allow_anonymous true 

listener 9001 
protocol websockets 
allow_anonymous true
我的测试js文件是:

var mqtt = require('mqtt');
var count =0;
var client  = mqtt.connect("mqtt://xx.xxx.xxx.xxx",{clientId:"mqttjs01"});
console.log("connected flag  " + client.connected);

//handle incoming messages
client.on('message',function(topic, message, packet){
    console.log("message is "+ message);
    console.log("topic is "+ topic);
});


client.on("connect",function(){ 
console.log("connected  "+ client.connected);

})
//handle errors
client.on("error",function(error){
console.log("Can't connect" + error);
process.exit(1)});
//publish
function publish(topic,msg,options){
console.log("publishing",msg);

if (client.connected == true){
    
client.publish(topic,msg,options);

}
count+=1;
if (count==2) //ens script
    clearTimeout(timer_id); //stop timer
    client.end();   
}

//////////////


var options={
retain:true,
qos:1};
var topic="acs";
var message="test message";
var topic_list=["topic2","topic3","topic4"];
var topic_o={"topic22":0,"topic33":1,"topic44":1};
console.log("subscribing to topics");
client.subscribe(topic,{qos:0}); //single topic
client.subscribe(topic_list,{qos:1}); //topic list
client.subscribe(topic_o); //object
var timer_id=setInterval(function(){publish(topic,message,options);},5000);
//notice this is printed even before we connect
console.log("end of script");

但我得到了一个错误:

New client connected from 176.xxx.xxx.xx as mqttjs01 (p2, c1, k60).
1618518546: Socket error on client mqttjs01, disconnecting.
我已经安装了libwebsockets,并尝试了各种mosquito版本。当前版本为:1.6.7


我的客户或经纪人有什么问题吗?如何修复此问题?

publish()
函数的末尾,if语句缺少大括号,因此它不会执行您认为它会执行的操作

function publish(topic,msg,options){
console.log("publishing",msg);

if (client.connected == true){
    
client.publish(topic,msg,options);

}
count+=1;
if (count==2) //ens script
    clearTimeout(timer_id); //stop timer
    client.end();   
}
让我们修正压痕,以便我们能看得更清楚

function publish(topic,msg,options){
  console.log("publishing",msg);

  if (client.connected == true){  
    client.publish(topic,msg,options);
  }

  count+=1;
  if (count==2) //ens script
    clearTimeout(timer_id); //stop timer
  
  client.end();   
}
如您所见,调用
publish()
时,将始终调用
client.end()
。如果只想发布两次,则需要将这2条语句用大括号括起来(这不是python中空格有意义的地方)

您真的应该适当地缩进所有代码,这样可以更容易地阅读和发现这样的错误

正如@JDAllen提到的,您没有使用WebSocket连接,除非此代码在浏览器中运行,在浏览器中,沙箱将强制它成为WebSocket连接,即使您在URL中指定
mqtt://
作为架构,并且您必须包含端口号才能使其实际连接。e、 g

ws://xxx.xxx.xxx.xxx:9001

共享您的MOSQUITO配置文件和用于连接的代码将使您更有可能获得帮助。因为您要求我们猜测您是如何设置它的,以及您是如何使用它的。请在问题中包含实际代码,而不是指向第三方网站的链接。您的connect()调用显示“mqtt://xx.xx.xx.xx,但您的问题是关于WebSocket的,即“ws://xx.xx.xx.xx”查看Steve关于WebSockets上MQTT的互联网指南:谢谢,它成功了!
ws://xxx.xxx.xxx.xxx:9001