Skip to content

Commit 5584228

Browse files
authored
Merge pull request #3 from krancorp/termin2
Termin2
2 parents 613c5fa + 51ec151 commit 5584228

File tree

4 files changed

+175
-39
lines changed

4 files changed

+175
-39
lines changed

fridge-sensor/fridge-sensor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@ func main() {
8383
if err != nil {
8484
fmt.Println(msg, err)
8585
}
86-
time.Sleep(time.Second * 1)
86+
time.Sleep(time.Second * 5)
8787
}
8888
}

fridge-server/fridge-server.go

Lines changed: 147 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,32 @@ import (
66
"net"
77
"os"
88
"io"
9+
"io/ioutil"
910
"strings"
1011
"strconv"
1112
"sort"
13+
"time"
1214
)
13-
15+
var lastEntries []string
16+
func init(){
17+
18+
}
1419
/* A Simple function to verify error */
1520
func CheckError(err error) {
1621
if err != nil {
1722
fmt.Println("Error: " , err)
1823
os.Exit(0)
1924
}
25+
2026
}
2127

22-
func readConfig (path string) (m map[string]int) {
28+
func readConfig (path string) (m map[string]int, tableHeader string) {
2329
//Open File
2430
file, err := os.Open(path)
2531
CheckError(err)
2632
defer file.Close()
27-
2833
m = make(map[string]int)
29-
34+
s := make([]string, 4)
3035
//Start Reading..
3136
reader := bufio.NewReader(file)
3237
for {
@@ -36,10 +41,19 @@ func readConfig (path string) (m map[string]int) {
3641
}
3742
CheckError(err)
3843
key := strings.TrimSpace(line)
44+
s = append(s, key)
3945
m[key] = 0
4046
}
47+
//do some work on the html
48+
sort.Strings(s)
49+
tableHeader = "<tr> <th>Zeitstempel</th>"
50+
for i := range s{
51+
if(len(s[i])>0){
52+
tableHeader += "<th>"+s[i]+"</th>"
53+
}
54+
}
55+
tableHeader += "</tr>"
4156
return
42-
4357
}
4458

4559
func msgDigest(c chan string, m map[string]int) {
@@ -51,27 +65,73 @@ func msgDigest(c chan string, m map[string]int) {
5165
key := msgStr[0]
5266
value, err := strconv.Atoi(msgStr[1])
5367
if (err != nil) {
54-
fmt.Println("recieved bad msg 0")
68+
fmt.Println("received bad msg")
5569
fmt.Println(msg)
5670
continue
5771
}
5872

5973
if _, ok := m[key]; ok {
6074
m[key] = value
61-
printStock(m)
75+
genHTMLBody(m)
6276
} else {
63-
fmt.Println("recieved bad msg")
77+
fmt.Println("received bad msg")
6478
fmt.Println(msgStr)
6579
continue
6680
}
6781
} else {
68-
fmt.Println("recieved bad msg")
82+
fmt.Println("received bad msg")
6983
fmt.Println(msgStr)
7084
continue
7185
}
7286
}
7387
}
7488

