Ubuntu Mosquitto 代理 websocket 不工作

Posted

技术标签:

【中文标题】Ubuntu Mosquitto 代理 websocket 不工作【英文标题】:Ubuntu Mosquitto broker websocket is not working 【发布时间】:2021-04-15 20:43:34 【问题描述】:

我是 IoT 和 MQTT 通信协议的新手。我正在尝试通过 Websockets 从我的 Vue Web 应用程序连接在 Amazon Ec2 上运行的代理。我已经开始使用蚊子了:

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,我尝试过各种 mosquitto 版本。当前版本是:1.6.7。

我的客户或经纪人有什么问题吗?我该如何解决这个问题?

【问题讨论】:

分享你的 mosquitto 配置文件和你用来连接的代码会让你更有可能获得帮助。因为您要求我们猜测您是如何设置它以及如何使用它的。 请在问题中包含实际代码,而不是指向第 3 方网站的链接。 您的 connect() 调用显示“mqtt://xx.xx.xx.xx”,但您的问题是关于 websockets,即“ws://xx.xx.xx.xx " 查看 Steve 的基于 WebSockets 的 MQTT 互联网指南:steves-internet-guide.com/mqtt-websockets 【参考方案1】:

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();   

正如你所见,client.end() 总是会在 publish() 被调用时被调用。如果您只想发布两次,则需要将 2 条语句包装在大括号中(这不是 python 中空格有意义的地方)

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

你真的应该正确缩进你的所有代码,这样会更容易阅读和发现这样的错误。

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

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

【讨论】:

以上是关于Ubuntu Mosquitto 代理 websocket 不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu 16上搭建sock5代理服务器,如何实现用户名和密码的设置以防止被别人使用?

Mosquitto安装_Ubuntu/Debian上安装消息队列Mosquitto

Ubuntu 16.04安装测试MQTT Mosquitto

通过 mosquitto 了解 MQTT协议

mosquitto mqtt 代理不会向订阅者发送超过 20 个发布数据包

使用 Paho MQTT Js 成功连接到 Mosquitto 代理后突然断开连接