2017-09-07 38 views
1

我上CloudMQTT運行代理收到同一消息的倍數和我的JS代碼如下所示:MQTT.js訂閱從

var mqtt_url = URL.parse('mqtt://m10.cloudmqtt.com:15272' || 'mqtt://localhost:1883'); 
var auth = (mqtt_url.auth || ':').split(':'); 
var url = "mqtt://" + mqtt_url.host; 

var options = { 
    port: mqtt_url.port, 
    clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8), 
    username: USERNAME, 
    password: PASSWORD, 
}; 

// Create a client connection 
var client = mqtt.connect(url, options); 

client.on('connect', function() { // When connected 

    // subscribe to a topic 
    client.subscribe('relay', function() { 
    // when a message arrives, do something with it 
    client.on('message', function(topic, message, packet) { 
     // console.log(packet); 
     console.log("Received '" + message + "' on '" + topic + "'"); 
    }); 
    }); 

    // subscribe to a topic 
    client.subscribe('photoresistor', function() { 
    // when a message arrives, do something with it 
    client.on('message', function(topic, message, packet) { 
     console.log("Received '" + message + "' on '" + topic + "'"); 
    }); 
    }); 

    // publish a message to a topic 
    client.publish('relay', value, function() { 
    console.log("Message of ", value, " is published"); 
    // client.end(); // Close the connection when published 
    }); 

}); 

我有我的ESP8266迷上了光敏電阻,它出版光敏電阻值爲photoresistor,每5秒一次。

那麼,我每5秒鐘就會在我的節點服務器(MeteorJS)上得到四個相同的控制檯日誌。

I20170907-19:33:51.421(-4)? Received '156' on 'photoresistor' 
I20170907-19:33:51.423(-4)? Received '156' on 'photoresistor' 
I20170907-19:33:51.424(-4)? Received '156' on 'photoresistor' 
I20170907-19:33:51.425(-4)? Received '156' on 'photoresistor' 
I20170907-19:33:57.741(-4)? Received '39' on 'photoresistor' 
I20170907-19:33:57.742(-4)? Received '39' on 'photoresistor' 
I20170907-19:33:57.743(-4)? Received '39' on 'photoresistor' 
I20170907-19:33:57.743(-4)? Received '39' on 'photoresistor' 
I20170907-19:34:05.465(-4)? Received '37' on 'photoresistor' 
I20170907-19:34:05.467(-4)? Received '37' on 'photoresistor' 
I20170907-19:34:05.468(-4)? Received '37' on 'photoresistor' 
I20170907-19:34:05.470(-4)? Received '37' on 'photoresistor' 
I20170907-19:34:10.665(-4)? Received '161' on 'photoresistor' 
I20170907-19:34:10.667(-4)? Received '161' on 'photoresistor' 
I20170907-19:34:10.667(-4)? Received '161' on 'photoresistor' 
I20170907-19:34:10.668(-4)? Received '161' on 'photoresistor' 

任何想法可能導致client.subscribe功能或CloudMQTT對同一消息的輸出倍數?

+0

您是否使用其他客戶端(例如mosquitto_sub)檢查是否有多個消息正在發佈? – hardillb

+0

你有沒有到過這個底部?我看到完全相同的問題。有任何想法嗎? –

回答

0

看起來在某些情況下,訂閱連接事件處理程序內部可能會導致重複訂閱。 mqtt.js release 2.9.0解決了這種性質的問題,如所述。 因此,升級到最新的mqtt.js版本(目前是2.13.1)可能會解決您的問題。

但是,請注意,mqtt.js usage notes指出「從v2.0.0開始,訂閱在重新連接時會恢復,如果clean:true」。另見here。如果是這樣的話,您似乎根本不需要在連接事件處理程序中進行訂閱,這應該有望避免首先發生重複訂閱。

您應該可以測試上述假設,只需在您的node.js客戶端連接時重新啓動CloudMQTT代理即可。這是否會導致您開始看到重複的消息?如果是這樣,我相信補救措施的確是簡單地將您的訂閱移到連接事件處理程序之外。