• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

nodemcu-httpserver

Загрузил от сюда файлы https://github.com/Hoksmur/uLuaNode для запуска сервера,есть удобная настройка пароля и ssid. Вообщем загрузил все,веб сервер запустился,а вот страничка с настройками сети,как у автора не отображаются.Помогите,где может быть ошибка.Не могу я как то вникнуть в этот LUA.

Вот фото автора
 
Последнее редактирование:

Victor

Administrator
Команда форума
проверял прошивки старые тоже.Дело в том что мне нужен рабочий какой то пример,где я мог бы уже чего добавлять,чего убрать,да и изучать рабочий пример на много удобнее
 

Victor

Administrator
Команда форума
проверял прошивки старые тоже.Дело в том что мне нужен рабочий какой то пример,где я мог бы уже чего добавлять,чего убрать,да и изучать рабочий пример на много удобнее
У автора на гихабе написано
Now it is pre-pre-alpha, idea only
так что бросьте это, даже автор это бросил
 
Я всегда говорил себе что, чем разбираться в чужом коде,легче и быстрее самому написать все с нуля;)
 
Всем добрый день.Пытаюсь просканировать точки доступа,в ответ получаю nil.
Код:
<?lua
local scanresults = ""
function listap(t)
  res = "\n"
  for k,v in pairs(t) do
    res = res .. k .. " : " .. v .. "\n"
    scanresults = res
  end
  wifi.sta.getap(listap)
end    
?>

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<p><?lua print(scanresults)?></p>
</body>
</html>
файл pht,сервер нормально запускается.Подскажите,где допущена ошибка?
 
Последнее редактирование:

JustACat

Moderator
Команда форума
@Климатехник, эм, так а вы функцию listap объявили, но ни разу ее не вызвали в коде. Получается что в коде у вас объявляется переменная scanresults и далее по коду она так пустая и выводится (print)...
А, вижу, у вас вызов этой функции идет в ней же самой: wifi.sta.getap(listap) :)
Вам его бы перенести пониже на 1 строку:
Код:
<?lua
local scanresults = ""
function listap(t)
  res = "\n"
  for k,v in pairs(t) do
    res = res .. k .. " : " .. v .. "\n"
    scanresults = res
  end
end
wifi.sta.getap(listap)
?>
 
Попробовал,то же самое значение.Попробовал с обычным примером без работы сервера вот это
Код:
 function listap(t)
      for k,v in pairs(t) do
        print(k.." : "..v)
      end
    end
    wifi.sta.getap(listap)
скан получается,пробовал даже с одной переменной (k),чтобы выходило только одни ssid.
Пробую загнать в html страницу,результат nil.есть подозрения,что сервер не успевает обработать список ssid,и порт закрывается.Нужно как то указать серверу,что пока не получены данные,порт не закрывался бы
 

JustACat

Moderator
Команда форума
Климатехник, ну в любом случае на счет места расположения вызова - ошибка.
Далее, у меня такое предположение: вы пишете код, и он исполняется в таком же порядке.
Но судя по виду, функция wifi.sta.getap - не блокирующая. Это значит, что вызвав ее и передав ей ссылку на функцию callback код продолжает выполняться дальше.
И скорее всего у вас порядок получается такой:
1) объявили scanresults и положили в нее пусто
2) объявили функцию listap
3) вызвали сканирование сетей и ему приказали вызвать вашу listap по завершении сканирования
4) вывели пользователю весь html что у вас там далее расположен (включая то, что в scanresults - а в ней на этот момент пусто)
5) функция wifi.sta.getap отработала, вызвала вашу listap, которая положила в scanresults результаты, только они уже никому не нужны
Другими словами - некорректный порядок получается.
Вам нужно, чтобы у вас либо wifi.sta.getap работала в блокирующем режиме, либо выводить html уже из функции listap, чтобы это происходило только после получения точек, а не до.
 

Past

New member
Проблема только в том, что непонятно как передать в wifi.sta.getap сокет.
Можно попытаться периодически писать в глобальную переменную, что-то типа
Код:
aplist = nil

local function storelist(t)
 aplist = cjson.encode(t)
end

 wifi.sta.getap(storelist)
Но тогда высока вероятность, что размер aplist рано или поздно превысит node.heap()

Есть еще вариант :
Код:
local function storelist(t)
 file.remove("http/aplist.json")
 file.open("http/aplist.json","w")
 file.writeline(cjson.encode(t))
 file.close()]
end

 wifi.sta.getap(storelist)
Тут возникает проблема стабильности фс и количества циклов записи.
 

Victor

Administrator
Команда форума
Тут возникает проблема стабильности фс и количества циклов записи.
да нет по стабильности это нормальная ситуация, тем более что в ближайшем релизе NodeMCU будут устранены некоторые ошибки, возникающие при работе с файловой системой
а по количеству циклов нужно посчитать и прикинуть насколько это критино
 

nikolz

Well-known member
для информации (NODEMCU):
Время получения инфы с ESP на ком:
1) TCP клиент на ESP - 50 ms
2) UDP клиент на ESP - 24 ms
 

pvvx

Активный участник сообщества
да нет по стабильности это нормальная ситуация, тем более что в ближайшем релизе NodeMCU будут устранены некоторые ошибки, возникающие при работе с файловой системой
Давно пора. А то реализация примотанного туда spiffs у них ужасна. Никакой согласованности с реальными аппаратными характеристиками модуля (flash и самого ESP8266) и их возможностями.
 

nikolz

Well-known member
Вообще-то все работает стабильно,
если не будет утечки памяти.
Утечка памяти возникает при ошибках связи.
Устранять утечку в hhtp(tcp) сервере полностью не удается.
Даже при очень хорошей связи утекает примерно 1 k за 4 часа
Нет утечки (пока не обнаружил) при UDP.
 

nikolz

Well-known member
Скорость работы spiffs определяется алгоритмом работы с каталогами и файлами при ограниченном объеме свободной памяти.
Т е используют минимальный размер буфера .
Полагаю, что бы быстрее работала надо использовать другой софт вместо spiffs,
либо ждать когда разработчики spiffs ускорят ее работу.
 

nikolz

Well-known member
Исходники NodeMCU даны. Там всё и видно, что spiffs портирована кое как, впрочем как и lua.
Ну это-то понятно. Сейчас все так делают.
Но вот информация к размышлению:
dofile пустышки исполняется 0.18 сек.(размер пустышки 64 байта)
Это значит, что основное время ушло на поиск этого файла в файловой системе.
Т е эффективность работы с файлами не зависит от скорости железа а определяется в основном алгоритмом spiffs.
 
Пробовал подобные сервера,из проблем с heap,отказался от LUA совсем,если только температуру считать,или светиком поморгать и не более
 
Сверху Снизу