ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. AlsPro

    AlsPro Нерд

    Спасибо! Я воспользовался примером с этой темы и переделал сервер.
    Теперь обмен данными проходит, но только один первый раз(

    Код (C++):
    sv = net.createServer(net.TCP)

    function receiver(sck, data)
        print(data)
        local function closec()
            sck:close()
        end
        local function send()
            sck:send("hello world")
        end
        sck:on("sent", closec)
        send()
    end

    if sv then
      sv:listen(80, function(conn)
        conn:on("receive", receiver)
       
      end)
    end
     
    Последнее редактирование: 29 ноя 2019
  2. AlsPro

    AlsPro Нерд

    Отвечу сам себе)) Оказывается, функцией srv:connect(80,"192.168.4.1") вызывается весь процесс обмена данными. Не надо повторно выполнять "receive" "connection" итд
     
    ИгорьК нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Не знаю, что Вы там делаете, но изготавливать сервер и клиент на двух ESP - это тупиковый путь. Есть вещи,которые просто лучше не делать и все.

    Для интернета вещей, который и обслуживает ESP, придуман mqtt, вокруг которого и следует строить любую экосистему.

    Поэтому Вы здесь практически мало что найдете на тему клиент/сервер на этом железе.
    Да, запросы на сервера по их протоколам и правилам я делаю, а вот поднимать свой сервер на ESP-8266 ни разу не приходилось. Ибо смысла не вижу.
    ИМХО.
     
    Последнее редактирование: 29 ноя 2019
  4. AlsPro

    AlsPro Нерд

    Давайте я расскажу кратенько задачу. У меня есть кнопки и сервер к ним. Кто вперед нажмет кнопку - тот молодец. Все кнопки цепляются к серверу на esp8266 в своей локальной wifi сети, которую создает сервер как точка доступа. Кнопки с обратной связью, кто успел первый - та кнопка загорается. Весь проект сделан и написал на arduino. Но работает немного не так как хочется. В частности бывают тормоза в передаче данных, бывает кнопки отваливаются. Я хочу переписать все на LUA. Написал частично - все работает быстрее чем на arduino. Вот такая задача.
     
  5. ИгорьК

    ИгорьК Гуру

    Ну, как игрушка, вполне годится. Здорово. Lua работает очень стабильно.
    Я ни одного сервера на ESP не сделал, ибо как-то не применимо в хозяйстве.

    Но если кнопок будет много, боюсь и здесь начнутся проблемы. По ощущениям. Ибо железо все таки не для серверов, и об этом прямо говорится в документации. Ссылку я здесь уже где-то приводил.
     
  6. AlsPro

    AlsPro Нерд

    сейчас 4 кнопки. Максимум будет 5 наверное. Посмотрим, как оно будет. Такой интересный вопрос можно еще спросить? А как я могу, и могу ли вообще в любой момент времени послать данные с сервера клиенту? Или только по запросу клиента получить данные?
     
  7. ИгорьК

    ИгорьК Гуру

    Насколько мне известно, это технология websocket:
    https://nodemcu.readthedocs.io/en/master/modules/websocket/

    Но ESP поддерживает лишь ее клиентскую часть, если говорить о Lua, так что сервер надо делать на чем-то другом. Лучше - на Малине, там информации и спецов на эту тему туча.
     
  8. AlsPro

    AlsPro Нерд

    Напишу свои выводы. Полностью переписал код с ардуино на Луа.
    Плюсы - более простое написание кода, производительность просто в разы выше
    Минусы - при активном использовании сервер теряет wi-fi подключение. 3 раза что-то случалось с прошивкой только за время тестов. Пришлось перешивать модули. Сохраненные настройки (номера) становились недоступны 1 раз и приходилось перенастраивать устройство.
    С ардуино прошивкой проект проработал год. Медленно, но без глюков. Тут же за несколько дней куча ньюансов.
    Может я что-то делаю не так?
     
    Последнее редактирование: 6 дек 2019
  9. ИгорьК

    ИгорьК Гуру

    Уверен, что написав код впервые, вы сделали все мастерски. Это Lua - отстой.
     
  10. ИгорьК

    ИгорьК Гуру

    Тут все зависит от того, как написана обработка событий. Ни одна операция (обработка события) не должна занимать процессор больше чем на 15 мс
     
    Последнее редактирование: 6 дек 2019
  11. ИгорьК

    ИгорьК Гуру

    Это из области "очевидное- невероятное", если "само"
     
  12. za9c

    za9c Нуб

    что значит - "блокировать процессор больше чем на 15 мс"???? и как понять блокировать? чем можно его заблокировать?

    local x = 1;
    while x > 0 do
    x=x+1;
    end
    или как?
     
  13. ИгорьК

    ИгорьК Гуру

    Хороший вопрос. Ответ на него поищите в теме. Мне повторяться не хочется. Достаточно изучить оглавление чтобы найти ответ.
     
  14. parovoZZ

    parovoZZ Гуру

    так быть не может в принципе. Это означает только одно - код до этого был просто не оптимально написан.
     
  15. ИгорьК

    ИгорьК Гуру

    Я не утверждаю что Lua быстрее чем Си, но, в частности, так очень может быть, особенно в этом случае.
     
  16. ИгорьК

    ИгорьК Гуру

    @parovoZZ, опять абстракции... Ну почему на борде ты пишешь конкретные вещи, а здесь - выдаешь за истину свои представления. Неужели за печеньку?

    Вот я тебе объясняю, что Lua - написан на Си.
    То есть, это тот же Си как библиотека. В Lua есть "улучшайзеры" Си, типа таблиц, в первую очередь. Там, где идет очень удобная работа с ними - там все замедляется. Ибо очень большая библиотека.

    А там, где идут простейшие вещи, типа работа сервер/клиент - все зависит от той же Си-реализации.
    А поскольку ардуино библиотеки перетачиваются под ESP, а Lua, уже давно-давно пишутся именно под ESP (Lua для ESP появился минимум на год раньше, но это тот же Си!) - запросто могут возникать тормоза.

    Кроме того, НАВЕРНЯКА, ардуино библиотеки принудительно "ломают" (прерывают) ардуино-код для обеспечения работы wifi, дабы ардуинщик не думал о такой фигне. В Lua этого нет, написал обработку события больше 15 мс - получил падение wifi. Но зато нет "надстройки", которая обеспечивает это в Ардуино за счет тормозов.

    Объяснил, @parovoZZ ?

    А теперь ты объясняй.
     
    Последнее редактирование: 6 дек 2019
    issaom нравится это.
  17. ИгорьК

    ИгорьК Гуру

    Типа так (не блокировать), запустите, посмотрите:

    Код (Lua):

    do
        local x = 0
        local frec
        frec = function()
            print('\nx =',x, 'mem after x =', node.heap())
            x = x + 1
            tmr.create():alarm(20, 0, frec)
        end

        local y = 0
        local srec
        srec = function()
            print('y =', y, 'mem after y =', node.heap())
            y = y + 1
            tmr.create():alarm(20, 0, srec)
        end
        frec()
        srec()
    end
     
    За одно посмотрите на свой код, тоже ведь интересно:

    Код (Lua):
    do
        local x = 1;
        while x > 0 do
            print('\nx =',x, 'mem after x =', node.heap())
            x=x+1;
        end
    end
    Оба кода выполняют одно и то же, прибавляют единицу к переменной и печатают результат. Ну мой еще в два потока.

    Но мой работает бесконечно и еще wifi держит, а ваш может досчитать где-то до 400.
     
    Последнее редактирование: 6 дек 2019
  18. SergeiL

    SergeiL Оракул Модератор

    Да не, проверял, ардуино под ESP.
    И по WDT перезапускается и WiFi начинает глючить, если специально блокировать.
    А если стараться нормально писать, моск включая - все очень быстро и надежно работает.
     
  19. ИгорьК

    ИгорьК Гуру

    Да я ничего не утверждаю, в отличие от @parovoZZ
     
  20. ИгорьК

    ИгорьК Гуру

    Ну кроме того очевидного факта, что Lua для ESP старше Ардуино и есть сама по себе Си.