panlei
2019-07-11 69a44e03958e215b6d90b89576f79ac445c01355
更新cache,比对,和定时器
4个文件已修改
86 ■■■■■ 已修改文件
go.mod 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.sum 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/timeTicker.go 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.mod
@@ -4,7 +4,7 @@
require (
    basic.com/dbapi.git v0.0.0-20190701055817-73bca225181f
    basic.com/pubsub/cache.git v0.0.0-20190710092005-5d7ea0a4cbbc
    basic.com/pubsub/cache.git v0.0.0-20190711020946-ac4bfc72bf9c
    basic.com/pubsub/protomsg.git v0.0.0-20190709070734-b34c868adcc2
    basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051
    basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28
go.sum
@@ -4,6 +4,8 @@
basic.com/pubsub/cache.git v0.0.0-20190708074039-d25f504c5fab/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/cache.git v0.0.0-20190710092005-5d7ea0a4cbbc h1:WLWAYTyMflMnuO31RBCGJizG6Cx+xF0IRECpSNgvghs=
basic.com/pubsub/cache.git v0.0.0-20190710092005-5d7ea0a4cbbc/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/cache.git v0.0.0-20190711020946-ac4bfc72bf9c h1:Gvhzx2JB97gHX9800NSzpUTNlcq5eJyo/EWAnzH6c6Y=
basic.com/pubsub/cache.git v0.0.0-20190711020946-ac4bfc72bf9c/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/protomsg.git v0.0.0-20190708093242-02e81455712c h1:p6bCit0NDQvC9ziK9Zf815LXgTYWxjr4mn99gcdehyk=
basic.com/pubsub/protomsg.git v0.0.0-20190708093242-02e81455712c/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
basic.com/pubsub/protomsg.git v0.0.0-20190709070734-b34c868adcc2 h1:ygh9CQPS48KmXv+PNUrOcrMqIiDZOs11apnQdu9oGEY=
ruleserver/ruleToformula.go
@@ -247,7 +247,7 @@
        if groupRule.Rules[j].SdkId == "812b674b-2375-4589-919a-5c1c3278a972" {
            for _, sdkData := range args.Sdkdata {
                if sdkData.IpcId == "A8B73405-373D-4F23-CED2-A617EBD7EC55" { // 搜索到人脸检测的sdkdata 现在关于人脸的只有他一个sdk,全找他
                logger.Info("============================================第一关")
                    logger.Info("============================================第一关")
                    for _, areaMap := range sdkData.AreaMapList {
                        // 拿区域中每个人脸特征值去对比,填充其liker
                        if groupRule.Rules[j].PolygonId == areaMap.areaId {
@@ -259,14 +259,14 @@
                                    if err1 != nil {
                                        logger.Error("getBaseInfo解压错误", err1)
                                    }
                                    logger.Info("----------------------------------------map是",m)
                                    logger.Info("----------------------------------------map是", m)
                                    for key, val := range m {
                                        logger.Info("_______________________________________对比库的返回值",key,val)
                                        logger.Info("_______________________________________对比库的返回值", key, val)
                                        baseinfo, err1 := esutil.Dbpersoninfosbyid(key)
                                        if err1 != nil {
                                            logger.Error("查询底库人员信息出错", err1)
                                        }
                                        baseinfo.CompareScore = val
                                        baseinfo.CompareScore = val * 100
                                        arg.Liker = append(arg.Liker, &baseinfo)
                                    }
                                }
@@ -304,7 +304,7 @@
            logger.Error("比对规则有误", err.(string))
        }
    }()
    logger.Info("+++++++++++规则开始运行+++++++++++++++++当前规则--:", *groupRule)
    logger.Info("+++++++++++规则开始运行+++++++++++++++++当前大规则--:", *groupRule)
    Compare(args, groupRule)
    resultSplice := []*LittleRuleResult{}
    sdkNames := ""
@@ -393,7 +393,8 @@
            ipcId := sdk.IpcId
            if ipcId == sdkData.IpcId {
                for _, areaMap := range sdkData.AreaMapList {
                    duration(groupRule.Rules[j], &areaMap, args)
                    // 去开启一个定时器
                    duration(groupRule.Rules[j], groupRule.GroupId, &areaMap, args)
                }
            }
        }
@@ -429,7 +430,7 @@
            // 给这帧数据打上规则组标签
            //args.RuleResult = append(args.RuleResult, Result{TaskId: taskId, RuleGroupId: groupRule.GroupId})
            for k, timeEle := range TimeEleList {
                if strings.Contains(k, taskId) {
                if strings.Contains(k, groupRule.GroupId) {
                    timeEle.N = timeEle.InitN // 重置定时器
                }
            }
@@ -438,16 +439,15 @@
        } else {
            // 判断持续时间条件,去看池子里是否有与本帧数据有关的定时器,如果有,看此时是否走到0,没有此定时器或有定时器走到0的话返回成功报警
            var flag bool = true
            logger.Info("flag 是:",flag)
            for k, timeEle := range TimeEleList {
                if strings.Contains(k, taskId) {
                    if timeEle.N != 0 { // 跟这个任务有关的定时器要全部等于0
                if strings.Contains(k, groupRule.GroupId) {
                    if timeEle.N != 0 { // 这组规则的定时器要全部等于0
                        logger.Info("———————————-------------不冤,你是被定时器打败的:")
                        flag = false
                    }
                }
            }
            if true {
            if flag {
                // 最后成功报警才把符合条件的人脸数据塞进结果标签里
                // 配了人脸的算法才把人脸的数据甩出来打标签
                logger.Info("------------------------------最后一关")
@@ -493,6 +493,23 @@
    } else {
        return false
    }
}
func TimerAlarm(groupId string) (int){
    var flagTime int = 0
    for k, timeEle := range TimeEleList {
        if strings.Contains(k, groupId) {
            if timeEle.N == 0 && !timeEle.AlarmFlag { // 这组规则的定时器要全部等于0   暂且认为一组规则只有一个定时器
                logger.Info("———————————-------------首次符合持续时间规则并报警")
                flagTime = 1
                timeEle.AlarmFlag = true
            }
            if timeEle.N == 0 && timeEle.AlarmFlag {
                logger.Info("-------------------------符合持续时间规则但并不是首次,不报警")
                flagTime = 2
            }
        }
    }
    return flagTime
}
func putFaceToResult(am *AreaMap) []Arg {
@@ -797,14 +814,14 @@
    }
}
// 都过滤完条件之后看看是否满足持续时间条件
func duration(rule *protomsg.Rule, am *AreaMap, args *SdkDatas) {
// 如果有持续时间条件维护开启一个定时器
func duration(rule *protomsg.Rule, groupId string, am *AreaMap, args *SdkDatas) {
    if rule.PolygonId == am.areaId { // 首先规则所对应的区域id要跟区域数据的id对的上  配置的算法要对的上
        if rule.SdkArgAlias == "duration" { //
            // 先看看定时器元素队列中是否有这个摄像机这个区域的定时器,如果有就不能再次创建了
            var flag bool = true
            for k,_ := range TimeEleList {
                if k == am.taskId+" "+am.sdkId+" "+am.areaId {
            for k, _ := range TimeEleList {
                if k == groupId+" "+rule.Id {
                    flag = false // 有就置为false
                    logger.Info("有这个定时器,不再创建了:")
                }
@@ -812,9 +829,9 @@
            if flag {
                timeLength, _ := strconv.Atoi(rule.SdkArgValue)
                timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, CacheSdkData: *args} // 扔进去一个定时器元素
                timeEle := TimeElement{N: timeLength, InitN: timeLength, AlarmFlag: false, CacheSdkData: *args} // 扔进去一个定时器元素(并缓存当前画面帧数据)
                //TimeEleList = make(map[string]timeElement)
                TimeEleList[am.taskId+" "+am.sdkId+" "+am.areaId] = &timeEle // 定时器元素以摄像机id拼接区域id为键
                TimeEleList[groupId+" "+rule.Id] = &timeEle // 定时器元素以摄像机id拼接区域id为键
                logger.Info("创建了计数器并且计数器集合为:", TimeEleList)
            }
        }
ruleserver/timeTicker.go
@@ -46,7 +46,7 @@
                        logger.Info("-------------------------------------打印定时器元素当前值-----------------------------------------:", timeEle.N)
                    }
                    if timeEle.GroupId != "" && timeEle.N == 0{
                        // 说明是联动任务的时间窗口 到点儿了该销毁了,再来了再开启
                        // 说明是联动任务的时间窗口 到点儿了该销毁了,再来了再创建
                        delete(TimeEleList,k)
                    }
                }
@@ -65,35 +65,6 @@
    TimeTicker()
}
// 定时器单元  废弃版本
// func TimeTicker() chan bool {
//     logger.Info("执行了timeTicker")
//     ticker := time.NewTicker(1 * time.Second)
//     stopChan := make(chan bool)
//     go func(ticker *time.Ticker) {
//         defer ticker.Stop()
//         for {
//             select {
//             case <-ticker.C:
//                 //logger.Info("执行单元", "计数器集合2", TimeEleList)
//                 for k, timeEle := range TimeEleList {
//                     timeEle.n = timeEle.n - 1
//                     //logger.Info("遍历的数值", TimeEleList)
//                     if timeEle.n == 0 {
//                         // do something alarm
//                         alarm(k, timeEle)
//                     }
//                 }
//             case stop := <-stopChan:
//                 if stop {
//                     logger.Info("定时器结束")
//                     return
//                 }
//             }
//         }
//     }(ticker)
//     return stopChan
// }
// 结构体根据某字段排序
type SubList []*RuleResult