Web Socket output
- Web Socket output option is a client that sends JSON lines to web socket server
- The advantages of web socket server are very low latency and ability to pass firewalls and proxy servers because data is HTTP compliant and this is a push method (client pushes data to server)
- Advantage of JSON is small size
- You can choose to send via unsecured websocket (ws) or secured websocket (wss)
- Websocket client will check if connection is alive by either:
- Option 1. Sending 'ping' message and expecting 'pong' in return. If it does receive 'pong' return at least once, it will assume Option 1
- Option 2. Using standard websocket approach to make sure the connection is alive
Syntax to be used in Scoreboard OCR:
ws://host:port/[stream_id]
wss://host:port/[stream_id]
ws://localhost:15001/stream1
Command sent when creating new connection (assuming stream_id has been entered):
{"type":"register", "stream":"stream1", "role":"ocr"}
Command sent when updating data:
{“type”:”ocr”, “values”:{"field_name": “value”, "field_name2": “value”}}
{“type”:”ocr”, “values”:{"time": “3:12”, "score_a": “56”}}
Websocket server golang sample
In order to make this method work, you will need a websocket server. Here we have an example of golang code that you can use to create a websocket server:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
func main() {
http.HandleFunc("/", wsHandler)
panic(http.ListenAndServe(":15001", nil))
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024)
if err != nil {
http.Error(w, "Could not open websocket connection", http.StatusBadRequest)
}
go handleData(conn)
}
func handleData(conn *websocket.Conn) {
defer conn.Close()
for {
_, b, err := conn.ReadMessage()
if err != nil {
fmt.Println("Error reading json.", err)
break
}
fmt.Printf("Got message: %v\n", string(b))
if string(b) == `{"type":"ping"}` {
conn.WriteMessage(websocket.TextMessage, []byte(`{"type":"pong"}`))
}
}
}
