2018-09-28 13:54:28 +02:00
|
|
|
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 {
|
2018-09-28 14:05:06 +02:00
|
|
|
readData(conn)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func readData(conn *websocket.Conn) {
|
|
|
|
b, n := make([]byte, 16384), 0
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
msg := message{}
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
for {
|
|
|
|
nn, err := conn.Read(b[n:])
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
n += nn
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
err = json.Unmarshal(b[:n], &msg)
|
|
|
|
if err != nil {
|
|
|
|
continue
|
2018-09-28 13:54:28 +02:00
|
|
|
}
|
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
break
|
|
|
|
}
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
mID := data.GetMeterID(data.SourceFortop, host+`-`+strconv.Itoa(msg.Data["U1"].DeviceID))
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
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{}
|
|
|
|
}
|
2018-09-28 13:54:28 +02:00
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
if len(k) == 2 {
|
|
|
|
n := k[1:]
|
|
|
|
if n == `4` {
|
|
|
|
n = `N`
|
2018-09-28 13:54:28 +02:00
|
|
|
}
|
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
k = k[:1] + `Gem` + n
|
2018-09-28 13:54:28 +02:00
|
|
|
}
|
|
|
|
|
2018-09-28 14:05:06 +02:00
|
|
|
sets[key][k] = v.Value
|
2018-09-28 13:54:28 +02:00
|
|
|
}
|
2018-09-28 14:05:06 +02:00
|
|
|
|
|
|
|
data.InsertSets(sets)
|
2018-09-28 13:54:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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"
|
|
|
|
]`
|