panlei
2019-09-10 e2aab518eddae165b9a7c517fbaddaf692ac4070
merge labelFilter
9个文件已修改
369 ■■■■■ 已修改文件
go.mod 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.sum 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
insertdata/insertDataToEs.go 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/readyDataForRule.go 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/ruleToformula.go 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruleserver/timeTicker.go 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/common.go 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
util/upload.go 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
go.mod
@@ -5,7 +5,7 @@
require (
    basic.com/dbapi.git v0.0.0-20190822081128-ce924b8a905f
    basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48
    basic.com/pubsub/protomsg.git v0.0.0-20190822060153-dc8ca60fc531
    basic.com/pubsub/protomsg.git v0.0.0-20190824080957-7b44351cb40b
    basic.com/pubsub/sdkcompare.git v0.0.0-20190715013640-f536a4647d00
    basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051
    basic.com/valib/gopherdiscovery.git v0.0.0-20190605034340-15d89d8b4e28
go.sum
@@ -1,23 +1,6 @@
basic.com/dbapi.git v0.0.0-20190701055817-73bca225181f h1:CVB4pmUXTPPFN7w/DQfU1YWg2Tp2gG93TTr1M5W86sE=
basic.com/dbapi.git v0.0.0-20190701055817-73bca225181f/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
basic.com/dbapi.git v0.0.0-20190724082851-b6ae90344405 h1:BJzdtGipKxQAaptrwUNOVQZ3Qx4jbeAf72wkqBmm5vE=
basic.com/dbapi.git v0.0.0-20190724082851-b6ae90344405/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
basic.com/dbapi.git v0.0.0-20190822035835-8e0e9514983b h1:rgPZYF2rIPESZo6zKWgRnP3nzslEY3ZMeWjr0CVIL2g=
basic.com/dbapi.git v0.0.0-20190822035835-8e0e9514983b/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
basic.com/dbapi.git v0.0.0-20190822081128-ce924b8a905f h1:m7ONW0VqagpmWppr6GSa2Gykid202vCbV9worYCM+pg=
basic.com/dbapi.git v0.0.0-20190822081128-ce924b8a905f/go.mod h1:eDXPnxaz6jZPDvBSk7ya7oSASWPCuUEgRTJCjsfKt/Q=
basic.com/pubsub/cache.git v0.0.0-20190712095028-e73efb4afc3b h1:UAasACFqEYUBCuZkkdxYVc1QmSyB7McvNHS36QxDJp4=
basic.com/pubsub/cache.git v0.0.0-20190712095028-e73efb4afc3b/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/cache.git v0.0.0-20190718024458-be52360c4814 h1:KoSik/aiJNDt3d+qRKExLW4pNHZ7vU1wXHhWXxZi4qo=
basic.com/pubsub/cache.git v0.0.0-20190718024458-be52360c4814/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48 h1:BBA30Rgljn6MRieC4gUncETJDyna3ObyubTo9HEQ2M0=
basic.com/pubsub/cache.git v0.0.0-20190718093725-6a413e1d7d48/go.mod h1:gHLJZz2ee1cGL0X0ae69fs56bAxkDgEQwDhhXZJNUcY=
basic.com/pubsub/protomsg.git v0.0.0-20190801122504-ad6c105f7a2b h1:2eskhTo22eo07AmAj3xVo31U/+qRFf6P1qhlfxoaFOc=
basic.com/pubsub/protomsg.git v0.0.0-20190801122504-ad6c105f7a2b/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
basic.com/pubsub/protomsg.git v0.0.0-20190821115153-4d63ce5655e6 h1:qusWXX8/w5kEzDRadRAlag956j72bcKvhaIEF/5f5k0=
basic.com/pubsub/protomsg.git v0.0.0-20190821115153-4d63ce5655e6/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
basic.com/pubsub/protomsg.git v0.0.0-20190822060153-dc8ca60fc531 h1:XsygHuAqvEovNNOiG80qLoV9OtdcN8IPP+xv/Ajx+Eg=
basic.com/pubsub/protomsg.git v0.0.0-20190822060153-dc8ca60fc531/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
basic.com/pubsub/protomsg.git v0.0.0-20190824080957-7b44351cb40b/go.mod h1:un5NV5VWQoblVLZfx1Rt5vyLgwR0jI92d3VJhfrJhWU=
basic.com/pubsub/sdkcompare.git v0.0.0-20190715013640-f536a4647d00 h1:sK+Tx7rvM9J2WnNIwrzMDjZSylWiKNfQO0prUBfKsDk=
basic.com/pubsub/sdkcompare.git v0.0.0-20190715013640-f536a4647d00/go.mod h1:8by33F9E1w17Pw/rDgJGJXAo122w0wDENG14hiMS+RE=
basic.com/valib/deliver.git v0.0.0-20190531095353-25d8c3b20051 h1:9flC2o3kasaM2Y6I+mY+mxmve/pyAY/UzGQZLT3lFHM=
insertdata/insertDataToEs.go
@@ -9,7 +9,6 @@
    "net"
    "ruleprocess/cache"
    "ruleprocess/logger"
    "ruleprocess/structure"
    "time"
    "basic.com/pubsub/protomsg.git"
@@ -111,6 +110,7 @@
    RuleText     string `json:"ruleText"`
    DefenceState bool   `json:"defenceState"`
    IsLink         bool    `json:"isLink"`
    LinkInfo     string `json:"linkInfo"`
}
// 一个face对多个规则组的归置人脸的结构体
@@ -181,7 +181,7 @@
                //os.Exit(1)
                for _,faceResult := range face.rules {
                    alarm := ChangeToString(faceResult.DefenceState, faceResult.AlarmLevel)
                    alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState,faceResult.IsLink})
                    alarmRules = append(alarmRules, AlarmRule{faceResult.RuleGroupId, alarm, faceResult.RuleText, faceResult.DefenceState,faceResult.IsLink,""})
                }
                i := protomsg.Image{}
                err = proto.Unmarshal(bdata, &i)
