From fe763eba27addfe615d2c107b8984484baef9a23 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期一, 29 四月 2024 03:27:09 +0800 Subject: [PATCH] 完善下级功能 --- controller/systemCtl.go | 13 ---- config/config.go | 1 controller/captureCtl.go | 14 +++- models/cache.go | 1 service/device.go | 10 +++ service/resend.go | 21 +++++- client/faces.go | 34 +++++++++++ repository/captureRepo.go | 72 +++++++++++++++++++---- models/positions.go | 4 + service/nvcs.go | 10 ++- 10 files changed, 142 insertions(+), 38 deletions(-) diff --git a/client/faces.go b/client/faces.go new file mode 100644 index 0000000..6c25b7c --- /dev/null +++ b/client/faces.go @@ -0,0 +1,34 @@ +package client + +import ( + "encoding/json" + "gat1400Exchange/pkg/logger" + "gat1400Exchange/util" + "gat1400Exchange/vo" +) + +const ( + FacesUrI = "/VIID/Faces" +) + +func FaceCapture(msg []byte) int { + if clientStatus != vo.StatusSuccess { + return clientStatus + } + + rsp, err := util.HttpPost(FacesUrI, headers, msg) + if err != nil { + logger.Warn("Post faces failed, %s", err.Error()) + return vo.StatusOtherError + } + + var stat vo.ResponseStatus + err = json.Unmarshal(rsp, &stat) + if err != nil { + logger.Warn("Post faces response unmarshal failed, %s", err.Error()) + return vo.StatusOtherError + } + + logger.Debug("Post faces success.") + return stat.StatusCode +} diff --git a/config/config.go b/config/config.go index 9eaad86..bc53545 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ Host string `mapstructure:"host"` Port string `mapstructure:"port"` Password string `mapstructure:"password"` + Role string `mapstructure:"role"` // agent 璁惧绔�, proxy 1400涓浆 涓嶅鐞哾eivce, server 鍏ㄥ姛鑳� } type client struct { diff --git a/controller/captureCtl.go b/controller/captureCtl.go index c17b618..ef00027 100644 --- a/controller/captureCtl.go +++ b/controller/captureCtl.go @@ -1,6 +1,8 @@ package controller import ( + "gat1400Exchange/config" + "gat1400Exchange/service" "net/http" "time" @@ -36,11 +38,17 @@ return } + // 濡傛灉寮�鍚簡涓嬬骇, 韬唤搴旇鏄秷鎭唬鐞�, 涓嶅啀杞彂鍒版湇鍔″櫒 face := req.FaceListObject.FaceObject[0] + if config.ClientConf.Enable && config.ServeConf.Role == "agent" { + a.Repository.MsgForward(&req) + } else { + logger.Debug("Receive new message, Id:%s Ip:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime) + a.Repository.FaceForward(req.FaceListObject.FaceObject) + } - logger.Debug("Receive new message, Id:%s Ip:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime) - - a.Repository.FaceForward(req.FaceListObject.FaceObject) + // 璁惧淇濇椿 + service.KeepDeviceAlive(face.DeviceID) rspMsg := vo.ResponseStatus{ RequestURL: c.FullPath(), diff --git a/controller/systemCtl.go b/controller/systemCtl.go index b933623..dbf947b 100644 --- a/controller/systemCtl.go +++ b/controller/systemCtl.go @@ -1,8 +1,6 @@ package controller import ( - "gat1400Exchange/models" - "gat1400Exchange/pkg/logger" "gat1400Exchange/service" "net/http" "time" @@ -63,16 +61,6 @@ return } - // 涓婃姤璁惧淇℃伅 - var d = models.Device{ - Id: req.KeepaliveObject.DeviceID, - } - - err := d.Upsert() - if err != nil { - logger.Warn("Device db update camera error:%s", err.Error()) - } - service.KeepDeviceAlive(req.KeepaliveObject.DeviceID) rspMsg := vo.ResponseStatus{ @@ -95,7 +83,6 @@ } // 鍒犲簱 - rspMsg := vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, diff --git a/models/cache.go b/models/cache.go index 54becc2..45820ef 100644 --- a/models/cache.go +++ b/models/cache.go @@ -2,6 +2,7 @@ type Cache struct { Id uint `gorm:"column:id;primary_key;auto_increment;unique;not null;"` + Type string `gorm:"column:type;"` // 娑堟伅绫诲瀷 1400, basic Data string `gorm:"column:data;type:text"` CreateTime int64 `gorm:"column:create_time;"` Retry int `gorm:"column:retry;"` diff --git a/models/positions.go b/models/positions.go index 5e61a07..daccc16 100644 --- a/models/positions.go +++ b/models/positions.go @@ -15,3 +15,7 @@ func (d *Positions) FindDevicePosition(devId string, timestamp int64) error { return db.Table(d.TableName()).Where("device_id = ? AND create_time <= ?", devId, timestamp).Order("create_time desc").First(&d).Error } + +func (d *Positions) FindPositionByTime(timestamp int64) error { + return db.Table(d.TableName()).Where("create_time <= ?", timestamp).Order("create_time desc").First(&d).Error +} diff --git a/repository/captureRepo.go b/repository/captureRepo.go index 15f4c34..c5516e1 100644 --- a/repository/captureRepo.go +++ b/repository/captureRepo.go @@ -3,6 +3,7 @@ import ( "encoding/base64" "encoding/json" + "gat1400Exchange/client" "time" "gat1400Exchange/config" @@ -77,6 +78,13 @@ return } + // 閮ㄧ讲鍦ㄦ湇鍔$鐨�1400浠g悊, 浠呮帴鏀�1400淇℃伅, 妤煎眰淇℃伅鏆傚瓨鍦╫herFeature瀛楁 + if config.ServeConf.Role == "proxy" { + if face.OtherFeature != "" { + pd.CameraFloor = face.OtherFeature + } + } + payload, err := json.Marshal(pd) if err != nil { logger.Warn("Marshal error, %s", err.Error()) @@ -85,7 +93,7 @@ if !util.SendData(payload, config.ForwardConf.SyncServer) { cacheItem, _ := json.Marshal(pd) - c.CacheData(cacheItem) + c.CacheData(cacheItem, "basic") logger.Warn("The data forwarding failed, adding to local cache.") } else { logger.Debug("The data forwarding successful. deviceId:%s", deviceId) @@ -152,24 +160,30 @@ func (c CaptureRepository) PackPushDataV2(deviceId, faceId, appearTime string, bgImgBytes, faceImgBytes []byte) *vo.PushDataInfoV2 { var pd = new(vo.PushDataInfoV2) - var device models.Device + var floor string - if err := device.FindById(deviceId); err != nil { - logger.Warn("Can't find device in database, device:%s, %s", deviceId, err.Error()) - return pd - } - - // 鍖归厤妤煎眰 faceAppearTime, err := time.ParseInLocation("20060102150405", appearTime, time.Local) if err != nil { logger.Warn("Parse face appear time error, %s", err.Error()) faceAppearTime = time.Now() } - var devPos models.Positions - _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 - if devPos.Pos == "" { - devPos.Pos = device.Floor + if config.ServeConf.Role == "server" { + var device models.Device + + if err := device.FindById(deviceId); err != nil { + logger.Warn("Can't find device in database, device:%s, %s", deviceId, err.Error()) + return pd + } + + // 鍖归厤妤煎眰 + var devPos models.Positions + _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = device.Floor + } + + floor = devPos.Pos } pd.PicMaxImages = append(pd.PicMaxImages, bgImgBytes) @@ -181,14 +195,15 @@ pd.PicId = faceId pd.PicDate = faceAppearTime.Format("2006-01-02 15:04:05") pd.DataSource = "camera" - pd.CameraFloor = devPos.Pos + pd.CameraFloor = floor pd.CameraId = deviceId return pd } -func (c CaptureRepository) CacheData(payload []byte) { +func (c CaptureRepository) CacheData(payload []byte, msgType string) { var cacheItem = models.Cache{ + Type: msgType, Data: string(payload), CreateTime: time.Now().Unix(), Retry: 0, @@ -196,3 +211,32 @@ cacheItem.Save() } + +func (c CaptureRepository) MsgForward(msg *vo.RequestFaceList) { + faceInfo := msg.FaceListObject.FaceObject[0] + // 鍖归厤妤煎眰 + 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 devPos models.Positions + _ = devPos.FindPositionByTime(faceAppearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = "1F" + } + + for idx, _ := range msg.FaceListObject.FaceObject { + msg.FaceListObject.FaceObject[idx].OtherFeature = devPos.Pos + } + + b, _ := json.Marshal(msg) + if client.FaceCapture(b) != vo.StatusSuccess { + cacheItem, _ := json.Marshal(msg) + c.CacheData(cacheItem, "1400") + logger.Warn("The data forwarding failed, adding to local cache.") + } + + return +} diff --git a/service/report.go b/service/device.go similarity index 93% rename from service/report.go rename to service/device.go index 04f0e22..43b94e8 100644 --- a/service/report.go +++ b/service/device.go @@ -82,5 +82,15 @@ } func KeepDeviceAlive(id string) { + // 涓婃姤璁惧淇℃伅 + var d = models.Device{ + Id: id, + } + + err := d.Upsert() + if err != nil { + logger.Warn("Device db update camera error:%s", err.Error()) + } + deviceAliveCache.Add(id, true) } diff --git a/service/nvcs.go b/service/nvcs.go index 2848e6a..b2e9124 100644 --- a/service/nvcs.go +++ b/service/nvcs.go @@ -91,9 +91,13 @@ } elevator := data.Elevator[0] - elevator.Name = strings.Trim(elevator.Name, " ") - if elevator.Name == "" { - continue + + // 绋嬪簭閮ㄧ讲鍦ㄨ澶囩, 瀛楃鍙犲姞鍣ㄤ笂鎶ョ殑鍚嶇О鍏佽涓虹┖. 鍦ㄤ簯绔�, 鍚嶇О蹇呴』涓庢憚鍍忔満鐩稿悓 + if !config.ClientConf.Enable { + elevator.Name = strings.Trim(elevator.Name, " ") + if elevator.Name == "" { + continue + } } var d = models.Device{ diff --git a/service/resend.go b/service/resend.go index 7cac1a9..e56ffc1 100644 --- a/service/resend.go +++ b/service/resend.go @@ -1,10 +1,12 @@ package service import ( + "gat1400Exchange/client" "gat1400Exchange/config" "gat1400Exchange/models" "gat1400Exchange/pkg/logger" "gat1400Exchange/util" + "gat1400Exchange/vo" ) func ResendImageData() { @@ -18,13 +20,22 @@ } for _, c := range cacheItems { - if !util.SendData([]byte(c.Data), config.ForwardConf.SyncServer) { - c.UpdateRetryCount() - logger.Warn("The data resend failed. retry count %d", c.Retry+1) + if c.Type == "1400" { + if client.FaceCapture([]byte(c.Data)) != vo.StatusSuccess { + c.UpdateRetryCount() + logger.Warn("The data resend failed. retry count %d", c.Retry+1) + continue + } } else { - c.Delete() - logger.Debug("The data resend successful.") + if !util.SendData([]byte(c.Data), config.ForwardConf.SyncServer) { + c.UpdateRetryCount() + logger.Warn("The data resend failed. retry count %d", c.Retry+1) + continue + } } + + c.Delete() + logger.Debug("The data resend successful.") } } -- Gitblit v1.8.0