2016-04-16 13 views
1

Ich habe ein Problem mit dem folgenden Lua Code auf einem Esp8266 ...MQTT/Esp8266/NodeMCU/Lua Code nicht veröffentlichen

function sendData(humidity,temperature) 
    -- Setup MQTT client and events 
    print("sendData() entered") 
    print("Setting up mqtt.Client...") 
    m = mqtt.Client(mqtt_client_id, 120, username, password) 
    print("Attempting client connect...") 
    m:connect(mqtt_broker_ip , mqtt_broker_port, 0, function(conn) 
     print("Connected to MQTT") 
     print(" IP: " .. mqtt_broker_ip) 
     print(" Port: " .. mqtt_broker_port) 
     print(" Client ID: " .. mqtt_client_id) 
     print(" Username: " .. mqtt_username) 

     payload = "Temp: " .. temperature .. " Hmdy: " .. humidity 
     m:publish("pt/env",payload, 0, 0, function(conn) 
      print("Going to deep sleep for " .. (DSLEEPTIME/1000) .. " seconds") 
      node.dsleep(DSLEEPTIME*1000,4)    
     end) 
    end) 
end 

Der Code erfolgreich mit dem folgenden ...

aufgerufen wird
-- Connect to network 
wifi.setmode(wifi.STATION) 
wifi.setphymode(wifi_signal_mode) 
wifi.sta.config(wifi_SSID, wifi_password) 
wifi.sta.connect() 

print("Attempting to connect...") 
ip = wifi.sta.getip() 
if ip ~= nil then 
    print("Got IP: " .. ip) 
    print("About to call sendData()...") 
    sendData(humidity, temperature) 
    print("Returned from sendData()...") 
end 

Mit esplorer ich sehe die folgenden ...

Attempting to connect... 
Attempting to connect... 
Attempting to connect... 
Attempting to connect... 
Attempting to connect... 
Attempting to connect... 
Got IP: 192.168.0.39 
About to call sendData()... 
sendData() entered 
Setting up mqtt.Client... 
Attempting client connect... 
Returned from sendData()... 

Also im Grunde geht es sendData(...) und ich sehe, die Ausgabe von der Linie ...

print("Attempting client connect...") 

... aber ich habe nie die Protokollierung im m:connect(...) Block sehen wie ...

print("Connected to MQTT") 

... es scheint, es einfach sofort zurück.

Der MQTT-Broker ist ein Raspberry Pi mit Mosquitto und ich habe es mit Apps auf meinem Android-Handy und Tablet getestet. Ich erhalte ein erfolgreiches Publishing/Abonnement zwischen Telefon und Tablet in beiden Richtungen.

Ich bin ein Lua Novize und verstehe nur die Grundlagen von MQTT und ich bin ratlos, was mit dem m:connect(...) Block falsch ist, wenn jemand helfen kann, würde es geschätzt werden.

UPDATE: PROBLEM gelöst - Entschuldigung dafür, nicht früher zu diesem Thread zurück zu kommen. Das Problem war einfach auf die Version von Mosquitto zurückzuführen, die ich auf meinem RPi ausgeführt hatte (was MQTT v3.1 entsprach). Die NodeMCU MQTT-Bibliothek unterstützt MQTT v3.1.1 und ist NICHT abwärtskompatibel. Im Wesentlichen war mein Code nicht sehr falsch, obwohl ich einige Änderungen vorgenommen habe - es war einfach auf MQTT-Versionen inkompatibel.

+0

Ich denke, Ihr Verbindungsversuch schlägt fehl, so dass nichts passiert. Was erwartest du zu passieren? – Piglet

+0

Haben Sie es gelöst, Fall geschlossen? –

+0

@ MarcelStör: Ich habe ein Update/Kommentar am Ende meiner ursprünglichen Frage hinzugefügt, die die Ursache des Problems erklärt. Danke, dass Sie versucht haben zu helfen - ich habe meinen Code basierend auf Ihren Vorschlägen geändert, aber ich musste meinen RPi 'säubern', um den Download einer neueren Version von Mosquitto zu erzwingen, damit die Dinge funktionieren. – Squonk

