feat: ws模块消息码变更及修复断链情况

This commit is contained in:
TsMask
2025-04-22 11:39:21 +08:00
parent fbcae7ac5a
commit 9df27f349b
8 changed files with 44 additions and 24 deletions

View File

@@ -89,14 +89,14 @@ func PostCDREventFrom(w http.ResponseWriter, r *http.Request) {
switch neInfo.NeType { switch neInfo.NeType {
case "IMS": case "IMS":
if v, ok := cdrEvent.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") { if v, ok := cdrEvent.CDR["recordType"]; ok && (v == "MOC" || v == "MTSM") {
wsService.NewWSSend.ByGroupID(wsService.GROUP_IMS_CDR+neInfo.NeId, cdrEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_IMS_CDR+"_"+neInfo.NeId, cdrEvent)
} }
case "SMF": case "SMF":
wsService.NewWSSend.ByGroupID(wsService.GROUP_SMF_CDR+neInfo.NeId, cdrEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_SMF_CDR+"_"+neInfo.NeId, cdrEvent)
case "SMSC": case "SMSC":
wsService.NewWSSend.ByGroupID(wsService.GROUP_SMSC_CDR+neInfo.NeId, cdrEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_SMSC_CDR+"_"+neInfo.NeId, cdrEvent)
case "SGWC": case "SGWC":
wsService.NewWSSend.ByGroupID(wsService.GROUP_SGWC_CDR+neInfo.NeId, cdrEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_SGWC_CDR+"_"+neInfo.NeId, cdrEvent)
} }
} }

View File

@@ -335,13 +335,13 @@ func PostKPIReportFromNF(w http.ResponseWriter, r *http.Request) {
if neInfo.RmUID == kpiData.RmUid { if neInfo.RmUID == kpiData.RmUid {
// 推送到ws订阅组 // 推送到ws订阅组
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent) wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI, neInfo.NeType, neInfo.NeId), kpiEvent)
// 推送自定义KPI到ws订阅组 // 推送自定义KPI到ws订阅组
wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent) wsService.NewWSSend.ByGroupID(fmt.Sprintf("%s_%s_%s", wsService.GROUP_KPI_C, neInfo.NeType, neInfo.NeId), kpiCEvent)
if neInfo.NeType == "UPF" { if neInfo.NeType == "UPF" {
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+neInfo.NeId, kpiEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+"_"+neInfo.NeId, kpiEvent)
// 推送标识为12_RMUID, exp: 12_4400HXUPF001, for multi-tenancy // 推送标识为12_RMUID, exp: 12_4400HXUPF001, for multi-tenancy
wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+kpiReport.Task.NE.RmUID, kpiEvent) wsService.NewWSSend.ByGroupID(wsService.GROUP_KPI_UPF+"_"+kpiReport.Task.NE.RmUID, kpiEvent)
// 更新UPF总流量 // 更新UPF总流量
upValue := parse.Number(kpiEvent["UPF.03"]) upValue := parse.Number(kpiEvent["UPF.03"])
downValue := parse.Number(kpiEvent["UPF.06"]) downValue := parse.Number(kpiEvent["UPF.06"])

View File