@@ -204,7 +204,7 @@
                if err != nil {
                    logger.Error("上传小图出错")
                }
                logger.Info("================小图地址:", resp["fileUrl"].(string))
                //logger.Info("================小图地址:", resp["fileUrl"].(string))
                sex := ""
                if face.ThftRes.Gender == 1 {
                    sex = "男"
@@ -337,7 +337,11 @@
                    //logger.Info("应该进来才对的")
                    sdkNames = sdkNames + yoloResult.SdkName
                    alarm := ChangeToString(yoloResult.DefenceState, yoloResult.AlarmLevel)
                    alarmRules = append(alarmRules, AlarmRule{yoloResult.RuleGroupId, alarm, yoloResult.RuleText, yoloResult.DefenceState,yoloResult.IsLink})
                    linkInfo := ""
                    if yoloResult.IsLink {
                        linkInfo = "联动任务"
                    }
                    alarmRules = append(alarmRules, AlarmRule{yoloResult.RuleGroupId, alarm, yoloResult.RuleText, yoloResult.DefenceState,yoloResult.IsLink,linkInfo})
                    // 上传缓存数据的图片拿到url
                    if yoloResult.Others.CacheData != nil {
                        //InsertYolo(msg.RuleResult["cacheData"].(ruleserver.ResultMsg))
@@ -395,6 +399,7 @@
                resp, err = util.DrawPolygonOnImage(msg.Cid, i, msg.RuleResult["yolo"].([]structure.Result), weedfsUrl)
                if err != nil {
                    logger.Error("画框或上传图片服务器出错", err)
                    return
                } else {
                    logger.Info("上传的图片信息:", resp)
                }
@@ -415,52 +420,90 @@
                logger.Error("查询摄像机信息失败")
            }
            serverIp, err := GetLocalIP()
            if resp["fileUrl"] != nil {
                url = append(url, resp["fileUrl"].(string))
                esDataId := uuid.NewV4().String()
                linksId := ""
                if linkId != "" {
                    linksId = linkId
                }
                peraction := Personaction{
                    esDataId,
                    msg.Cid,
                    camera.Name,
                    camera.Addr,
                    msg.Tasklab.Taskid,
                    msg.Tasklab.Taskname,
                    sdkNames,
                    "",
                    alarmRules,
                    localConfig.ServerId,
                    localConfig.ServerName,
                    serverIp,
                    "",
                    url,
                    i.Timestamp,
                    linksId,
                    "",
                    isAlarm,
                    0,
                    0,
                    0,
                }
                requstbody, err := json.Marshal(peraction)
            url = append(url, resp["fileUrl"].(string))
            esDataId := uuid.NewV4().String()
            linksId := ""
            if linkId != "" {
                linksId = linkId
            }
            peraction := Personaction{
                esDataId,
                msg.Cid,
                camera.Name,
                camera.Addr,
                msg.Tasklab.Taskid,
                msg.Tasklab.Taskname,
                sdkNames,
                "",
                alarmRules,
                localConfig.ServerId,
                localConfig.ServerName,
                serverIp,
                "",
                url,
                i.Timestamp,
                linksId,
                "",
                isAlarm,
                0,
                0,
                0,
            }
            requstbody, err := json.Marshal(peraction)
//<<<<<<< HEAD
//            url = append(url, resp["fileUrl"].(string))
//            esDataId := uuid.NewV4().String()
//            linksId := ""
//            if linkId != "" {
//                linksId = linkId
//            }
//            peraction := Personaction{
//                esDataId,
//                msg.Cid,
//                camera.Name,
//                camera.Addr,
//                msg.Tasklab.Taskid,
//                msg.Tasklab.Taskname,
//                sdkNames,
//                "",
//                alarmRules,
//                localConfig.ServerId,
//                localConfig.ServerName,
//                serverIp,
//                "",
//                url,
//                i.Timestamp,
//                linksId,
//                "",
//                isAlarm,
//                0,
//                0,
//                0,
//            }
//            requstbody, err := json.Marshal(peraction)
//
//            if err != nil {
//                logger.Info("json parse error ", err)
//                return
//=======
                if err != nil {
                    logger.Info("json parse error ", err)
                    return
//>>>>>>> labelFilter
            if err != nil {
                logger.Info("json parse error ", err)
                return
            }
            resp1, err2 := EsReq("POST", personAction, requstbody)
            if err2 != nil {
                logger.Error("往ES插入数据失败", err)
            } else {
                logger.Debug("插入es返回的数据信息是:", resp1)
                // 发出录像信号
                ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 2})
                logger.Warn("__________________________________________往ES插入yolo数据成功")
                //os.Exit(1)
                }
                resp1, err2 := EsReq("POST", personAction, requstbody)
                if err2 != nil {
                    logger.Error("往ES插入数据失败", err)
                } else {
                    logger.Debug("插入es返回的数据信息是:", resp1)
                    // 发出录像信号
                    ruleserver.AddLxMessage(&protomsg.VideotapeInfo{EsDataId: esDataId, CameraId: msg.Cid, TaskId: msg.Tasklab.Taskid, ImgId: i.Id, SdkIds: []string{}, Type: 2})
                    logger.Warn("__________________________________________往ES插入yolo数据成功")
                    //os.Exit(1)
                }
            }
        } else {
            logger.Debug("timeLabel条件都不符合!")
main.go
@@ -4,6 +4,8 @@
    "basic.com/dbapi.git"
    "basic.com/pubsub/protomsg.git"
    "basic.com/valib/deliver.git"
    "net/http"
    _ "net/http/pprof"
    "ruleprocess/insertdata"
    "ruleprocess/structure"
    "ruleprocess/util"
@@ -37,14 +39,17 @@
}
func main() {
    //fmt.Println("缓存初始化完成",<- initchan)//dbserver初始化完毕
    go func() {
        http.ListenAndServe("0.0.0.0:8899",nil)
    }()
    flag.Parse()
    wg := sync.WaitGroup{}
    wg.Add(2)
    wg.Add(3)
    dbapi.Init(*dbIp, *dbPort)
    go cache.Init(initchan, *dbIp, *surveyPort, *pubPort)
    logger.Info("cache init completed!!!", <-initchan) //dbserver初始化完毕
    //fmt.Println("缓存初始化完成",<- initchan)//dbserver初始化完毕
    ruleserver.Init()
    go ruleserver.TimeTicker()
    go ruleserver.StartServer()
ruleserver/readyDataForRule.go
@@ -1,8 +1,8 @@
package ruleserver
import (
    "basic.com/dbapi.git"
    bigCache "basic.com/pubsub/cache.git"
    "basic.com/pubsub/cache.git/esutil"
    "basic.com/pubsub/protomsg.git"
    "encoding/json"
    "errors"
@@ -17,7 +17,6 @@
    "net"
    "ruleprocess/cache"
    "ruleprocess/logger"
    "ruleprocess/structure"
    "strconv"
    "time"
)
@@ -52,12 +51,25 @@
    }
    logger.Debug("本机信息和server信息:", localConfig, serverIp, serverPort)
    bigCache.Init(dbTablePersons, serverIp, serverPort, localConfig.ServerId)
    sock, err = req.NewSocket();
    if err != nil {
        logger.Error("创建请求socket失败: %s", err.Error())
    }
    go Push1()
}
var sender chan *protomsg.CompareArgs = make(chan *protomsg.CompareArgs)
var receiver chan []byte = make(chan []byte)
type BaseInfo struct {
    TableId      string  `json:"tableId"`
    TableName    string  `json:"tableName"`
    BwType       string  `json:"bwType"`
    CompareScore float64 `json:"compareScore"`
    PersonId     string  `json:"personId"`
    PersonName   string  `json:"personName"`
    PersonPicUrl string  `json:"personPicUrl"`
    PhoneNum     string  `json:"phoneNum"`
    Sex          string  `json:"sex"`
    IdCard       string  `json:"idCard"`
    MonitorLevel string  `json:"monitorLevel"`
    Content      string  `json:"content"`
}
// 以摄像机id查出跟其相关的所有任务下的所有规则组
func GetRuleGroup(cameraId string, taskId string) *protomsg.TaskGroupArgs {
@@ -155,12 +167,13 @@
        CompareThreshold:compareThreshold,
        Source:false,
    }
    serverIp, _ := GetLocalIP()
    bytes := Push("tcp://"+serverIp+":40010",comArg,sock)
    bytes := getCompareMsg(comArg)
    var scResult protomsg.SdkCompareResult
    err1 := proto.Unmarshal(bytes, &scResult)
    if err1 != nil {
        logger.Error("getBaseInfo解压错误", err1)
        return
    }
    //logger.Info("----------------------------------------map是", m)
    ids := []string{}
