2025-01-20 16:20:21 +08:00
|
|
|
package handler
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"modelRT/logger"
|
|
|
|
|
"modelRT/network"
|
2025-06-13 15:34:49 +08:00
|
|
|
realtimedata "modelRT/real-time-data"
|
2025-01-20 16:20:21 +08:00
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var upgrader = websocket.Upgrader{
|
|
|
|
|
ReadBufferSize: 1024,
|
|
|
|
|
WriteBufferSize: 1024,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RealTimeDataReceivehandler define real time data receive and process API
|
|
|
|
|
func RealTimeDataReceivehandler(c *gin.Context) {
|
|
|
|
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "upgrade http protocol to websocket protocal failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
defer conn.Close()
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
messageType, p, err := conn.ReadMessage()
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "read message from websocket connection failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
|
|
|
|
|
respByte := processResponse(-1, "read message from websocket connection failed", nil)
|
|
|
|
|
if len(respByte) == 0 {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "process message from byte failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = conn.WriteMessage(messageType, respByte)
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "write message to websocket connection failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var request network.RealTimeDataReceiveRequest
|
|
|
|
|
err = jsoniter.Unmarshal([]byte(p), &request)
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "unmarshal message from byte failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
|
|
|
|
|
respByte := processResponse(-1, "unmarshal message from byte failed", nil)
|
|
|
|
|
if len(respByte) == 0 {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "process message from byte failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = conn.WriteMessage(messageType, respByte)
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "write message to websocket connection failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
realtimedata.RealTimeDataChan <- request
|
|
|
|
|
|
|
|
|
|
payload := map[string]interface{}{
|
2025-08-15 16:25:48 +08:00
|
|
|
"component_uuid": request.PayLoad.ComponentUUID,
|
|
|
|
|
"point": request.PayLoad.Point,
|
2025-01-20 16:20:21 +08:00
|
|
|
}
|
|
|
|
|
respByte := processResponse(0, "success", payload)
|
|
|
|
|
if len(respByte) == 0 {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "process message from byte failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err = conn.WriteMessage(messageType, respByte)
|
|
|
|
|
if err != nil {
|
2025-06-06 16:41:52 +08:00
|
|
|
logger.Error(c, "write message to websocket connection failed", "error", err)
|
2025-01-20 16:20:21 +08:00
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func processResponse(code int64, msg string, payload map[string]interface{}) []byte {
|
2025-01-23 14:56:01 +08:00
|
|
|
resp := map[string]interface{}{
|
|
|
|
|
"code": code,
|
|
|
|
|
"msg": msg,
|
|
|
|
|
"payload": payload,
|
2025-01-20 16:20:21 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
respByte, err := jsoniter.Marshal(resp)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return []byte("")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return respByte
|
|
|
|
|
}
|