@@ -37,6 +37,7 @@ type WSController struct {
// @Accept json // @Accept json
// @Produce json // @Produce json
// @Param subGroupID query string false "Subscribe to message groups, multiple separated by commas" // @Param subGroupID query string false "Subscribe to message groups, multiple separated by commas"
// @Param access_token query string false "Authorization tokens are used when it is inconvenient to pass parameters through the header."
// @Success 200 {object} object "Response Results" // @Success 200 {object} object "Response Results"
// @Summary (ws://) Generic // @Summary (ws://) Generic
// @Description (ws://) Generic // @Description (ws://) Generic

View File

@@ -1,9 +1,9 @@
package controller package controller
import ( import (
"be.ems/src/framework/database/redis"
"be.ems/src/framework/i18n" "be.ems/src/framework/i18n"
"be.ems/src/framework/logger" "be.ems/src/framework/logger"
"be.ems/src/framework/redis"
"be.ems/src/framework/utils/ctx" "be.ems/src/framework/utils/ctx"
"be.ems/src/framework/vo/result" "be.ems/src/framework/vo/result"
neService "be.ems/src/modules/network_element/service" neService "be.ems/src/modules/network_element/service"

View File

@@ -21,11 +21,11 @@ import (
// @Tags ws // @Tags ws
// @Accept json // @Accept json
// @Produce json // @Produce json
// @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC) // @Param neType query string true "NE Type" Enums(IMS,AMF,AUSF,UDM,SMF,PCF,NSSF,NRF,UPF,MME,CBC,OMC,SGWC,SMSC)
// @Param neId query string true "NE ID" default(001) // @Param neId query string true "NE ID" default(001)
// @Param cols query number false "Terminal line characters" default(120) // @Param cols query number false "Terminal line characters" default(120)
// @Param rows query number false "Terminal display lines" default(40) // @Param rows query number false "Terminal display lines" default(40)
// @Param access_token query string true "Authorization" // @Param access_token query string true "Authorization tokens are used when it is inconvenient to pass parameters through the header."
// @Success 200 {object} object "Response Results" // @Success 200 {object} object "Response Results"
// @Summary (ws://) Terminal Interactive File Content Viewing // @Summary (ws://) Terminal Interactive File Content Viewing
// @Description (ws://) Terminal Interactive File Content Viewing // @Description (ws://) Terminal Interactive File Content Viewing

View File

@@ -10,6 +10,7 @@ import (
"be.ems/src/framework/utils/generate" "be.ems/src/framework/utils/generate"
"be.ems/src/framework/vo/result" "be.ems/src/framework/vo/result"
"be.ems/src/modules/ws/model" "be.ems/src/modules/ws/model"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
@@ -30,7 +31,7 @@ func (s *WS) UpgraderWs(w http.ResponseWriter, r *http.Request) *websocket.Conn
wsUpgrader := websocket.Upgrader{ wsUpgrader := websocket.Upgrader{
Subprotocols: []string{"omc-ws"}, Subprotocols: []string{"omc-ws"},
// 设置消息发送缓冲区大小byte如果这个值设置得太小可能会导致服务端在发送大型消息时遇到问题 // 设置消息发送缓冲区大小byte如果这个值设置得太小可能会导致服务端在发送大型消息时遇到问题
WriteBufferSize: 1024, WriteBufferSize: 4096,
// 消息包启用压缩 // 消息包启用压缩
EnableCompression: true, EnableCompression: true,
// ws握手超时时间 // ws握手超时时间
@@ -195,11 +196,18 @@ func (s *WS) ClientWriteListen(wsClient *model.WSClient) {
wsClient.MsgChan <- msgByte wsClient.MsgChan <- msgByte
// 消息发送监听 // 消息发送监听
for msg := range wsClient.MsgChan { for msg := range wsClient.MsgChan {
// PONG句柄
if string(msg) == "ws:pong" {
wsClient.LastHeartbeat = time.Now().UnixMilli()
wsClient.Conn.WriteMessage(websocket.PongMessage, []byte{})
continue
}
// 关闭句柄 // 关闭句柄
if string(msg) == "ws:close" { if string(msg) == "ws:close" {
wsClient.Conn.WriteMessage(websocket.CloseMessage, []byte{}) wsClient.Conn.WriteMessage(websocket.CloseMessage, []byte{})
return return
} }
// 发送消息 // 发送消息
err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg) err := wsClient.Conn.WriteMessage(websocket.TextMessage, msg)
if err != nil { if err != nil {
@@ -207,6 +215,5 @@ func (s *WS) ClientWriteListen(wsClient *model.WSClient) {
s.ClientClose(wsClient.ID) s.ClientClose(wsClient.ID)
return return
} }
wsClient.LastHeartbeat = time.Now().UnixMilli()
} }
} }

View File

@@ -8,8 +8,8 @@ import (
"strings" "strings"
"time" "time"
"be.ems/src/framework/database/redis"
"be.ems/src/framework/logger" "be.ems/src/framework/logger"
"be.ems/src/framework/redis"
"be.ems/src/framework/telnet" "be.ems/src/framework/telnet"
"be.ems/src/framework/utils/ssh" "be.ems/src/framework/utils/ssh"
"be.ems/src/framework/vo/result" "be.ems/src/framework/vo/result"
@@ -51,6 +51,14 @@ func (s *WSReceive) Commont(client *model.WSClient, reqMsg model.WSRequest) {
case "close": case "close":
s.close(client) s.close(client)
return return
case "ping", "PING":
resByte, _ := json.Marshal(result.Ok(map[string]any{
"requestId": reqMsg.RequestID,
"data": "PONG",
}))
client.MsgChan <- resByte
client.MsgChan <- []byte("ws:pong")
return
case "ps": case "ps":
resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data) resByte, err = processor.GetProcessData(reqMsg.RequestID, reqMsg.Data)
case "net": case "net":

View File

@@ -13,27 +13,31 @@ const (
// 组号-其他 // 组号-其他
GROUP_OTHER = "0" GROUP_OTHER = "0"
// 组号-跟踪任务网元数据变更 2_traceId // 组号-跟踪任务网元数据变更 2_traceId
GROUP_TRACE_NE = "2_" GROUP_TRACE_NE = "2"
// 组号-信令跟踪Packet 4_taskNo // 组号-信令跟踪Packet 4_taskNo
GROUP_TRACE_PACKET = "4_" GROUP_TRACE_PACKET = "4"
// 组号-指标通用 10_neType_neId // 组号-指标通用 10_neType_neId
GROUP_KPI = "10_" GROUP_KPI = "10"
// 组号-指标UPF 12_neId // 组号-指标UPF 12_neId
GROUP_KPI_UPF = "12_" GROUP_KPI_UPF = "12_"
// 组号-自定义KPI指标 20_neType_neId // 组号-自定义KPI指标 20_neType_neId
GROUP_KPI_C = "20_" GROUP_KPI_C = "20"
// 组号-IMS_CDR会话事件 1005_neId // 组号-IMS_CDR会话事件 1005_neId
GROUP_IMS_CDR = "1005_" GROUP_IMS_CDR = "1005"
// 组号-SMF_CDR会话事件 1006_neId // 组号-SMF_CDR会话事件 1006_neId
GROUP_SMF_CDR = "1006_" GROUP_SMF_CDR = "1006"
// 组号-SMSC_CDR会话事件 1007_neId // 组号-SMSC_CDR会话事件 1007_neId
GROUP_SMSC_CDR = "1007_" GROUP_SMSC_CDR = "1007"
// 组号-SGWC_CDR会话事件 1008_neId // 组号-SGWC_CDR会话事件 1008_neId
GROUP_SGWC_CDR = "1008_" GROUP_SGWC_CDR = "1008"
// 组号-AMF_UE会话事件 1010_neId // 组号-AMF_UE会话事件 1010_neId
GROUP_AMF_UE = "1010" GROUP_AMF_UE = "1010"
// 组号-MME_UE会话事件 1011_neId // 组号-MME_UE会话事件 1011_neId
GROUP_MME_UE = "1011" GROUP_MME_UE = "1011"
// 组号-告警 2000_neType_neId
GROUP_ALARM = "2000"
// 组号-告警事件 2000_neType_neId
GROUP_ALARM_EVENT = "2002"
) )
// 实例化服务层 WSSend 结构体 // 实例化服务层 WSSend 结构体