diff --git a/webpage.lua b/webpage.lua new file mode 100644 index 0000000..222c4db --- /dev/null +++ b/webpage.lua @@ -0,0 +1,42 @@ +------------- +--- The webpage for the Webserver +function sendWebPage(conn,answertype) + collectgarbage() + if (ssid == nil) then + ssid="Not set" + end + if (sntpserverhostname == nil) then + sntpserverhostname="ptbtime1.ptb.de" + end + if (timezoneoffset == nil) then + timezoneoffset=1 + end + local buf="HTTP/1.1 200 OK\nServer: NodeMCU\nContent-Type: text/html\n\n" + if (node.heap() < 8000) then + buf = buf .. "

Busy, please come later again

" + else + buf = buf .. "" + buf = buf .. "WordClock Setup Page" + buf = buf .. "\n" + buf = buf .. "

Welcome to the WordClock

Please note that all settings are mandatory

" + buf = buf .."
" + buf = buf .."" + buf = buf .."" + buf = buf .."" + buf = buf .."" + buf = buf .."" + buf = buf .. "" + buf = buf .."
WIFI-SSIDSSID of the wireless network
WIFI-PasswordPassword of the wireless network
SNTP ServerServer to sync the time with. Only one ntp server is allowed.
Offset to UTC timeDefine the offset to UTC time in hours. For example +1 hour for Germany
" + if answertype==2 then + buf = buf .. "

New configuration saved" + elseif answertype==3 then + buf = buf .. "

ERROR" + elseif answertype==4 then + buf = buf .. "

Not all parameters set" + end + buf = buf .. "\n" + end + conn:send(buf) + buf=nil + collectgarbage() +end \ No newline at end of file diff --git a/webserver.lua b/webserver.lua index d5dc936..980bfa6 100644 --- a/webserver.lua +++ b/webserver.lua @@ -2,87 +2,82 @@ configFile="config.lua" - -function sendWebPage(conn,answertype) - collectgarbage() - if (ssid == nil) then - ssid="Not set" - end - if (sntpserverhostname == nil) then - sntpserverhostname="ptbtime1.ptb.de" - end - if (timezoneoffset == nil) then - timezoneoffset=1 - end - local buf="HTTP/1.1 200 OK\nServer: NodeMCU\nContent-Type: text/html\n\n" - if (node.heap() < 8000) then - buf = buf .. "

Busy, please come later again

" - else - buf = buf .. "" - buf = buf .. "WordClock Setup Page" - buf = buf .. "\n" - buf = buf .. "

Welcome to the WordClock

Please note that all settings are mandatory

" - buf = buf .."
" - buf = buf .."" - buf = buf .."" - buf = buf .."" - buf = buf .."" - buf = buf .."" - buf = buf .. "" - buf = buf .."
WIFI-SSIDSSID of the wireless network
WIFI-PasswordPassword of the wireless network
SNTP ServerServer to sync the time with. Only one ntp server is allowed.
Offset to UTC timeDefine the offset to UTC time in hours. For example +1 hour for Germany
" - if answertype==2 then - buf = buf .. "

New configuration saved" - elseif answertype==3 then - buf = buf .. "

ERROR" - elseif answertype==4 then - buf = buf .. "

Not all parameters set" - end - buf = buf .. "\n" - end - conn:send(buf) - buf=nil - collectgarbage() -end - function startWebServer() srv=net.createServer(net.TCP) srv:listen(80,function(conn) conn:on("receive", function(conn,payload) + if (payload:find("GET /") ~= nil) then --here is code for handling http request from a web-browser + + -- Load the webcontent + mydofile("webpage") + ssid, password, bssid_set, bssid = wifi.sta.getconfig() sendWebPage(conn,1) - conn:on("sent", function(conn) conn:close() end) + conn:on("sent", function(conn) + conn:close() + -- Clear the webpage generation + sendWebPage=nil + print("Clean webpage from RAM") + end) + + else if (payload:find("POST /") ~=nil) then --code for handling the POST-request (updating settings) _, postdatastart = payload:find("\r\n\r\n") --Next lines catches POST-requests without POST-data.... if postdatastart==nil then postdatastart = 1 end - postRequestData=string.sub(payload,postdatastart+1) + local postRequestData=string.sub(payload,postdatastart+1) local _POST = {} for i, j in string.gmatch(postRequestData, "(%w+)=([^&]+)&*") do _POST[i] = j end postRequestData=nil - if ((_POST.ssid~=nil) and (_POST.password~=nil) and (_POST.sntpserver~=nil) and (_POST.timezoneoffset~=nil)) then + + print("Inform user via Web") + if (sendWebPage == nil) then + print("Loading webpage ...") + -- Load the webcontent + mydofile("webpage") + end + + conn:on("sent", function(conn) + conn:close() + -- Clear the webpage generation + sendWebPage=nil + print("Clean webpage from RAM") + end) + + if ((_POST.ssid~=nil) and (_POST.password~=nil) and (_POST.sntpserver~=nil) and (_POST.timezoneoffset~=nil)) then + print("New config!") -- Safe configuration: file.remove(configFile .. ".new") - file.open(configFile.. ".new", "w") + sec, _ = rtctime.get() + file.open(configFile.. ".new", "w+") file.write("-- Config\n" .. "wifi.sta.config(\"" .. _POST.ssid .. "\",\"" .. _POST.password .. "\")\n" .. "sntpserverhostname=\"" .. _POST.sntpserver .. "\"\n" .. "timezoneoffset=\"" .. _POST.timezoneoffset .. "\"\n") + file.write("print(\"Config from " .. sec .. "\")\n") file.close() + sec=nil file.remove(configFile) + print("Rename config") if (file.rename(configFile .. ".new", configFile)) then + print("Successfully") dofile(configFile) -- load the new values + print("New Config loaded") sendWebPage(conn,2) -- success + else + print("Error") sendWebPage(conn,3) -- error end + else ssid, password, bssid_set, bssid = wifi.sta.getconfig() sendWebPage(conn,4) -- not all parameter set end - conn:on("sent", function(conn) conn:close() end) + else --here is code, if the connection is not from a webbrowser, i.e. telnet or nc global_c=conn