89+
func startUdpServer(fridgeStock map[string]int){
90+
port := ":8080"
91+
fmt.Println("Preparing UDP-Server...")
92+
// Lets prepare an address at any address at port
93+
ServerAddr,err := net.ResolveUDPAddr("udp", port)
94+
CheckError(err)
95+
96+
fmt.Println("Listening on ", GetLocalIP(), port)
97+
/* Now listen at selected port */
98+
ServerConn, err := net.ListenUDP("udp", ServerAddr)
99+
CheckError(err)
100+
defer ServerConn.Close()
101+
102+
messages := make(chan string)
103+
go msgDigest(messages,fridgeStock)
104+
105+
buf := make([]byte, 1024)
106+
107+
for {
108+
n,_,err := ServerConn.ReadFromUDP(buf)
109+
CheckError(err)
110+
messages <- string(buf[0:n])
111+
112+
}
113+
}
114+
func genHTMLBody(m map[string]int){
115+
var keys []string
116+
keys = append(keys, " %%<tr> <td>" + time.Now().Format("2006-01-02 15:04:05")+"</td>")
117+
for k := range m {
118+
v := strconv.Itoa(m[k])
119+
keys = append(keys, k + " %% <td>"+ v +"</td>")
120+
}
121+
sort.Strings(keys)
122+
tableRow := ""
123+
for v := range keys {
124+
splitStr := strings.Split(keys[v], "%%")
125+
tableRow += splitStr[1]
126+
}
127+
tableRow += "</tr>"
128+
if(len(lastEntries) >= 40){
129+
//throw away eldest entry
130+
lastEntries = lastEntries[1:]
131+
}
132+
lastEntries = append(lastEntries, tableRow)
133+
return
134+
}
75135
func printStock(m map[string]int){
76136
var keys []string
77137
for k := range m {
@@ -82,6 +142,77 @@ func printStock(m map[string]int){
82142
fmt.Println(keys)
83143
}
84144

145+
const http404 string = "HTTP/1.1 400 Bad Request \r\nContent-Length: 50\r\nContent-Type: text/html\r\n\r\n<html><body><h1>400 Bad Request</h1></body></html>"
146+
const http408 string = "HTTP/1.1 408 Request Time-out \r\nContent-Length: 55\r\nContent-Type: text/html\r\n\r\n<html><body><h1>408 Request Time-out</h1></body></html>"
147+
148+
type htmlRenderer func() []byte
149+
150+
func handleWebRequest(conn net.Conn, tableHeader string, method string, subUrl string, rend htmlRenderer){
151+
// Make a buffer to hold incoming data.
152+
buf := make([]byte, 1024)
153+
// Read the incoming connection into the buffer.
154+
_, err := conn.Read(buf)
155+
if err != nil {
156+
fmt.Println("Error reading:", err.Error())
157+
}
158+
request := string(buf)
159+
//check if message is a complete http request, else start timeout
160+
retry, timeout := 0, 5
161+
for !strings.Contains(request,"\r\n\r\n"){
162+
_, err := conn.Read(buf)
163+
if err != nil {
164+
fmt.Println("Error reading:", err.Error())
165+
}
166+
request = string(buf)
167+
if(retry >= timeout){
168+
conn.Write([]byte(http408))
169+
conn.Close()
170+
return
171+
}
172+
time.Sleep(time.Second * 1)
173+
retry++
174+
}
175+
requestLines := strings.Split(request,"\r\n")
176+
177+
//check if the request is valid
178+
if(!strings.Contains(strings.ToUpper(requestLines[0]), method +" "+ subUrl +" HTTP/1.1")){
179+
conn.Write([]byte(http404))
180+
conn.Close()
181+
return
182+
}
183+
184+
rendHtml := rend()
185+
httpHeader := "HTTP/1.1 200 OK \r\nContent-Length: "+strconv.Itoa(len(rendHtml))+"\r\nContent-Type: text/html\r\n\r\n"
186+
conn.Write(append([]byte(httpHeader), rendHtml ...))
187+
conn.Close()
188+
}
189+
190+
191+
func startHttpServer(fridgeStock map[string]int, tableHeader string){
192+
//Web-interface in the making
193+
fmt.Println("Starting Http-Server")
194+
ln, err := net.Listen("tcp", ":80")
195+
196+
CheckError(err)
197+
for {
198+
conn, err := ln.Accept()
199+
CheckError(err)
200+
go handleWebRequest(conn, tableHeader, "GET", "/STOCK", func () []byte {
201+
// Combine the HTML fragments
202+
fh, _ := ioutil.ReadFile("./stock_head")
203+
ff, _ := ioutil.ReadFile("./stock_foot")
204+
bth := []byte(tableHeader)
205+
f := append(fh, bth...)
206+
for i := len(lastEntries)-1; i>=0; i--{
207+
btc := []byte(lastEntries[i])
208+
f = append(f, btc...)
209+
}
210+
f = append(f, ff...)
211+
return f
212+
})
213+
}
214+
}
215+
85216
func GetLocalIP() string {
86217
addrs, err := net.InterfaceAddrs()
87218
if err != nil {
@@ -99,33 +230,11 @@ func GetLocalIP() string {
99230
}
100231

101232
func main() {
102-
103-
port, configPath := ":8080","./config.json"
104-
105-
fmt.Println("Reading Config...")
106-
fridgeStock := readConfig(configPath)
107-
108-
fmt.Println("Preparing Server...")
109-
/* Lets prepare a address at any address at port */
110-
ServerAddr,err := net.ResolveUDPAddr("udp", port)
111-
CheckError(err)
112-
113-
114-
fmt.Println("Listening on port ", GetLocalIP(), port)
115-
/* Now listen at selected port */
116-
ServerConn, err := net.ListenUDP("udp", ServerAddr)
117-
CheckError(err)
118-
defer ServerConn.Close()
119-
120-
messages := make(chan string)
121-
go msgDigest(messages,fridgeStock)
122-
123-
buf := make([]byte, 1024)
124-
125-
for {
126-
n,_,err := ServerConn.ReadFromUDP(buf)
127-
CheckError(err)
128-
messages <- string(buf[0:n])
129-
130-
}
233+
configPath := "./config.json"
234+
fridgeStock, tableHeader := readConfig(configPath)
235+
block := make(chan bool)
236+
go startUdpServer(fridgeStock)
237+
go startHttpServer(fridgeStock, tableHeader)
238+
<- block
131239
}
240+

fridge-server/stock_foot

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
</table>
2+
</body>
3+
</html>

fridge-server/stock_head

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!DOCTYPE html>
2+
<html lang="de">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="refresh" content="5">
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<style>
8+
body {font-family: "Comic Sans MS", "Comic Sans", TSCu_Comic, cursive;}
9+
table, th, td {
10+
border: 1px solid black;
11+
border-collapse: collapse;
12+
padding: 2px 5px 2px 5px;
13+
}
14+
td{
15+
text-align:center;
16+
vertical-align:middle;
17+
}
18+
</style>
19+
20+
<title>SmartFridge!</title>
21+
</head>
22+
<body>
23+
<table>
24+

0 commit comments

Comments
 (0)