2016-04-16 2 views
1

У меня есть проблемы со следующим кодом Lua на качестве ESP8266 ...MQTT/ESP8266/NodeMCU/Lua код не публикует

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 

код успешно вызывается со следующими ...

-- 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 

Использование ESPlorer я вижу следующее ...

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()... 

Так что в основном входит sendData(...) и я вижу, выход из линии ...

print("Attempting client connect...") 

... но я никогда не видел протоколирование в m:connect(...) блоке, такие как ...

print("Connected to MQTT") 

... кажется, он просто возвращает немедленно.

Брокер MQTT - это малина Pi, работающая на Mosquitto, и я тестировал ее с помощью приложений на своем телефоне и планшете Android. Я получаю успешную публикацию/подписку между телефоном и планшетом в обоих направлениях.

Я новичок в Lua и понимаю только основы MQTT, и я не понимаю, что случилось с блоком m:connect(...), если кто-то может помочь в этом.

UPDATE: PROBLEM SOLVED - Извините, что не вернусь к этой теме раньше. Проблема была просто до версии Mosquitto, над которой я работал на моем RPi (который соответствовал MQTT v3.1). Библиотека MQTT NodeMCU поддерживает MQTT v3.1.1 и НЕ обратная совместимость. В сущности, в моем коде не было очень плохо, хотя я внес некоторые изменения - это было просто несовместимо с версиями MQTT.

+0

Я предполагаю, что ваша попытка подключения не срабатывает, поэтому ничего не происходит. Чего вы ожидаете? – Piglet

+0

Вы решили это, закрыл дело? –

+0

@ MarcelStör: Я добавил обновление/комментарий к концу моего оригинального вопроса, объясняющего причину проблемы. Спасибо за попытку помочь. Я изменил свой код на основе ваших предложений, но мне пришлось «очистить» мой RPi, чтобы заставить загрузить более новую версию Mosquitto, чтобы заставить все работать. – Squonk

ответ

0

Ваш код отлично выглядит. Если m: connect fail ничего не произойдет, поскольку вы не предоставили функцию обратного вызова для неудачных попыток подключения.

Также вы не проверяете возвращаемое значение m: connect для успеха.

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

И проверьте, если ваша попытка не удается установить соединение.

+0

Согласовано, имеет смысл, что я * СЛЕДУЕТ * предоставлять различные обратные вызовы, но, опять же, мое понимание новичком Lua - это то, что удерживает меня, поскольку я действительно не понимаю, как это сделать. Я попробую с «неудачным» обратным вызовом, чтобы узнать, могу ли я получить причину и сузить проблему. Моя основная проблема заключалась в том, что код был сломан, но если вы считаете, что все в порядке, проблема может быть в стороне Wi-Fi или таймауте. – Squonk

+1

вы можете просто поместить вызов m: connect в print(), чтобы увидеть, что он возвращает. – Piglet

+0

Спасибо, что не произошло со мной, но не печатает ничего, кроме пустой строки. Я также попробовал пример inline-m: connect из страницы nodemcu mqtt doc, предоставляющей встроенные подключенные/сбойные функции, и ни один из них не вызывается. Начиная с удивления, если моя nodemcu сборка сломана, хотя я на 99,99% уверен, что я включил библиотеку MQTT, когда я сделал последнюю сборку ... Я должен проверить. – Squonk

1

Вы не сказали нам, какую версию NodeMCU вы используете. Предупреждение: НЕ используйте любые предварительно созданные файлы 0.9.x, доступные по адресу https://github.com/nodemcu/nodemcu-firmware/releases. Создайте собственную прошивку по http://nodemcu.readthedocs.io/en/dev/en/build/.

Я всегда помогаю отключить функцию отказа и использовать все доступные функции обратного вызова. Я могу подтвердить следующие работы на почти 2 месяца старой прошивкой от dev ветви отправки данных в cloudmqtt.com:

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 

Отличия:

  • m:connect определяет безопасный у/п и autoreconnect г/п в явном виде. Это всегда меня смущает, если задано только подмножество всех необязательных параметров.Является ли ваш 0 в m:connect интерпретируется как secure или как autoreconnect? Я не очень хорошо знаю Lua, чтобы понять, почему я правильно его кодирую.
  • Используйте дополнительный обратный вызов для функции неудачных попыток подключения. См. http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#connection-failure-callback-reason-codes для кодов причины сбоя.
  • НЕ используйте одно и то же имя для переменных в функциях обратного вызова, используемых в «родительских» функциях. Обратите внимание, как вы используете m:connect(..., function(conn), а затем внутри этой функции вы снова используете m:publish(..., function(conn). Вы не взаимодействуете с объектом conn в своем коде, поэтому никакого вреда не наносится. Однако это может укусить вас в других проектах.
Смежные вопросы