package fortoprt import ( "encoding/json" "fmt" "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() { fmt.Println(`Connecting`) 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 { b, n := make([]byte, 16384), 0 msg := message{} for { nn, err := conn.Read(b[n:]) if err != nil { panic(err) } n += nn err = json.Unmarshal(b[:n], &msg) if err != nil { continue } break } // sets := data.Sets{} 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" ]`