Javascript MQTT.js(mosqutio代理)-我多次收到相同的消息

Javascript MQTT.js(mosqutio代理)-我多次收到相同的消息,javascript,angular,mqtt,Javascript,Angular,Mqtt,我有两份申请。我多次收到相同的信息 例如: app1->user_1编写消息:“我需要帮助”主题:演示 app2->显示聊天列表 app2->user_2打开列表中的聊天并订阅主题:demo,现在可以与user_1对话 app2用户_2 我需要帮助 我需要帮助 我需要帮助 我需要帮助 我需要帮助 似乎连接被创建了好几次。 似乎订阅和发布不同的主题也不起作用。附录1: let client = mqtt.connect('http://127.0.0.1:9001', {

我有两份申请。我多次收到相同的信息

例如:

  • app1->user_1编写消息:“我需要帮助”主题:演示
  • app2->显示聊天列表
  • app2->user_2打开列表中的聊天并订阅主题:demo,现在可以与user_1对话
app2用户_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});
  }
在浏览器控制台中: 连通真 连通真 连通真 连通真 连通真 连通真 连通真

如果您要发布和订阅同一主题,则您的邮件必须包含一个标识符,该标识符允许您在邮件总是返回给您时过滤掉已发布的邮件

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

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


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

注意:如果你订阅了与你发布的主题相同的主题,你将收到自己的消息。这听起来像是某种循环,但是,由于您的代码示例没有
client.publish()
,因此我们无法帮助您。
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
}