| | |
| | | import ( |
| | | "encoding/json" |
| | | "errors" |
| | | uuid "github.com/satori/go.uuid" |
| | | "net" |
| | | "strconv" |
| | | "time" |
| | | |
| | | "nanomsg.org/go-mangos" |
| | | "nanomsg.org/go-mangos/protocol/req" |
| | | "nanomsg.org/go-mangos/transport/tcp" |
| | | "github.com/knetic/govaluate" |
| | | logger "github.com/alecthomas/log4go" |
| | | "basic.com/valib/logger.git" |
| | | |
| | | "basic.com/pubsub/protomsg.git" |
| | | "ruleprocess/structure" |
| | |
| | | //logger.Debug("---------走了人员异常算法", rule.Id, rule.SdkArgAlias, rule.Operator, rule.SdkArgValue, am.AreaId) |
| | | if rule.SdkArgAlias == "score" || rule.SdkArgAlias == "proportion" || rule.SdkArgAlias == "size" || rule.SdkArgAlias == "" { // 判断的是相似值,占比,尺寸等过滤条件,如果再有,还可以再加 |
| | | return filterRule(rule, am) |
| | | } else if rule.SdkArgAlias == "threshold"{ |
| | | } else if rule.SdkArgAlias == "cmpThreshold"{ |
| | | return track(rule,am) |
| | | } |
| | | return structure.LittleRuleResult{} |
| | |
| | | // 给目标填充liker |
| | | func fillLiker(compareThreshold float32,arg *structure.Arg,am *structure.AreaMap) { |
| | | trackArg := make(map[string]interface{}) |
| | | trackArg["esId"] = "" |
| | | esId := uuid.NewV4().String() |
| | | trackArg["esId"] = esId |
| | | trackArg["threshold"] = compareThreshold |
| | | trackArg["cameraId"] = am.CameraId |
| | | trackArg["bodyFeature"] = arg.Feature |
| | | trackArg["faceFeature"] = arg.AttachArg.Feature |
| | | b,err := json.Marshal(trackArg) |
| | | if err != nil { |
| | | _ = logger.Error("json序列化错误", err) |
| | | logger.Error("json序列化错误", err) |
| | | } |
| | | esId := getCompareMsg(b) |
| | | logger.Info("比对出来的esid:",esId) |
| | | base := structure.BaseInfo{TargetId:esId} |
| | | arg.Liker = append(arg.Liker, &base) |
| | | dataId := getCompareMsg(b) |
| | | if esId == dataId { // 说明没比到相似的人 |
| | | logger.Info("没比到人") |
| | | arg.Uuid = dataId |
| | | } else { |
| | | logger.Info("比对出来的dataId:",dataId) |
| | | base := structure.BaseInfo{TargetId:dataId} |
| | | arg.Liker = append(arg.Liker, &base) |
| | | } |
| | | } |
| | | |
| | | func track (rule *protomsg.Rule,am *structure.AreaMap) structure.LittleRuleResult{ |
| | |
| | | if th,err := strconv.ParseFloat(rule.SdkArgValue,32); err == nil { |
| | | threshold = float32(th) |
| | | } |
| | | for i, arg := range am.FilterData { |
| | | for _, arg := range am.FilterData { |
| | | fillLiker(threshold,arg,am) |
| | | if len(arg.Liker) == 0 { |
| | | // 如果没有相似者则删除本目标数据 |
| | | am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...) |
| | | } |
| | | //if len(arg.Liker) == 0 { |
| | | // // 如果没有相似者则删除本目标数据 |
| | | // am.FilterData = append(am.FilterData[:i],am.FilterData[i+1:]...) |
| | | //} |
| | | } |
| | | if len(am.FilterData) > 0 { |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } else { |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | } |
| | | //if len(am.FilterData) > 0 { |
| | | // return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | //} else { |
| | | // return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "false", rule.Sort} |
| | | //} |
| | | // 无论有没有相似者都要返回true |
| | | return structure.LittleRuleResult{am.SdkName, rule.RuleWithPre + "" + "true", rule.Sort} |
| | | } |
| | | |
| | | func Push(){ |
| | |
| | | var msg []byte |
| | | |
| | | if sock, err = req.NewSocket(); err != nil { |
| | | _ = logger.Error("创建请求socket失败: %s", err.Error()) |
| | | logger.Error("创建请求socket失败: %s", err.Error()) |
| | | } |
| | | errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024) |
| | | if errSize != nil { |
| | | _ = logger.Error("Failed set MaxRecvSize: %v", err) |
| | | logger.Error("Failed set MaxRecvSize: %v", err) |
| | | } |
| | | //sock.AddTransport(ipc.NewTransport()) |
| | | sock.AddTransport(tcp.NewTransport()) |
| | | serverIP, _ := GetLocalIP() |
| | | if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil { |
| | | _ = logger.Error("请求socket拨号失败: %s", err.Error()) |
| | | logger.Error("请求socket拨号失败: %s", err.Error()) |
| | | } |
| | | logger.Info("序列化数据") |
| | | initFlag = true |
| | | for { |
| | | select { |
| | | // case <-ctx.Done(): |
| | | // return |
| | | case data := <- sender: |
| | | |
| | | logger.Info("数据长度为:",len(data)) |
| | | |
| | | logger.Debug("推送数据") |
| | | logger.Debug("推送数据:",len(data)) |
| | | if err = sock.Send(data); err != nil { |
| | | _ = logger.Error("推送socket发送数据失败: %s", err.Error()) |
| | | logger.Error("推送socket发送数据失败: %s", err.Error()) |
| | | } |
| | | if msg, err = sock.Recv(); err != nil { |
| | | _ = logger.Error("接收响应失败: %s", err.Error()) |
| | | logger.Error("接收响应失败: %s", err.Error()) |
| | | } |
| | | logger.Debug("数据推送成功!收到响应,数据长度为:",len(msg)) |
| | | receiver <- string(msg) |
| | | default: |
| | | |
| | | time.Sleep(time.Millisecond * 10) |
| | | } |
| | | } |
| | | } |