2016-10-21 5 views
1

ディアーズ、 に応答していません。 ADC、enduser_setup、ファイル、GPIO、HTTP、MQTT、ネット、ノード、OW、PWM、TMR、UART、無線LANキープアライブタイマーは、私がnodemcu上esp8266ビルドにMQTTを使用しようとしています

バージョン:によって供給私は現在、カスタムビルドを使用(https://nodemcu-build.com/index.php

モジュールを使用していますLuaははWH、)だから私は(connect_to_mqtt_brokerを呼び出しています、プログラムの初期化時にSDK 1.5.1(e67da894)

function connect_to_mqtt_broker() 


    print("Connecting to broker...") 
    m:connect(BROKER, PORT, 0, 1, function(client) 
            print("connected") 
            print("["..tmr.time().."(s)] - Client connected to broker: "..BROKER) 
            m:subscribe(SUB_TOPIC,0, function(conn) 
             print("Subscribed to "..SUB_TOPIC.." topic") 
             led(0,204,0,150) 
            end) 
            m:publish(PUB_TOPIC,"Hello from: "..node.chipid()..RESTART_REASON,0,0, function(conn) 
             print("sent") 
            end) 
            end, 
            function(client, reason) 
            print("failed reason: "..reason) 
            end) 

end 

---MQTT client--- 
print("--------------> Create mqtt clinet") 
--set up MQTT client 
-- init mqtt client with keepalive timer 120sec 
m = mqtt.Client("ESP"..node.chipid(), KEEP_ALIVE_TMR, USER, PASSWORD) 
m:lwt(PUB_TOPIC, "offline", 0, 0) 
m:on("offline", function(conn) 
     print("["..tmr.time().."(s)] - Mqtt client gone offline") 

end) 
m:on("message", function(conn, topic, data) 
     --receive_data(data, topic) 
     print("Data received: "..data) 
     led(200,50,50,30) 
     receive_data(data, topic) 
     led(0,204,0,150) 
end) 

に5.1.4私は完璧に働いており、私は購読してトピックに公開することができます。

問題は、キープアライブタイマーが正しくないということです。例をあげて説明しましょう。私はKEEP_ALIVE_TMR = 120sを設定し、esp8266がmqttブローカに正常に接続された後、私はルータ上のwifiを無効にして秒数をカウントし始めます。 KEEP_ALIVE_TMRによるとオフラインイベント:

m:on("offline", function(conn) 
     print("["..tmr.time().."(s)] - Mqtt client gone offline") 

end) 

は私が無効のWiFiを持った瞬間から、正確に120秒を発射する必要がありますが、いくつかの未知の理由のために、これは発生しません。通常、イベントは約10〜15分後に発生します。 私はこの遅れの理由を理解するのに苦労しています。 この奇妙なことが起こる理由はありますか?

+0

は、以下の答えをしようとしましたか? – cagdas

答えて

0

autoreconnectフラグが設定されているときも同じ問題が発生しました。このフラグは、ブローカ間の接続のオフラインイベントの実行を中断します。あなたがオン/オフあなたのMQTTブローカーを回すことによってあなたのテストを行う場合

m:connect(BROKER, PORT, 0, function(client) 
0

を、それが動作します:

そのデフォルトである0、autoreconnectを設定せずに、それを試してみてください。しかしあなたのwifi接続を切り替えることではなく、それはnodemcuのmqttライブラリの問題です。

Wi-Fi切断では、mqttのオフライン/切断イベントはありません。ここでは、接続のウォッチドッグを追加することで回避策になります。

tmr.alarm(1, 3000, 1, function() 
    if wifi.sta.getip() == nil then 
    --mark as mqtt restart needed 
    restart = true 
else 
    -- wifi reconnect detected then restart mqtt connections 
    if restart == true then 
    --reset flag, clean object, init for a new one 
    restart = false 
    m = nil 
    mqtt_init() 
    connect() 
    end 
end 
end) 

Here it is the full code example

関連する問題