@@ -172,16 +185,20 @@
    logger.Info("------------------------------------------------------------------------------------------------------------------------")
    //logger.Info("=====================人员id的集合为:",ids)
    if len(ids) > 0 {
        baseinfos, err1 := esutil.Dbpersoninfosbyid(ids, dbTablePersons, serverIp, serverPort)
        var dbApi dbapi.DbPersonApi
        baseinfos, err1 := dbApi.Dbpersoninfosbyid(ids)
        //baseinfos, err1 := esutil.Dbpersoninfosbyid(ids, dbTablePersons, serverIp, serverPort)
        if err1 != nil {
            logger.Error("查询底库人员信息出错", err1)
        }
        var dtapi dbapi.DbTableApi
        for _, baseinfo := range baseinfos {
            // 根据tableId查询底库信息给liker赋值
            //logger.Info("---------看看每个底库人员的信息:",baseinfo.Id,baseinfo.PersonName)
            tableIds := []string{}
            tableIds = append(tableIds, baseinfo.TableId) // 虽然是传入数组返回数组的接口,但我按单个的使用了
            table, err := esutil.Dbtablefosbyid(tableIds, "dbtables", serverIp, serverPort)
            table, err := dtapi.DbtablesById(tableIds)
            //table, err := esutil.Dbtablefosbyid(tableIds, "dbtables", serverIp, serverPort)
            if err != nil || len(table) == 0 {
                logger.Error("根据id查询底库信息出错!", err, "--返回值长度为:", len(table))
            }
@@ -286,10 +303,10 @@
            a.FilterData = append(a.FilterData, &arg1)
        }
    }
    logger.Info("区域是:",areaPoints,"装配完数据区域内目标数量为:",a.TargetNum)
    a.Time = time.Unix(time.Now().Unix(), 0).String()[11:16]
    a.KeepRight = arg.KeepRight
    a.IsStatic = arg.IsStatic
    logger.Info("区域是:",areaPoints,"区域内目标数量为:",a.targetNum,"---",len(a.filterData))
    a.time = time.Unix(time.Now().Unix(), 0).String()[11:16]
    a.keepRight = arg.KeepRight
    a.isStatic = arg.IsStatic
    //logger.Println("--------------------看看区域数据:",*a)
}
@@ -308,7 +325,7 @@
    }
}
func Push(url string,data *protomsg.CompareArgs,sock mangos.Socket) []byte{
func Push(data *protomsg.CompareArgs,sock mangos.Socket) []byte{
    //var sock mangos.Socket
    var err error
    var msg []byte
@@ -321,11 +338,13 @@
        logger.Error("Failed set MaxRecvSize: %v", err)
        return nil
    }
    //sock.AddTransport(ipc.NewTransport())
    sock.AddTransport(tcp.NewTransport())
    if err = sock.Dial(url); err != nil {
    serverIP, _ := GetLocalIP()
    if err = sock.Dial("tcp://"+serverIP+":4010"); err != nil {
        logger.Error("请求socket拨号失败: %s", err.Error())
    }
    //sock.AddTransport(ipc.NewTransport())
    sock.AddTransport(tcp.NewTransport())
    logger.Info("序列化数据")
    bytes,err1 := proto.Marshal(data)
    logger.Info("数据长度为:",len(bytes))
@@ -346,6 +365,57 @@
    return msg
}
func Push1(){
    //var sock mangos.Socket
    var err error
    var msg []byte
    if sock, err = req.NewSocket(); err != nil {
        logger.Error("创建请求socket失败: %s", err.Error())
    }
    errSize := sock.SetOption(mangos.OptionMaxRecvSize,5*1024*1024)
    if errSize != nil {
        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.Info("序列化数据")
    for {
        select {
        // case <-ctx.Done():
        //     return
        case data := <- sender:
            bytes,err1 := proto.Marshal(data)
            logger.Info("数据长度为:",len(bytes))
            if err1 != nil {
                logger.Info("序列化失败:",err1)
            }
            logger.Debug("推送数据")
            //bytes := []byte("ndfasojdfaidsos")
            if err = sock.Send(bytes); err != nil {
                logger.Error("推送socket发送数据失败: %s", err.Error())
                //os.Exit(1)
            }
            if msg, err = sock.Recv(); err != nil {
                logger.Error("接收响应失败: %s", err.Error())
                //os.Exit(1)
            }
            logger.Debug("数据推送成功!收到响应,数据长度为:",len(msg))
            receiver <- msg
        default:
        }
    }
}
func getCompareMsg(data *protomsg.CompareArgs) []byte{
    sender <- data
    return <-receiver
}
// 获取本机ip
func GetLocalIP() (ipv4 string, err error) {
    var (
@@ -372,4 +442,4 @@
    err = errors.New("ipv4 not found")
    return
}
}
ruleserver/ruleToformula.go
@@ -20,7 +20,7 @@
        // 拿到本摄像机的区域
        cameraPolygons := GetPolygons(args.CameraId)
        // 把所有的sdk提取的数据都按所属摄像机的区域归置
        //logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname)
        logger.Debug("当前摄像机id为:",message.Cid,"当前摄像机执行的任务是:",message.Tasklab.Taskname,"--任务id为:",message.Tasklab.Taskid)
        for _, arg := range args.Sdkdata {
            SdkDataFormat(args.CameraId, arg, cameraPolygons)
        }
@@ -64,7 +64,7 @@
    }
}
func RunRule1(args *structure.SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label structure.Others) bool {
func RunRule(args *SdkDatas, groupRule *protomsg.GroupRule, taskId string, message *protomsg.SdkMessage, label Others) (bool,[]int) {
    defer func() {
        if err := recover(); err != nil {
            logger.Error("比对规则有误", err)
@@ -231,6 +231,7 @@
                        }
                    }
                }
                logger.Info("face标签的长度:",len(faces))
                //for _,face := range faces  {
                //    //logger.Debug("————————————————________________看看人脸的坐标:",face.Location)
                //}
@@ -251,27 +252,30 @@
                } else {
                    islink = false
                }
                var labelTypes []int // 0为yolo标签,1为face标签 2为两者标签
                if sdkNames != "" {
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]structure.Result), structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, islink, label,})
                    args.RuleResult["yolo"] = append(args.RuleResult["yolo"].([]Result), Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, locations, polygonId, islink,label,})
                    labelTypes = append(labelTypes,0)
                    //logger.Info("-------------------yolo结果标签长度", len(args.RuleResult["yolo"].([]Result)))
                }
                if faceFlag {
                    args.RuleResult["face"] = append(args.RuleResult["face"].([]structure.FaceResult), structure.FaceResult{structure.Result{taskId, sdkNames, groupRule.GroupId, groupRule.DefenceState, groupRule.AlarmLevel, groupRule.GroupText, []structure.Rect{}, polygonId, islink, label,}, faces})
                    //logger.Info("-------------------face结果标签", len(args.RuleResult["face"].([]FaceResult)))
                    labelTypes = append(labelTypes,1)
                }
                return true
                return true,labelTypes
            } else {
                return false
                return false,[]int{}
            }
        } else {
            // 结果为假时也要走,有时候为假的状态反转数据也需要记录下来
            // 结果为假时也要走,有杀死定时器的操作
            TimerAlarm(&label, groupRule.GroupId, result.(bool))
            //fmt.Println(timeFlag)
            return false
            return false,[]int{}
        }
    } else {
        return false
        return false,[]int{}
    }
}
@@ -336,7 +340,7 @@
        }
    }
    // 往数组里赋值
    isOk := RunRule(args, groupRule, taskId, message, label)
    isOk,labelTypes := RunRule(args, groupRule, taskId, message, label)
    if isOk {
        logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为true")
        // 根据cameraId去更新或者插入结果,然后判断是否数组是否可以得出报警的结论
@@ -409,8 +413,20 @@
        } else {
            logger.Warn("数组不圆满不打标签")
            // 倒是把打的组规则标签给去掉了啊
            lens := len(args.RuleResult["yolo"].([]structure.Result)) - 1
            args.RuleResult["yolo"] = args.RuleResult["yolo"].([]structure.Result)[0:lens]
            for _,val := range labelTypes {
                if val == 0 {
                    if len(args.RuleResult["yolo"].([]Result)) >= 1 {
                        lens := len(args.RuleResult["yolo"].([]Result))-1
                        args.RuleResult["yolo"] = args.RuleResult["yolo"].([]Result)[0:lens]
                    }
                }
                if val == 1 {
                    if len(args.RuleResult["face"].([]FaceResult)) >= 1 {
                        lens := len(args.RuleResult["face"].([]FaceResult))-1
                        args.RuleResult["face"] = args.RuleResult["face"].([]FaceResult)[0:lens]
                    }
                }
            }
        }
    } else { // 没有报警,
        //logger.Info("这帧图像在任务下的一整条规则下(联动任务下就是跟本摄像机像相关的小规则)的判断结果为false")
@@ -430,7 +446,6 @@
    }
}
// 如果有持续时间条件维护开启一个定时器
func duration(rule *protomsg.Rule, groupId string, am *structure.AreaMap, args *structure.SdkDatas, message *protomsg.SdkMessage) {
    if rule.PolygonId == am.AreaId { // 首先规则所对应的区域id要跟区域数据的id对的上  配置的算法要对的上
ruleserver/timeTicker.go
@@ -33,8 +33,6 @@
}
func TimeTicker() {
    //logger.Info("定时器执行了")
    //fmt.Println("定时器执行了")
    ticker := time.NewTicker(1 * time.Second)
    go func(ticker *time.Ticker) {
        defer ticker.Stop()
@@ -116,10 +114,12 @@
                            delete(TimeEleList, k)
                        } else {
                            if timeEle.BufferFlag > 0 {
                                logger.Debug("缓冲区减减")
                                timeEle.BufferFlag--
                            }
                        }
                    } else {
                        logger.Debug("-----------结果为假且不到0,杀死定时器")
                        delete(TimeEleList, k)
                    }
                }
