MQTT.js (mosquitto broker) - 我多次收到相同的消息

MQTT.js (mosqutio broker) - I get the same message several times

我有两个应用程序。我多次收到相同的消息。

例如:

app2 user_2

似乎创建了几次连接。 似乎订阅和发布到不同的主题也不起作用。应用程序 1:

   let client = mqtt.connect('http://127.0.0.1:9001', {
      clientId: "front-client",
      username: "admin",
      password: "admin",
    });
    client.on('connect', (topic) => {
      client.subscribe(this.topic, (err) => {
        if (!err) {}
      });
    });
    this.mqttClient = client;
    //handle incoming messages
    client.on('message', (topic, message, packet) => {
      this.showMessageFromMqtt(message);
    });
  }
  sendMsgByMqtt(message: string) {
    this.mqttClient.publish(this.topic + '/MSG', message, {retain: true});
  }

App2:
  configureMqttChannel() {
    let client = mqtt.connect('http://127.0.0.1:9001', {
      clientId: "front-client-angular",
      username: "admin",
      password: "admin"
    });
    // console.log("connected flag:  " + client.connected);
    client.on('connect', (topic) => {
      // console.log("connected  " + client.connected);
      client.subscribe(this.topic + '/MSG', (err) => {
        if (!err) {
          // console.log('message sent by mqtt')
          // client.publish(this.topic, '', {retain: true})
        }
      });
    });
    this.mqttClient = client;

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

  sendMsgByMqtt(message: string) {
    this.mqttClient.publish(this.topic, message, {retain: true});
  }

在浏览器控制台中: 连接正确 连接正确 连接正确 连接正确 连接正确 连接正确 连接正确 ......

如果您要发布和订阅相同的主题,那么您的消息必须包含一个标识符,以便您可以过滤掉您已发布的消息,当它们总是返回给您时。

这方面的一个例子是(伪代码):

const MY_IDENTIFIER = generateSomeIdentifierUniqueToThisClient();

publish({
   identifier:MY_IDENTIFIER,
   data: // the actual content of your message
});

handleIncoming = data => {
  // this was a message you sent
  if(data.identifier === MY_IDENTIFIER) return;

  // handle it
}

另一种解决方案是发布 demo/someUniqueClientIdentifier 并订阅演示/+

当您收到一条消息时,您可以使用主题名称来查看它来自哪个客户端并以这种方式将其过滤掉 - 与上述完全相同的变体。