2016-12-12 7 views
0

ESP8266に基づくGeekcreit開発ボードから、MQTTクライアントを構築しようとしています。Lua MQTT publishはスクリプトからは機能しませんが、ESP8266の端末から動作します

PuTTYを使用してシリアル接続を介してコマンドを実行すると、すべて正常に動作し、メッセージは正常にパブリッシュされ、Raspberry Piで実行されているブローカーによって取得されます。

これをLuaスクリプトに追加して、init.lua経由で実行しようとしていますが、接続コールバックが発生しても公開は行われません。

--test.lua 
print("Setting up WIFI...") 
wifi.setmode(wifi.STATION) 
--modify according your wireless router settings 
wifi.sta.config("ap","pass") 
wifi.sta.connect() 
tmr.alarm(1, 1000, 1, function() 
    if wifi.sta.getip()== nil then 
    print("IP unavaiable, Waiting...") 
    else 
    tmr.stop(1) 
    print("Config done, IP is "..wifi.sta.getip()) 
    -- initiate the mqtt client and set keepalive timer to 120sec 
    m = mqtt.Client("myNodeName", 120, "", "") -- blank user and password 
    m:on("connect", function() print("connected") end) 
    m:connect("*.*.*.*") -- my local broker's IP 
    m:publish("topic/test", "7.2", 0, 0) -- no QoS, not retained 
    end 
end) 

私がアップロードしEsplorerを使用して、そのスクリプトを実行している、と私は言ったように、私は正常に「接続」というメッセージが表示さが、ないメッセージがブローカーに到着していないのです。

私は

m:publish("topic/test", "7.2", 0, 0) -- no QoS, not retained 

を取るとEsplorerのコマンドバーの「送信」から、それを発射した場合、ブローカはメッセージを受け取ります。

私はそれに苦しんでいます。どんな援助も感謝します

答えて

3

NodeMCU APIの他の多くの機能と同様に、mqtt.client:connect()は非同期です。つまりブロックしません。接続が正常に確立された場合にのみ公開できます。 mqtt.client:connect()にコールバック関数があります。

ローカルのmqtt_connectedフラグを使用してコールバック(またはm:on("connect"))に設定し、コールバックから直接接続または公開するまでタイマーを待機することもできます。

m:connect("192.168.11.118", 1883, 0, function(client) 
    // now publish through client 
end) 
+0

ありがとうございます。なぜ私は同じコールバックに出版を置くとは思わなかったのですか? – user3012475

関連する問題