Код Lua, управляемый событиями веб-запроса

То, что я видел и в настоящее время реализовал в своих сценариях Lua, работающих на моем WiFi-модуле ESP8266, опрашивает страницу сервера каждые несколько секунд, а затем проверяет, изменилось ли значение или нет. Если значение изменилось, предпримите какие-либо действия.

Вот мой код

tmr.alarm(1,10000, 1, function()
    if (wifi.sta.getip() == nil) then
        print("IP unavaiable, Waiting...")
    else    
        tmr.stop(1)
        tmr.alarm(1,10000, 1, function() 
            event_driven_func() 
        end)
    end
end)

function event_driven_func()
    print("Inside event_driven_func function"..node.heap());
        conn = nil
        conn=net.createConnection(net.TCP,0)        
        conn:on("receive", function(conn, payload)
            -- local buf = "";
            startRead = false
            Data = ""
            print("payload : "..payload)
            for i = 1, #payload do
                c = payload:sub(i,i)
                if (c=="{") then
                    startRead=true
                end
                if (startRead) then
                    Data=Data..c
                end
                if (c=="}") then
                    startRead=false
                    print("json string detected Do something now ...");
                end     
            end     
            conn:close()
            collectgarbage("collect");
        end)

        conn:connect(80,"my_server.co.in")
        conn:on("connection", function(conn, payload)
            conn:send("GET /xyz.php HTTP/1.0\r\nHost: my_server.co.in\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n") 
        end)

end

Но это крайне неэффективно.

Как реализовать или улучшить псевдокод, код, управляемый событиями, где всякий раз, когда значение изменяется, происходит прерывание кода, а затем выполняется event_driven_func?

Или любой более эффективный способ.

Пример приложения:

Скажем, у меня есть количество подписчиков YouTube, отображаемых на странице сервера, всякий раз, когда подписчики меняются, он должен делать веб-запрос «POST» на одну из моих страниц json xyz.php (это будет сделано с использованием IFTTT), а затем событие будет выполняться функцию в коде Lua, чтобы это значение было отражено.


person aditgupta100    schedule 24.05.2017    source источник
comment
Извините, не понимаю проблемы. Однако все внутри event_driven_func(), кроме conn:connect(80,"my_server.co.in") (и распечатки), должно быть выполнено только один раз, нет необходимости делать это каждый раз.   -  person Marcel Stör    schedule 01.06.2017
comment
Если на сервере есть изменения, как я узнаю об этом, не устанавливая соединение снова и не выполняя conn:on(send) , conn:on(receive) снова и снова. Поэтому, чтобы избежать этой вещи, я хочу, чтобы она управлялась событиями.   -  person aditgupta100    schedule 06.06.2017
comment
Вы создаете объект соединения один раз, вы регистрируете обработчик приема один раз, вы регистрируете обработчик соединения один раз, а затем вызываете connect так часто, как хотите.   -  person Marcel Stör    schedule 06.06.2017
comment
Это дает мне ошибку, вызывая соединение снова, уже подключенное. Как я могу отключиться и снова подключиться. Кроме того, использование кучи одинаково в обоих случаях. Я думал, что использование кучи будет меньше, так как стек будет освобожден.   -  person aditgupta100    schedule 06.08.2017
comment
Итак, если бы вы могли заставить свой PHP-файл выдавать сообщение MQTT. У меня есть система домашней автоматизации, в которой нажатие кнопки выдает сообщение MQTT, а целевой переключатель анализирует его и включает/выключает свет. Мой ответ здесь: stackoverflow.com/questions/41776063/   -  person alok    schedule 01.11.2017