From 539a78196da60eb97cf7057c5c85dfaa9b240741 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期五, 11 十月 2024 16:21:32 +0800 Subject: [PATCH] 添加A3平层传感器数据获取方式 --- repository/captureRepo.go | 364 ++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 298 insertions(+), 66 deletions(-) diff --git a/repository/captureRepo.go b/repository/captureRepo.go index d9452fd..bb82cf5 100644 --- a/repository/captureRepo.go +++ b/repository/captureRepo.go @@ -1,18 +1,18 @@ package repository import ( - "bytes" "encoding/base64" "encoding/json" - "net/http" "time" + "gat1400Exchange/client" "gat1400Exchange/config" "gat1400Exchange/models" + "gat1400Exchange/pkg" "gat1400Exchange/pkg/logger" + "gat1400Exchange/service" + "gat1400Exchange/util" "gat1400Exchange/vo" - - uuid "github.com/satori/go.uuid" ) type CaptureRepository struct { @@ -23,8 +23,10 @@ } func (c CaptureRepository) FaceForward(faceList []vo.FaceObject) { + var err error + if faceList == nil || len(faceList) == 0 { - logger.Warn("faceList is nil") + logger.Warn("FaceList is nil") return } @@ -33,30 +35,80 @@ logger.Warn("SubImageInfoObject is nil") continue } - var deviceId = face.DeviceID - var faceImageStr string + var faceId = face.FaceID + var bgImageStr string + var bgImageBytes, faceImageBytes []byte = nil, nil // 鑾峰彇澶у浘, 鐩墠娴峰悍鐨勫皬鍥惧垎杈ㄧ巼澶綆 for _, image := range face.SubImageList.SubImageInfoObject { - if len(image.Data) > len(faceImageStr) { - faceImageStr = image.Data + if image.Type != "14" { + continue + } + + if len(image.Data) > 0 { + if len(image.Data) > len(bgImageStr) { + bgImageStr = image.Data + } + } else if image.StoragePath != "" { + imgData, err := util.ImageDownload(image.StoragePath, nil) + if err != nil { + logger.Warn("Image download failure, %s", err.Error()) + } else { + bgImageBytes = imgData + bgImageStr = "///" + } + } + } + + if bgImageBytes == nil { + bgImageBytes, err = base64.StdEncoding.DecodeString(bgImageStr) + if err != nil { + logger.Warn("Decode Image Base64 String failure, %s", err.Error()) + continue + } + } + + // 鍒ゆ柇鍥剧墖绫诲瀷鏄惁涓哄満鏅浘, 鏍规嵁浜鸿劯鍧愭爣鍒囧皬鍥�. + if config.ImageConf.CutFaceImage && face.LeftTopX != 0 { + faceRect := &pkg.Rect{ + Left: face.LeftTopX, + Top: face.LeftTopY, + Right: face.RightBtmX, + Bottom: face.RightBtmY, + } + + faceImageBytes, err = pkg.SubCutImage(bgImageBytes, faceRect, config.ImageConf.Enlarge) + if err != nil { + logger.Warn("Cut face image failure, %s", err.Error()) } } // 杞彂鍥惧儚 - logger.Debug("鍑嗗杞彂,deviceId:%s, image len:%d, server:%s", deviceId, len(faceImageStr), config.ForwardConf.SyncServer) - if deviceId != "" && faceImageStr != "" && config.ForwardConf.SyncServer != "" { - pd := c.PackPushData(deviceId, faceImageStr) + logger.Debug("Prepare forward image, deviceId:%s, bgImage len:%d, smImage len:%d server:%s", deviceId, len(bgImageBytes), len(faceImageBytes), config.ForwardConf.SyncServer) + if deviceId != "" && bgImageStr != "" && config.ForwardConf.SyncServer != "" { + pd := c.PackPushDataV2(deviceId, faceId, face.FaceAppearTime, bgImageBytes, faceImageBytes) if pd == nil { return } - rsp, err := c.SendData(pd, config.ForwardConf.SyncServer) + // 澶勭悊姊帶濉啓鐨勬ゼ灞備俊鎭� 鏆傛椂浣跨敤otherFeature瀛楁 + if face.OtherFeature != "" && pd.CameraFloor == "" { + pd.Direction, pd.CameraFloor, _ = pkg.RestoreFloor(face.OtherFeature) + } + + payload, err := json.Marshal(pd) if err != nil { - logger.Warn("鏁版嵁杞彂澶辫触:%s", err.Error()) + logger.Warn("Marshal error, %s", err.Error()) + return + } + + if !util.SendData(payload, config.ForwardConf.SyncServer) { + cacheItem, _ := json.Marshal(pd) + c.CacheData(cacheItem, "basic") + logger.Warn("The data forwarding failed, adding to local cache.") } else { - logger.Debug("鏁版嵁杞彂鎴愬姛,id:%s", rsp) + logger.Debug("The data forwarding successful. deviceId:%s, picId:%s", deviceId, face.FaceID) } } } @@ -64,77 +116,257 @@ return } -func (c CaptureRepository) PackPushData(deviceId, faceImage string) *vo.PushDataInfo { - var pd = new(vo.PushDataInfo) - var device models.Device +func (c CaptureRepository) PersonForward(personList []vo.PersonObject) { + var err error - if err := device.FindById(deviceId); err != nil { - logger.Debug("Can't find device in database, device:%s, %s", deviceId, err.Error()) - return pd + if personList == nil || len(personList) == 0 { + logger.Warn("FaceList is nil") + return } - imageBytes, err := base64.StdEncoding.DecodeString(faceImage) + for _, v := range personList { + if v.SubImageList.SubImageInfoObject == nil { + logger.Warn("SubImageInfoObject is nil") + continue + } + var deviceId = v.DeviceID + var targetId = v.PersonID + var bgImageStr string + var bgImageBytes, faceImageBytes []byte = nil, nil + + // 鑾峰彇澶у浘, 鐩墠娴峰悍鐨勫皬鍥惧垎杈ㄧ巼澶綆 + for _, image := range v.SubImageList.SubImageInfoObject { + if image.Type != "14" { + continue + } + + if len(image.Data) > 0 { + if len(image.Data) > len(bgImageStr) { + bgImageStr = image.Data + } + } else if image.StoragePath != "" { + imgData, err := util.ImageDownload(image.StoragePath, nil) + if err != nil { + logger.Warn("Image download failure, %s", err.Error()) + } else { + bgImageBytes = imgData + bgImageStr = "///" + } + } + } + + if bgImageBytes == nil { + bgImageBytes, err = base64.StdEncoding.DecodeString(bgImageStr) + if err != nil { + logger.Warn("Decode Image Base64 String failure, %s", err.Error()) + continue + } + } + + // 杞彂鍥惧儚 + logger.Debug("Prepare forward person image, deviceId:%s, image len:%d, server:%s", deviceId, len(bgImageBytes), config.ForwardConf.SyncServer) + if deviceId != "" && bgImageStr != "" && config.ForwardConf.SyncServer != "" { + pd := c.PackPushDataV2(deviceId, targetId, v.PersonAppearTime, bgImageBytes, faceImageBytes) + if pd == nil { + return + } + + // 澶勭悊姊帶濉啓鐨勬ゼ灞備俊鎭� 鏆傛椂浣跨敤oherFeature瀛楁 + if v.BehaviorDescription != "" { + pd.CameraFloor = v.BehaviorDescription + } + + //// 灏濊瘯浠巉aceId鎻愬彇妤煎眰 + //if pd.CameraFloor == "" && config.ClientConf.AddFloorToFaceId { + // pd.CameraFloor, _ = pkg.ParseFloorFromId(v.PersonID) + //} + //logger.Debug("device %s, CameraFloor:%s", deviceId, pd.CameraFloor) + + payload, err := json.Marshal(pd) + if err != nil { + logger.Warn("Marshal error, %s", err.Error()) + return + } + + if !util.SendData(payload, config.ForwardConf.SyncServer) { + cacheItem, _ := json.Marshal(pd) + c.CacheData(cacheItem, "basic") + logger.Warn("The data forwarding failed, adding to local cache.") + } else { + logger.Debug("The data forwarding successful. deviceId:%s", deviceId) + } + } + } + + return +} + +func (c CaptureRepository) PackPushDataV2(deviceId, faceId, appearTime string, bgImgBytes, faceImgBytes []byte) *vo.PushDataInfoV2 { + var pd = new(vo.PushDataInfoV2) + var floor string + var runDir string + + faceAppearTime, err := time.ParseInLocation("20060102150405", appearTime, time.Local) if err != nil { - logger.Warn("Decode Image Base64 String failure,%s", err.Error()) - return pd + logger.Warn("Parse face appear time error, %s", err.Error()) + faceAppearTime = time.Now() } - pd.PicMaxImages = append(pd.PicMaxImages, imageBytes) + // 鍒ゆ柇鏄惁闇�瑕佸尮閰嶆ゼ灞� + if config.NVCSConf.Model != "" { + // 鍖归厤妤煎眰 + var devPos models.Positions + _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 - tr := vo.TaskResultInfo{ - Id: uuid.NewV4().String(), - CameraId: deviceId, - OrgName: "", - CameraAddr: device.Addr + device.Pos, - CameraName: device.Name, - PicMaxUrl: []string{""}, - PicDate: time.Now().Format("2006-01-02 15:04:05"), - LikeDate: time.Now().Format("2006-01-02 15:04:05"), - TaskId: "", - AnalyServerId: deviceId, - AnalyServerName: "", - AnalyServerIp: "", - DataSource: "camera", + floor = devPos.Pos + + for i := 0; i < config.NVCSConf.WaitRunTime; i++ { + var dbPos models.Positions + if err := dbPos.FindMovePosition(faceAppearTime.Unix()+5, floor); err == nil { + switch dbPos.RunDir { + case service.RunUp: + runDir = "in" + case service.RunDown: + runDir = "out" + case service.RunStop: + runDir = "" + } + + break + } + + time.Sleep(1 * time.Second) + } } - pd.SourceData = vo.ESInfo{ - TaskResultInfo: tr, - Version: "3.3", - UpdateTime: time.Now().Format("2006-01-02 15:04:05"), + pd.PicMaxImages = append(pd.PicMaxImages, bgImgBytes) + + if faceImgBytes != nil { + pd.PicSmImages = append(pd.PicSmImages, faceImgBytes) } + + pd.PicId = faceId + pd.PicDate = faceAppearTime.Format("2006-01-02 15:04:05") + pd.DataSource = "camera" + pd.CameraFloor = floor + pd.CameraId = deviceId + pd.Direction = runDir return pd } -func (c CaptureRepository) SendData(pushDataInfo *vo.PushDataInfo, url string) (id string, err error) { - id = "" - payload, err := json.Marshal(pushDataInfo) - if err != nil { - return id, err +func (c CaptureRepository) CacheData(payload []byte, msgType string) { + var cacheItem = models.Cache{ + Type: msgType, + Data: string(payload), + CreateTime: time.Now().Unix(), + Retry: 0, } - req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload)) - if err != nil { - return id, err + cacheItem.Save() +} + +func (c CaptureRepository) VIIDFaceMsgForward(msg *vo.RequestFaceList) { + faceInfo := msg.FaceListObject.FaceObject[0] + + // 鍒ゆ柇鏄惁寮�鍚簡姊帶 + if config.NVCSConf.Model != "" { + // 鍖归厤妤煎眰 + faceAppearTime, err := time.ParseInLocation("20060102150405", faceInfo.FaceAppearTime, time.Local) + if err != nil { + logger.Warn("Parse face appear time error, %s", err.Error()) + faceAppearTime = time.Now() + } + + var floor, runDir string + var devPos models.Positions + _ = devPos.FindPositionByTime(faceAppearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = "1F" + } + + floor = devPos.Pos + + for i := 0; i < config.NVCSConf.WaitRunTime; i++ { + var dbPos models.Positions + if err := dbPos.FindMovePosition(faceAppearTime.Unix()+5, floor); err == nil { + switch dbPos.RunDir { + case service.RunUp: + runDir = "1" + case service.RunDown: + runDir = "2" + case service.RunStop: + runDir = "0" + } + + break + } + + time.Sleep(1 * time.Second) + } + + for idx, _ := range msg.FaceListObject.FaceObject { + msg.FaceListObject.FaceObject[idx].OtherFeature, _ = pkg.ParseFloor(runDir, floor) + //if config.ClientConf.AddFloorToFaceId { + // msg.FaceListObject.FaceObject[idx].FaceID = pkg.GenerateFaceIdContainFloor(face.FaceID, devPos.Pos) + //} + } + } - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return id, err - } - defer resp.Body.Close() - - var responseData map[string]interface{} - err = json.NewDecoder(resp.Body).Decode(&responseData) - if err != nil { - return id, err + b, _ := json.Marshal(msg) + if client.FaceCapture(b) != vo.StatusSuccess { + cacheItem, _ := json.Marshal(msg) + c.CacheData(cacheItem, "1400-face") + logger.Warn("The data forwarding failed, adding to local cache.") } - id = responseData["data"].(string) - // 澶勭悊鍝嶅簲 - // 杩欓噷鍙互鏍规嵁瀹為檯闇�姹傝繘琛屽鐞嗭紝渚嬪璇诲彇鍝嶅簲鍐呭鎴栨鏌ョ姸鎬佺爜绛� + return +} - return id, nil +func (c CaptureRepository) VIIDPersonMsgForward(msg *vo.RequestPersonList) { + person := msg.PersonListObject.PersonObject[0] + // 鍖归厤妤煎眰 + appearTime, err := time.ParseInLocation("20060102150405", person.PersonAppearTime, time.Local) + if err != nil { + logger.Warn("Parse face appear time error, %s", err.Error()) + appearTime = time.Now() + } + var devPos models.Positions + _ = devPos.FindPositionByTime(appearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = "1F" + } + + for idx, _ := range msg.PersonListObject.PersonObject { + msg.PersonListObject.PersonObject[idx].BehaviorDescription = devPos.Pos + //if config.ClientConf.AddFloorToFaceId { + // msg.PersonListObject.PersonObject[idx].PersonID = pkg.GenerateFaceIdContainFloor(v.PersonID, devPos.Pos) + //} + } + + b, _ := json.Marshal(msg) + if client.PersonCapture(b) != vo.StatusSuccess { + cacheItem, _ := json.Marshal(msg) + c.CacheData(cacheItem, "1400-person") + logger.Warn("The data forwarding failed, adding to local cache.") + } + + return +} + +func (c CaptureRepository) PubRecordMessage(deviceId, msgId string) { + var msg = vo.RecordMsg{ + CamId: deviceId, + MsgId: msgId, + } + + logger.Debug("Pub record message %s, %s", deviceId, msgId) + body, _ := json.Marshal(&msg) + + _, err := util.HttpPost(config.ForwardConf.RecordServer, nil, body) + if err != nil { + logger.Warn(err.Error()) + } } -- Gitblit v1.8.0