From a3d5d7390d883c734ac65d778927a3afdb70307e Mon Sep 17 00:00:00 2001 From: Timo Volkmann Date: Wed, 25 Nov 2020 20:30:01 +0100 Subject: [PATCH] refactored cmd & server --- cmd/server/server.go | 133 ++------------------------------- cmd/server_only/server_only.go | 25 +++++++ net/net.go | 132 ++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 128 deletions(-) create mode 100644 cmd/server_only/server_only.go create mode 100644 net/net.go diff --git a/cmd/server/server.go b/cmd/server/server.go index 5e43977..a4be449 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -1,148 +1,25 @@ package main import ( - "encoding/json" - "fmt" "git.timovolkmann.de/gyrogpsc/dispatcher" - "git.timovolkmann.de/gyrogpsc/serial_ubx" - "github.com/gorilla/websocket" - "github.com/tidwall/pretty" - "html/template" - "log" - "net" - "net/http" - "os" + gnet "git.timovolkmann.de/gyrogpsc/net" ) const ( TCP_PORT = ":3010" + HTTP_PORT = ":3011" SERIAL_PORT = "/dev/tty.usbmodem14201" ) -var upgrader = websocket.Upgrader{} // use default options - -func echo(d *dispatcher.Dispatcher) func(w http.ResponseWriter, r *http.Request) { - fmt.Println("echo") - return func(w http.ResponseWriter, r *http.Request) { - fmt.Println("upgrading to ws") - c, err := upgrader.Upgrade(w, r, nil) - if err != nil { - log.Print("upgrade:", err) - return - } - //defer c.Close() - go func() { - for { - if _, _, err := c.NextReader(); err != nil { - c.Close() - break - } - } - }() - - dispatcherId, channel := d.Subscribe() - defer d.Unsubscribe(dispatcherId) - for { - log.Println("") - //if err != nil { - // log.Println("read:", err) - // break - //} - cmsg := <-channel - err = c.WriteMessage(websocket.TextMessage, []byte(cmsg)) - if err != nil { - log.Println("write:", err) - - break - } - } - } -} - -func home(w http.ResponseWriter, r *http.Request) { - //var homeTemplate = template.Must(template.New("").ParseFiles("index.html")) - tpl, err := template.ParseFiles("index.html") - if err != nil { - log.Fatalln(err) - } - err = tpl.Execute(w, "ws://"+r.Host+"/echo") - if err != nil { - log.Fatalln(err) - } -} - func main() { d := dispatcher.New() collectRoutines(d) - http.HandleFunc("/echo", echo(d)) - http.HandleFunc("/", home) - http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(".")))) - - log.Fatal(http.ListenAndServe(":3011", nil)) + gnet.NewHttpServer(d, HTTP_PORT) } func collectRoutines(d *dispatcher.Dispatcher) { // collectRoutines Serial UBX Sensor Data - go serialUbxCollector(d) + go gnet.SerialUbxCollector(d, SERIAL_PORT) // collectRoutines TCP JSON Sensor Data - go tcpJsonCollector(d) -} - -func serialUbxCollector(d *dispatcher.Dispatcher) { - r, err := serial_ubx.Setup(SERIAL_PORT) - if err != nil { - log.Fatalln(err) - } - - for { - meas, err := r.NextMeasurement() - if err != nil { - continue - } - fmt.Println(meas) - measjson, err := json.Marshal(meas) - d.Publish(string(measjson)) - } -} - -func tcpJsonCollector(d *dispatcher.Dispatcher) { - listener, err := net.Listen("tcp", TCP_PORT) - if err != nil { - fmt.Println("Error listening:", err.Error()) - os.Exit(1) - } - // Close the listener when the application closes. - defer listener.Close() - - for { - // Listen for an incoming connection. - conn, err := listener.Accept() - if err != nil { - fmt.Println("Error accepting: ", err.Error()) - os.Exit(1) - } - // Handle connections in a new goroutine. - go handleTcpJsonSensorData(conn, d) - } -} - -// Handles incoming requests. -func handleTcpJsonSensorData(conn net.Conn, d *dispatcher.Dispatcher) { - defer conn.Close() - // Make a buffer to hold incoming data. - for { - buf := make([]byte, 2048) - // Read the incoming connection into the buffer. - _, err := conn.Read(buf) - if err != nil { - fmt.Println("Error reading:", err.Error()) - break - } - json := pretty.Pretty(buf) - fmt.Println(string(json)) - d.Publish(string(json)) - // Send a response back to person contacting us. - //conn.Write([]byte("success")) - // Close the connection when you're done with it. - } + go gnet.TcpJsonCollector(d, TCP_PORT) } diff --git a/cmd/server_only/server_only.go b/cmd/server_only/server_only.go new file mode 100644 index 0000000..a4be449 --- /dev/null +++ b/cmd/server_only/server_only.go @@ -0,0 +1,25 @@ +package main + +import ( + "git.timovolkmann.de/gyrogpsc/dispatcher" + gnet "git.timovolkmann.de/gyrogpsc/net" +) + +const ( + TCP_PORT = ":3010" + HTTP_PORT = ":3011" + SERIAL_PORT = "/dev/tty.usbmodem14201" +) + +func main() { + d := dispatcher.New() + collectRoutines(d) + gnet.NewHttpServer(d, HTTP_PORT) +} + +func collectRoutines(d *dispatcher.Dispatcher) { + // collectRoutines Serial UBX Sensor Data + go gnet.SerialUbxCollector(d, SERIAL_PORT) + // collectRoutines TCP JSON Sensor Data + go gnet.TcpJsonCollector(d, TCP_PORT) +} diff --git a/net/net.go b/net/net.go new file mode 100644 index 0000000..51f8d9d --- /dev/null +++ b/net/net.go @@ -0,0 +1,132 @@ +package net + +import ( + "encoding/json" + "fmt" + "git.timovolkmann.de/gyrogpsc/dispatcher" + "git.timovolkmann.de/gyrogpsc/serial_ubx" + "github.com/gorilla/websocket" + "github.com/tidwall/pretty" + "html/template" + "log" + "net" + "net/http" + "os" +) + +func echo(d *dispatcher.Dispatcher) func(w http.ResponseWriter, r *http.Request) { + var upgrader = websocket.Upgrader{} // use default options + return func(w http.ResponseWriter, r *http.Request) { + fmt.Println("upgrading to ws") + c, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Print("upgrade:", err) + return + } + //defer c.Close() + go func() { + for { + if _, _, err := c.NextReader(); err != nil { + c.Close() + break + } + } + }() + + dispatcherId, channel := d.Subscribe() + defer d.Unsubscribe(dispatcherId) + for { + log.Println("") + //if err != nil { + // log.Println("read:", err) + // break + //} + cmsg := <-channel + err = c.WriteMessage(websocket.TextMessage, []byte(cmsg)) + if err != nil { + log.Println("write:", err) + + break + } + } + } +} + +func home(w http.ResponseWriter, r *http.Request) { + //var homeTemplate = template.Must(template.New("").ParseFiles("index.html")) + tpl, err := template.ParseFiles("index.html") + if err != nil { + log.Fatalln(err) + } + err = tpl.Execute(w, "ws://"+r.Host+"/echo") + if err != nil { + log.Fatalln(err) + } +} + +func NewHttpServer(d *dispatcher.Dispatcher, httpPort string) { + http.HandleFunc("/echo", echo(d)) + http.HandleFunc("/", home) + http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(".")))) + + log.Fatal(http.ListenAndServe(httpPort, nil)) +} + +func SerialUbxCollector(d *dispatcher.Dispatcher, serialPort string) { + r, err := serial_ubx.Setup(serialPort) + if err != nil { + log.Fatalln(err) + } + + for { + meas, err := r.NextMeasurement() + if err != nil { + continue + } + fmt.Println(meas) + measjson, err := json.Marshal(meas) + d.Publish(string(measjson)) + } +} + +func TcpJsonCollector(d *dispatcher.Dispatcher, tcpPort string) { + listener, err := net.Listen("tcp", tcpPort) + if err != nil { + fmt.Println("Error listening:", err.Error()) + os.Exit(1) + } + // Close the listener when the application closes. + defer listener.Close() + + for { + // Listen for an incoming connection. + conn, err := listener.Accept() + if err != nil { + fmt.Println("Error accepting: ", err.Error()) + os.Exit(1) + } + // Handle connections in a new goroutine. + go handleTcpJsonSensorData(conn, d) + } +} + +// Handles incoming requests. +func handleTcpJsonSensorData(conn net.Conn, d *dispatcher.Dispatcher) { + defer conn.Close() + // Make a buffer to hold incoming data. + for { + buf := make([]byte, 2048) + // Read the incoming connection into the buffer. + _, err := conn.Read(buf) + if err != nil { + fmt.Println("Error reading:", err.Error()) + break + } + json := pretty.Pretty(buf) + fmt.Println(string(json)) + d.Publish(string(json)) + // Send a response back to person contacting us. + //conn.Write([]byte("success")) + // Close the connection when you're done with it. + } +}