You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PAHO JavaScript无法建立多个MQTT连接问题求助

问题根源与解决方案

你的问题核心是所有客户端使用了同一个固定的Client ID:"mybro"。根据MQTT协议规范,Broker会强制断开相同Client ID的旧连接,只允许最新的连接保持在线,这就是第二个客户端连接时第一个被踢掉的原因。

解决步骤

1. 生成唯一Client ID

每次创建MQTT客户端实例时,生成一个独一无二的Client ID,避免冲突。可以用随机字符串、UUID,或者结合浏览器会话标识来生成。

2. 修改代码实现

调整客户端初始化逻辑,替换固定的Client ID为动态生成的唯一值:

// 生成唯一Client ID的函数
function generateUniqueClientId() {
  // 前缀+随机字符串,确保唯一性
  return "web-client-" + Math.random().toString(36).substring(2, 10);
}

// 每次连接时创建新的客户端实例(用唯一ID)
function connectMqtt(){
  console.log("connecting to mqtt ...");
  // 动态生成唯一Client ID
  var client = new Paho.MQTT.Client("192.168.5.100", 9880, "/", generateUniqueClientId());
  
  try {
    client.connect({
      timeout: 3,
      onSuccess: function() {
        try {
          client.subscribe("shellies/#");
          client.subscribe("openWB/#");
          console.log("Connected!");  
        } catch (error) {
          console.log(error);
        }
      },
      useSSL: false,
      userName: "user",
      password: "password",
      keepAliveInterval: 30, 
      reconnect: true // 开启自动重连,比手动setTimeout更可靠
    });
  } catch (error) {
    console.log(error);
  }
  
  client.onConnectionLost = function(responseObject) {
    if (responseObject.errorCode !== 0) {
      console.log("onConnectionLost:"+responseObject.errorMessage);
    }
  };
  
  client.onMessageArrived = function(message) {
    setDataToGui(message.destinationName, message.payloadString);
  };
}

关键说明

  • 唯一Client ID:generateUniqueClientId函数生成的ID足够避免大部分冲突,如果需要更严谨的唯一性,可以使用现代浏览器支持的crypto.randomUUID()。
  • 自动重连:将reconnect设为true,PAHO客户端会自动处理重连逻辑,比手动用setTimeout更符合MQTT客户端的规范实现。
  • 客户端实例作用域:把client变量放在connectMqtt函数内部,确保每次连接都创建新的实例,避免旧实例的状态干扰。

内容的提问来源于stack exchange,提问作者user1912399

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:31:31