nodejs - 为什么 mosca 服务器发布回客户端刚刚发布的消息
nodejs - why mosca server publish back a message client just published
我正在制作一个使用 mosca 服务器、mqtt.js 和 express 以及 jQuery 制作网络的物联网项目。我的目的是制作一个可以与 Arduino、esp 等嵌入式板通信的网站...
当我向服务器发布消息时,我希望服务器返回 'Hello World'。但问题是当我这样做时,服务器发回 'Hello World' 和 我刚刚发布的消息。
示例代码如下:
服务器 mosca
var mosca = require("mosca");
var settings = {
http: {
port: 8080,
bundle: true,
static: './'
}
};
var server = new mosca.Server(settings);
server.on('clientConnected', function(client) {
console.log('client ' + client.id+ ' connect');
});
server.on('clientDisconnected', function(client) {
console.log('client ' + client.id+ ' disconnect');
});
// fired when a packet is send from server and is received from client
server.on('published', function(packet, client) {
// console.log('Published', packet);
if(typeof packet.payload == "object"){
console.log(packet);
console.log("From Client(Buffer) : "+ packet.payload.toString());
var mesFromServer = {
topic:packet.topic,
payload:"Hello World",
qos:0,
retain:false
};
server.publish(mesFromServer,client);
}
});
server.on('ready', setup);
// fired when the mqtt server is ready
function setup() {
console.log('Mosca server is up and running');
}
client.js 使用 mqtt.js
$(document).ready(function(){
$("#btnConnect").click(function(){
$("#Connect-loader").css("display","inline");
var client = mqtt.connect({ host: 'localhost', port:8080 });
client.on('connect', function () {
if(client.connected)
{
$("#Connect-loader").css("display","none");
$("#btnConnect").prop("disabled",true);
$("#btnDisconnect").prop("disabled",false);
$("#connect-notification").html("Server connected");
$("#connect-notification").css("color","green");
}
});
client.on('message', function (topic, message,packet) {
// message is Buffer
console.log(packet);
$("#txtDataFromServer").val($("#txtDataFromServer").val()+"From Server: " + message.toString()+"\n");
});
client.on('close',function(){
$("#btnConnect").prop("disabled",false);
$("#btnDisconnect").prop("disabled",true);
$("#connect-notification").html("Server disconnected");
$("#connect-notification").css("color","red");
});
$("#btnSend").click(function(){
var topic = $("#txtTopic").val();
var mess = $("#txtMessage").val();
if(topic != "" && mess !=""){
client.subscribe(topic);
client.publish(topic,mess,{qos:0,retain:false});
}
});
$("#btnDisconnect").click(function(){
client.end();
});
});
});
index.js 使用 express
var express = require("express");
var app = express();
app.use(express.static("public"));
app.use(express.static("node_modules"));
app.set("view engine","ejs");
app.set("views","./views");
var server = require("http").createServer(app);
server.listen(8000);
app.get("/",function(req,res){
res.render("home");
});
我启动服务器 mosca 和 index.js:
node server.js
node index.js
然后我在我的网站上点击了一个按钮来连接到 mosca,然后向它发送了一条消息 'hello mqtt + mosca',但它发回了 2 条消息。
From Server: hello mqtt + mosca
From Server: Hello World
而且我不希望结果 'hello mqtt + mosca'。如何防止服务器将我发布给它的消息发回给我?
简短的回答是你不知道。
如果客户端订阅了一个主题,它将收到在该主题上发布的所有消息,无论是谁发布的。
这就是 MQTT 的工作原理。
连接到服务器时可以设置用户数据选项,为每个客户端添加一些唯一的数据,您将在消息事件处理程序中获取这些数据,根据这些数据设置条件。
我正在制作一个使用 mosca 服务器、mqtt.js 和 express 以及 jQuery 制作网络的物联网项目。我的目的是制作一个可以与 Arduino、esp 等嵌入式板通信的网站...
当我向服务器发布消息时,我希望服务器返回 'Hello World'。但问题是当我这样做时,服务器发回 'Hello World' 和 我刚刚发布的消息。
示例代码如下:
服务器 mosca
var mosca = require("mosca");
var settings = {
http: {
port: 8080,
bundle: true,
static: './'
}
};
var server = new mosca.Server(settings);
server.on('clientConnected', function(client) {
console.log('client ' + client.id+ ' connect');
});
server.on('clientDisconnected', function(client) {
console.log('client ' + client.id+ ' disconnect');
});
// fired when a packet is send from server and is received from client
server.on('published', function(packet, client) {
// console.log('Published', packet);
if(typeof packet.payload == "object"){
console.log(packet);
console.log("From Client(Buffer) : "+ packet.payload.toString());
var mesFromServer = {
topic:packet.topic,
payload:"Hello World",
qos:0,
retain:false
};
server.publish(mesFromServer,client);
}
});
server.on('ready', setup);
// fired when the mqtt server is ready
function setup() {
console.log('Mosca server is up and running');
}
client.js 使用 mqtt.js
$(document).ready(function(){
$("#btnConnect").click(function(){
$("#Connect-loader").css("display","inline");
var client = mqtt.connect({ host: 'localhost', port:8080 });
client.on('connect', function () {
if(client.connected)
{
$("#Connect-loader").css("display","none");
$("#btnConnect").prop("disabled",true);
$("#btnDisconnect").prop("disabled",false);
$("#connect-notification").html("Server connected");
$("#connect-notification").css("color","green");
}
});
client.on('message', function (topic, message,packet) {
// message is Buffer
console.log(packet);
$("#txtDataFromServer").val($("#txtDataFromServer").val()+"From Server: " + message.toString()+"\n");
});
client.on('close',function(){
$("#btnConnect").prop("disabled",false);
$("#btnDisconnect").prop("disabled",true);
$("#connect-notification").html("Server disconnected");
$("#connect-notification").css("color","red");
});
$("#btnSend").click(function(){
var topic = $("#txtTopic").val();
var mess = $("#txtMessage").val();
if(topic != "" && mess !=""){
client.subscribe(topic);
client.publish(topic,mess,{qos:0,retain:false});
}
});
$("#btnDisconnect").click(function(){
client.end();
});
});
});
index.js 使用 express
var express = require("express");
var app = express();
app.use(express.static("public"));
app.use(express.static("node_modules"));
app.set("view engine","ejs");
app.set("views","./views");
var server = require("http").createServer(app);
server.listen(8000);
app.get("/",function(req,res){
res.render("home");
});
我启动服务器 mosca 和 index.js:
node server.js
node index.js
然后我在我的网站上点击了一个按钮来连接到 mosca,然后向它发送了一条消息 'hello mqtt + mosca',但它发回了 2 条消息。
From Server: hello mqtt + mosca
From Server: Hello World
而且我不希望结果 'hello mqtt + mosca'。如何防止服务器将我发布给它的消息发回给我?
简短的回答是你不知道。
如果客户端订阅了一个主题,它将收到在该主题上发布的所有消息,无论是谁发布的。
这就是 MQTT 的工作原理。
连接到服务器时可以设置用户数据选项,为每个客户端添加一些唯一的数据,您将在消息事件处理程序中获取这些数据,根据这些数据设置条件。