nodejs - почему сервер mosca публикует только что опубликованное сообщение клиента

Я делаю проект IoT, который использует mosca server, mqtt.js и express и jQuery для создания сети. Моя цель - сделать сайт, который может общаться с некоторыми встроенными платами, такими как Arduino, esp,...

Я хочу, чтобы сервер опубликовал "Hello World", когда я публикую какое-то сообщение на сервер. Но проблема в том, что когда я делаю это, сервер отправляет обратно "Hello World" и сообщение, которое я только что опубликовал.

Вот пример кода:

сервер москва

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 используя экспресс

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:

узел server.js

узел index.js

затем я нажал кнопку в моей сети, чтобы подключиться к mosca, а затем отправил ему сообщение "hello mqtt + mosca", но мне было отправлено 2 сообщения.

С сервера: привет mqtt + mosca

С сервера: Hello World

И я не ожидаю результата "привет mqtt + mosca". Как я могу запретить серверу публиковать обратно мне сообщение, которое я публикую на нем?

2 ответа

Решение

Короткий ответ - нет.

Если клиент подписывается на тему, он будет получать ВСЕ сообщения, опубликованные по этой теме, независимо от того, кто ее опубликовал.

Так работает MQTT.

При подключении к серверу можно установить параметры пользовательских данных, добавить некоторые уникальные данные для каждого клиента, вы получите эти данные в обработчике событий сообщения, установите базу условий на этих данных.

Другие вопросы по тегам