parser/fortoprt/fetch.go

116 lines
2.1 KiB
Go

package fortoprt
import (
"encoding/json"
"strconv"
"time"
"git.fuyu.moe/5GPowerQuality/parser/data"
"git.fuyu.moe/5GPowerQuality/parser/shared"
"golang.org/x/net/websocket"
)
type message struct {
MessageInfo struct {
Version string
Application string
Module string
Function string
}
Data map[string]measurement
}
type measurement struct {
DeviceID int
Timestamp shared.UnixTimestamp
Value float64
Unit string
}
var host = `dcem5g.ddns.net`
func FetchData() {
conn, err := websocket.Dial(`ws://`+host+`/ValuesSocketServer/VMvalues`, ``, `http://localhost`)
if err != nil {
panic(err)
}
defer conn.Close()
requestData(conn, 1)
requestData(conn, 2)
for {
readData(conn)
}
}
func readData(conn *websocket.Conn) {
b, n := make([]byte, 16384), 0
msg := message{}
for {
conn.SetReadDeadline(time.Now().Add(time.Minute))
nn, err := conn.Read(b[n:])
if err != nil {
panic(err)
}
n += nn
err = json.Unmarshal(b[:n], &msg)
if err != nil {
continue
}
break
}
mID := data.GetMeterID(data.SourceFortop, host+`-`+strconv.Itoa(msg.Data["U1"].DeviceID))
sets := data.Sets{}
for k, v := range msg.Data {
key := data.Key{Meter: mID, Time: time.Time(v.Timestamp)}
if _, ok := sets[key]; !ok {
sets[key] = data.Set{}
}
if len(k) == 2 {
n := k[1:]
if n == `4` {
n = `N`
}
k = k[:1] + `Gem` + n
}
sets[key][k] = v.Value
}
data.InsertSets(sets)
}
func requestData(conn *websocket.Conn, meter int) {
write(conn, `{"MESSAGEINFO":{"VERSION":1,"APPLICATION":"DCEM_ENTERPRISE","MODULE":"LIVEDATA","FUNCTION":"REQUEST_DATASTREAM","REVISION":1},"VARS":{"DEVICEID":`+strconv.Itoa(meter)+`,"VALUES":`+values+`}}`)
}
func write(conn *websocket.Conn, msg string) {
_, err := conn.Write([]byte(msg))
if err != nil {
panic(err)
}
}
var values = `[
"U1", "U2", "U3", "U4",
"I1", "I2", "I3", "I4",
"P1", "P2", "P3", "P4",
"B1", "B2", "B3", "B4",
"S1", "S2", "S3", "S4",
"C1", "C2", "C3", "C4",
"EP1", "EP2", "EP3", "EP4",
"UTHD1", "UTHD2", "UTHD3", "UTHD4",
"ITHD1", "ITHD2", "ITHD3", "ITHD4",
"FREQ"
]`