88 lines
1.5 KiB
Go
88 lines
1.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/danclive/snap7-go"
|
||
|
"github.com/gapidobri/siemens-ws/hardware"
|
||
|
"github.com/gorilla/websocket"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
upgrader = websocket.Upgrader{
|
||
|
CheckOrigin: func(r *http.Request) bool {
|
||
|
return true
|
||
|
},
|
||
|
}
|
||
|
clients = []chan uint16{}
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
siemens, err := snap7.ConnentTo("192.168.117.222", 0, 1, 0)
|
||
|
if err != nil {
|
||
|
fmt.Println(err)
|
||
|
}
|
||
|
|
||
|
// client := hardware.NewClient(hardware.NewMock())
|
||
|
client := hardware.NewSiemens(siemens)
|
||
|
|
||
|
go func() {
|
||
|
for {
|
||
|
val, err := client.Read()
|
||
|
if err != nil {
|
||
|
log.Println("read err:", err)
|
||
|
}
|
||
|
|
||
|
fmt.Println(val)
|
||
|
|
||
|
for _, c := range clients {
|
||
|
c <- val
|
||
|
}
|
||
|
|
||
|
time.Sleep(time.Millisecond * 100)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||
|
fmt.Println("open handler")
|
||
|
|
||
|
c, err := upgrader.Upgrade(w, r, nil)
|
||
|
if err != nil {
|
||
|
log.Println("upgrade err:", err)
|
||
|
return
|
||
|
}
|
||
|
defer c.Close()
|
||
|
|
||
|
dataCh := make(chan uint16)
|
||
|
|
||
|
clients = append(clients, dataCh)
|
||
|
|
||
|
for {
|
||
|
val, more := <-dataCh
|
||
|
if !more {
|
||
|
break
|
||
|
}
|
||
|
err = c.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("%d", val)))
|
||
|
if err != nil {
|
||
|
log.Println("write err:", err)
|
||
|
fmt.Println("close handler")
|
||
|
c.Close()
|
||
|
close(dataCh)
|
||
|
for i, c := range clients {
|
||
|
if c == dataCh {
|
||
|
clients = append(clients[:i], clients[i+1:]...)
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
})
|
||
|
|
||
|
log.Fatal(http.ListenAndServe(":1234", nil))
|
||
|
|
||
|
}
|