From 6118feb06b2a4a2c4cabcf14100b409e6fe4496c Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Fri, 27 Dec 2024 18:29:37 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E9=87=8D=E6=9E=84AMF-UE=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/event/event.go | 120 ++++++++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 22 deletions(-) diff --git a/features/event/event.go b/features/event/event.go index 1f75012b..8ec403a4 100644 --- a/features/event/event.go +++ b/features/event/event.go @@ -1,19 +1,17 @@ package event import ( - "encoding/json" "fmt" - "io" "net/http" "strings" "time" "be.ems/lib/core/ctx" "be.ems/lib/dborm" - "be.ems/lib/global" "be.ems/lib/log" "be.ems/lib/services" "be.ems/restagent/config" + "be.ems/src/framework/utils/parse" neService "be.ems/src/modules/network_element/service" wsService "be.ems/src/modules/ws/service" "github.com/gin-gonic/gin" @@ -36,34 +34,100 @@ type UEEvent struct { EventJson map[string]any `json:"eventJSON" xorm:"event_json"` } +// 旧AMF上报处理 func PostUEEventFromAMF(c *gin.Context) { log.Info("PostUEEventFromAMF processing... ") - body, err := io.ReadAll(io.LimitReader(c.Request.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("Failed to io.ReadAll: ", err) - services.ResponseNotFound404UriNotExist(c.Writer, c.Request) - return - } - - //vars := mux.Vars(c.Request) eventType, ok := c.Params.Get("eventType") if !ok || eventType == "" { log.Error("eventType is empty") services.ResponseNotFound404UriNotExist(c.Writer, c.Request) return } - ueEvent := new(UEEvent) - err = json.Unmarshal(body, &ueEvent.EventJson) - if err != nil { + var body map[string]any + if err := c.ShouldBindBodyWithJSON(&body); err != nil { log.Error("Failed to Unmarshal ueEvent:", err) services.ResponseInternalServerError500ProcessError(c.Writer, err) return } - ueEvent.NeType = "AMF" - ueEvent.Timestamp = time.Now().Unix() - ueEvent.EventType = eventType - log.Trace("ueEvent AMF:", ueEvent) + + ueEvent := UEEvent{ + NeType: "AMF", + Timestamp: time.Now().Unix(), + EventType: eventType, + } + // 从eventJson中获取rmUID + if v, ok := body["rmUID"]; ok { + ueEvent.RmUID = fmt.Sprint(v) + } else { + ueEvent.RmUID = "4400HXAMF001" + } + if v, ok := body["neName"]; ok { + ueEvent.NeName = fmt.Sprint(v) + } else { + ueEvent.NeName = "AMF_001" + } + + // 统一格式 + eventJson := map[string]any{"cellID": 0, "gNBID": "", "imsi": "", "onlineNumber": 0, "result": "", "tacID": 0, "timestamp": 0, "time": 0, "type": eventType} + switch eventType { + case "auth-result": + // {"authCode":"200","authMessage":"成功","authTime":"2024-12-07 16:48:37","cellID":"3","gNBID":"1","imsi":"460002082100000","onlineNumber":1,"tacID":"81"} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["cellID"]; ok { + eventJson["cellID"] = fmt.Sprint(v) + } + if v, ok := body["gNBID"]; ok { + eventJson["gNBID"] = fmt.Sprint(v) + } + if v, ok := body["tacID"]; ok { + eventJson["tacID"] = fmt.Sprint(v) + } + if v, ok := body["onlineNumber"]; ok { + eventJson["onlineNumber"] = parse.Number(v) + } + if v, ok := body["authCode"]; ok { + eventJson["result"] = fmt.Sprint(v) + } + if v, ok := body["authTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + case "detach": + // {"detachResult":0,"detachTime":"2024-12-07 18:00:47","imsi":"460002082100000"} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["detachResult"]; ok { + if fmt.Sprint(v) == "0" { + eventJson["result"] = "200" + } else { + eventJson["result"] = "500" + } + } + if v, ok := body["detachTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + case "cm-state": + // {"changeTime":"2024-12-07 17:07:52","imsi":"460002082100000","onlineNumber":1,"status":2} + if v, ok := body["imsi"]; ok { + eventJson["imsi"] = fmt.Sprint(v) + } + if v, ok := body["onlineNumber"]; ok { + eventJson["onlineNumber"] = parse.Number(v) + } + if v, ok := body["status"]; ok { + eventJson["result"] = fmt.Sprint(v) + } + if v, ok := body["changeTime"]; ok { + eventJson["timestamp"] = ueEvent.Timestamp + eventJson["time"] = fmt.Sprint(v) + } + } + ueEvent.EventJson = eventJson affected, err := dborm.XormInsertTableOne("ue_event_amf", ueEvent) if err != nil && affected <= 0 { @@ -72,13 +136,20 @@ func PostUEEventFromAMF(c *gin.Context) { return } - // AMF没有RmUID,直接推送 - // 推送到ws订阅组 - wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + // 发送到匹配的网元 + neInfo := neService.NewNeInfo.SelectNeInfoByRmuid(ueEvent.RmUID) + if neInfo.RmUID == ueEvent.RmUID { + // 推送到ws订阅组 + if ueEvent.NeType == "AMF" { + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent) + } + } services.ResponseStatusOK204NoContent(c.Writer) } +// UE上报处理 func PostUEEvent(w http.ResponseWriter, r *http.Request) { log.Info("PostUEEvent processing... ") @@ -103,7 +174,12 @@ func PostUEEvent(w http.ResponseWriter, r *http.Request) { if neInfo.RmUID == ueEvent.RmUID { // 推送到ws订阅组 if ueEvent.NeType == "MME" { - wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+neInfo.NeId, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_MME_UE+"_"+neInfo.NeId, ueEvent) + } + if ueEvent.NeType == "AMF" { + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE, ueEvent) + wsService.NewWSSend.ByGroupID(wsService.GROUP_AMF_UE+"_"+neInfo.NeId, ueEvent) } }