| timerID = "timeout" |
| --timerID = "interval" |
| |
| function trace(text) |
| local f = io.open("websocket.trace", "a") |
| f:write(os.date() .. " - " .. text .. "\n") |
| f:close() |
| end |
| |
| function iswebsocket() |
| return mg.lua_type == "websocket" |
| --return pcall(function() |
| -- if (string.upper(mg.request_info.http_headers.Upgrade)~="WEBSOCKET") then error("") end |
| --end) |
| end |
| |
| trace("called with Lua type " .. tostring(mg.lua_type)) |
| |
| if not iswebsocket() then |
| trace("no websocket") |
| mg.write("HTTP/1.0 403 Forbidden\r\n") |
| mg.write("Connection: close\r\n") |
| mg.write("\r\n") |
| mg.write("forbidden") |
| return |
| end |
| |
| |
| -- Serialize table to string |
| function ser(val) |
| local t |
| if type(val) == "table" then |
| for k,v in pairs(val) do |
| if t then |
| t = t .. ", " .. ser(k) .. "=" .. ser(v) |
| else |
| t = "{" .. ser(k) .. "=" .. ser(v) |
| end |
| end |
| t = t .. "}" |
| else |
| t = tostring(val) |
| end |
| return t |
| end |
| |
| -- table of all active connection |
| allConnections = {} |
| |
| -- function to get a client identification string |
| function who(tab) |
| local ri = allConnections[tab.client].request_info |
| return ri.remote_addr .. ":" .. ri.remote_port |
| end |
| |
| -- Callback to accept or reject a connection |
| function open(tab) |
| allConnections[tab.client] = tab |
| trace("open[" .. who(tab) .. "]: " .. ser(tab)) |
| return true -- return true to accept the connection |
| end |
| |
| -- Callback for "Websocket ready" |
| function ready(tab) |
| trace("ready[" .. who(tab) .. "]: " .. ser(tab)) |
| mg.write(tab.client, "text", "Websocket ready") |
| mg.write(tab.client, 1, "-->h 180"); |
| mg.write(tab.client, "-->m 180"); |
| senddata() |
| if timerID == "timeout" then |
| mg.set_timeout("timer()", 1) |
| elseif timerID == "interval" then |
| mg.set_interval("timer()", 1) |
| end |
| return true -- return true to keep the connection open |
| end |
| |
| -- Callback for "Websocket received data" |
| function data(tab) |
| trace("data[" .. who(tab) .. "]: " .. ser(tab)) |
| senddata() |
| return true -- return true to keep the connection open |
| end |
| |
| -- Callback for "Websocket is closing" |
| function close(tab) |
| trace("close[" .. who(tab) .. "]: " .. ser(tab)) |
| mg.write("text", "end") |
| allConnections[tab.client] = nil |
| end |
| |
| function senddata() |
| local date = os.date('*t'); |
| local hand = (date.hour%12)*60+date.min; |
| |
| mg.write("text", string.format("%u:%02u:%02u", date.hour, date.min, date.sec)); |
| |
| if (hand ~= lasthand) then |
| mg.write(1, string.format("-->h %u", hand*360/(12*60))); |
| mg.write( string.format("-->m %u", date.min*360/60)); |
| lasthand = hand; |
| end |
| |
| if bits and content then |
| data(bits, content) |
| end |
| end |
| |
| function timer() |
| trace("timer") |
| senddata() |
| if timerID == "timeout" then |
| mg.set_timeout("timer()", 1) |
| else |
| return true -- return true to keep an interval timer running |
| end |
| end |
| |