util/common.go
@@ -1,13 +1,9 @@
package util
import (
    "fmt"
    "basic.com/valib/deliver.git"
    "basic.com/pubsub/protomsg.git"
    "github.com/pierrec/lz4"
)
const (
@@ -30,28 +26,30 @@
// UnCompress uncompress
func UnCompress(in []byte) ([]byte, error) {
    out := make([]byte, 10*len(in))
    n, err := lz4.UncompressBlock(in, out)
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    out = out[:n] // uncompressed data
    return out, nil
    return in,nil
    //out := make([]byte, 10*len(in))
    //n, err := lz4.UncompressBlock(in, out)
    //if err != nil {
    //    fmt.Println(err)
    //    return nil, err
    //}
    //out = out[:n] // uncompressed data
    //return out, nil
}
// Compress compress
func Compress(in []byte) ([]byte, error) {
    out := make([]byte, len(in))
    ht := make([]int, 64<<10) // buffer for the compression table
    n, err := lz4.CompressBlock(in, out, ht)
    if err != nil {
        fmt.Println(err)
        return nil, err
    }
    if n >= len(in) {
        fmt.Println("image is not compressible")
    }
    out = out[:n] // compressed data
    return out, nil
    return in,nil
    //out := make([]byte, len(in))
    //ht := make([]int, 64<<10) // buffer for the compression table
    //n, err := lz4.CompressBlock(in, out, ht)
    //if err != nil {
    //    fmt.Println(err)
    //    return nil, err
    //}
    //if n >= len(in) {
    //    fmt.Println("image is not compressible")
    //}
    //out = out[:n] // compressed data
    //return out, nil
}
util/upload.go
@@ -10,6 +10,7 @@
    "log"
    "mime/multipart"
    "net/http"
    "ruleprocess/logger"
    "time"
    "gocv.io/x/gocv"
)
@@ -159,7 +160,7 @@
    client := &http.Client{Timeout: timeout}
    resp, err := client.Do(request)
    if err != nil {
        log.Fatal(err)
        logger.Error(err)
        return nil, err
    }
    defer func() {