Antwort

0

Ihr Code sieht gut aus. Wenn m: connect fehlschlägt, passiert nichts, da Sie keine Rückruffunktion für fehlgeschlagene Verbindungsversuche bereitstellen.

Sie überprüfen auch nicht den Rückgabewert von m: connect für Erfolg.

Siehe http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#mqttclientconnect

Und überprüfen Sie, ob Ihr Verbindungsversuch fehlschlägt.

+0

Einverstanden, es macht Sinn, dass ich die verschiedenen Callbacks * SOLLTE *, aber auch hier ist mein Anfänger-Verständnis von Lua, was mich zurückhält, da ich nicht wirklich verstehe, wie ich es mache. Ich versuche es mit einem 'fehlgeschlagenen' Rückruf, um zu sehen, ob ich den Grund dafür finde und das Problem eingrenzen kann. Mein Hauptanliegen war der Code war kaputt, aber wenn Sie denken, dass es in Ordnung ist, dann kann das Problem in der WLAN-Seite der Dinge oder eine Zeitüberschreitung sein. – Squonk

+1

Sie könnten einfach den Aufruf von m: connect in einen print() einfügen, um zu sehen, was zurückgegeben wird. – Piglet

+0

Danke - das war mir nicht aufgefallen, aber es druckt nichts anderes als eine leere Zeile. Ich habe auch das 'inline' 'm: connect' Beispiel von der nodemcu mqtt doc Seite ausprobiert, die inline connected/failed Funktionen bietet und keine aufgerufen werden. Ich frage mich, ob mein nodemcu-Build kaputt ist, obwohl ich zu 99.99% sicher bin, dass ich die MQTT-Bibliothek beim letzten Build mitgeschickt habe ... Das muss ich überprüfen. – Squonk

1

Sie haben uns nicht mitgeteilt, welche NodeMCU-Version Sie verwenden. Warnung: Verwenden Sie keines der vorinstallierten 0.9.x-Binärdateien, die unter https://github.com/nodemcu/nodemcu-firmware/releases verfügbar sind. Erstellen Sie Ihre eigene Firmware gemäß http://nodemcu.readthedocs.io/en/dev/en/build/.

Ich helfe immer, eine fehlerhafte Funktion zu entfernen und alle verfügbaren Rückruffunktionen zu verwenden. Ich kann die folgenden Arbeiten auf einer fast 2 Monate alte Firmware aus dem dev Zweig bestätigt Daten cloudmqtt.com Senden:

function sendData(humidity, temperature) 
    print("Setting up mqtt.Client...") 
    m = mqtt.Client("SO-36667049", 120, "user", "password") 
    print("Attempting client connect...") 
    m:connect("m20.cloudmqtt.com", 12703, 0, 0, 
     function(conn) 
      print("Connected to MQTT") 
      payload = "Temp: " .. temperature .. " Hmdy: " .. humidity 
      m:publish("topic", payload, 0, 0, 
       function(client) 
        print("Message sent") 
       end) 
     end, 
     function(client, reason) 
      print("Connection failed, reason: " .. reason) 
     end) 
end 

Unterschiede:

  • m:connect definieren sicher j/n und autoreconnect y/n ausdrücklich. Es verwirrt mich immer, wenn nur eine Teilmenge aller optionalen Parameter gesetzt ist.Wird Ihr 0 in m:connect interpretiert als secure oder als autoreconnect? Ich kenne Lua nicht gut genug, um zu erklären, warum ich es explizit programmiere.
  • Verwenden Sie den zusätzlichen Rückruf für die Funktion für fehlgeschlagene Verbindungsversuche. Fehlercodes siehe http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#connection-failure-callback-reason-codes.
  • Verwenden Sie NICHT denselben Namen für Variablen in Callback-Funktionen wie in "Eltern" -Funktionen. Beachten Sie, wie Sie m:connect(..., function(conn) verwenden und dann innerhalb dieser Funktion wieder m:publish(..., function(conn) verwenden. Sie interagieren nicht mit dem conn Objekt in Ihrem Code, also kein Schaden angerichtet. Dies kann Sie jedoch bei anderen Projekten stören.