115 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			115 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"
 | |
| ]`
 |