xuxiuxi
2019-07-10 adb478c329c669f8709593d16dddffc0505e71ee
Merge remote-tracking branch 'origin/master'
1个文件已添加
9个文件已修改
490 ■■■■ 已修改文件
controllers/area.go 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/camera.go 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/cameraTaskArgs.go 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/fileController.go 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/syssetcont.go 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/taglist.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
extend/logger/logger.go 217 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/router.go 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/FaceSdkService.go 129 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
controllers/area.go
@@ -28,10 +28,27 @@
    parentIdStr := c.Query("parentid")
    searchTypeStr := c.Query("searchType")
    cameraName := c.Query("cameraName")
    treeType := c.Query("type")
    var api dbapi.AreaApi
    arr := api.GetLocalCameraTree(parentIdStr, searchTypeStr, cameraName, treeType)
    arr := api.GetLocalCameraTree(parentIdStr, searchTypeStr, cameraName)
    util.ResponseFormat(c, code.Success, arr)
}
// @Summary 显示Gb28181树形结构
// @Description 显示Gb28181树形结构
// @Produce json
// @Tags menu
// @Param parentid query int true "区域的id"
// @Success 200 {string} json "{"code":200, msg:"目录结构数据"}"
// @Failure 500 {string} json "{"code":500,  msg:"返回错误信息"}"
// @Router /data/api-v/area/localmenu [get]
func (ac AreaController) CameraGb28181Tree(c *gin.Context) {
    parentIdStr := c.Query("parentid")
    searchTypeStr := c.Query("searchType")
    cameraName := c.Query("cameraName")
    var api dbapi.AreaApi
    arr := api.GetGb28181CameraTree(parentIdStr, searchTypeStr, cameraName)
    util.ResponseFormat(c, code.Success, arr)
}
controllers/camera.go
@@ -4,6 +4,7 @@
    "encoding/json"
    "fmt"
    "strconv"
    "webserver/extend/logger"
    "github.com/gin-gonic/gin"
@@ -20,7 +21,7 @@
    Name      string  `json:"name"`
    Type      int     `json:"type" `
    Addr      string  `json:"addr"`
    Areaid    uint    `json:"areaid"`
    Areaid    string    `json:"areaid"`
    Longitude float64 `json:"longitude"`
    Latitude  float64 `json:"latitude"`
    Rtsp      string  `json:"rtsp"`
@@ -103,7 +104,7 @@
func (ac CameraController) CameraDel(c *gin.Context) {
    var api dbapi.CameraApi
    cid := c.Param("cid")
    logger.Debug("CameraDel.cid:",cid)
    if api.CameraDelete(cid) {
        util.ResponseFormat(c, code.Success, "删除成功")
        return
controllers/cameraTaskArgs.go
@@ -3,7 +3,9 @@
import (
    "basic.com/dbapi.git"
    "github.com/gin-gonic/gin"
    "strconv"
    "webserver/extend/code"
    "webserver/extend/logger"
    "webserver/extend/util"
)
@@ -65,6 +67,32 @@
    }
}
// @Summary 根据分组id切换布防或撤防
// @Description 根据分组id切换布防或撤防
// @Produce json
// @Tags CameraTaskArgs
// @Param groupId query string true "任务算法参数分组id"
// @Param defenceState query bool true "布防状态,false:撤防,true:布防"
// @Success 200 {string} json "{"code":200, success:true, msg:"", data:""}"
// @Failure 500 {string} json "{"code":500, success:false, msg:"",data:""}"
// @Router /data/api-v/cameraTaskArgs/updateDefenceStateByGroup [post]
func (controller CameraTaskArgsController) UpdateDefenceStateByGroup(c *gin.Context){
    groupId := c.PostForm("groupId")
    str := c.PostForm("defenceState")
    logger.Debug("defenceState:",str)
    defenceState, err := strconv.ParseBool(str)
    if groupId =="" || err !=nil{
        util.ResponseFormat(c, code.RequestParamError, "参数有误")
        return
    }
    var api dbapi.CameraTaskArgsApi
    if b,data := api.UpdateDefenceStateByGroup(groupId,defenceState);b{
        util.ResponseFormat(c,code.UpdateSuccess,data)
    } else {
        util.ResponseFormat(c,code.ComError,data)
    }
}
// @SUmmary 根据分组id删除摄像机算法规则
// @Description 根据分组id删除摄像机算法规则
// @Produce json
controllers/fileController.go
@@ -103,13 +103,13 @@
    //将上传的图片交人脸检测和人脸提取,获得特征
    fileBytes, _ := ioutil.ReadAll(file)
    faceExtArr, err, pI := getFaceFeaFromSdk(fileBytes)
    if err ==nil && len(faceExtArr) >0 {
    faceArr, err, pI := service.GetFaceFeaFromSdk(fileBytes)
    if err ==nil && len(faceArr) >0 {
        var faceBase64= ""
        var field = ""
        var rcFace *protomsg.Rect
        for _,r := range faceExtArr {
            rcFace = r.Pos.Pos.RcFace
        for _,r := range faceArr {
            rcFace = r.Pos.RcFace
            faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//获取提取到的第一张人脸特征
            break
        }
@@ -150,15 +150,15 @@
    //将上传的图片交人脸检测和人脸提取,获得特征
    var faceBase64=""
    faceExtArr, err,pI := getFaceFeaFromSdk(fileBytes)
    if faceExtArr ==nil {
    faceArr, err,pI := service.GetFaceFeaFromSdk(fileBytes)
    if faceArr ==nil {
        return "",nil,errors.New("NotFeatureFindError")
    }
    var rcFace *protomsg.Rect
    if err ==nil && len(faceExtArr) >0 {
        for _,r := range faceExtArr {
    if err ==nil && len(faceArr) >0 {
        for _,r := range faceArr {
            //拿到人脸的坐标
            rcFace = r.Pos.Pos.RcFace
            rcFace = r.Pos.RcFace
            faceBase64 = base64.StdEncoding.EncodeToString(r.Feats)//获取提取到的第一张人脸特征
            break
@@ -192,26 +192,26 @@
}
func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){
    s := service.NewFaceSdkService(fileBytes)
    i, err := s.ReadFromUploadImg()
    if err !=nil{
        fmt.Println("readFromUploadImg err:",err)
        return nil,err,i
    }
    bc, err := service.ImgCompress(i)
    if err !=nil {
        fmt.Println("ImgCompress err:",err)
        return nil,err,i
    }
    s.PushImgMsg(bc)
    s.GetFaceFea()
    if s.Result == nil{
        return nil,errors.New("no fea"),i
    } else {
        return s.Result,nil,i
    }
}
//func getFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceExtCom,error,*protomsg.Image){
//    s := service.NewFaceSdkService(fileBytes)
//    i, err := s.ReadFromUploadImg()
//    if err !=nil{
//        fmt.Println("readFromUploadImg err:",err)
//        return nil,err,i
//    }
//    bc, err := service.ImgCompress(i)
//    if err !=nil {
//        fmt.Println("ImgCompress err:",err)
//        return nil,err,i
//    }
//    s.PushImgMsg(bc)
//    s.GetFaceFea()
//    if s.Result == nil{
//        return nil,errors.New("no fea"),i
//    } else {
//        return s.Result,nil,i
//    }
//}
/**上传方法**/
controllers/syssetcont.go
@@ -3,7 +3,6 @@
import (
    "basic.com/dbapi.git"
    "github.com/gin-gonic/gin"
    "time"
    "webserver/extend/code"
    "webserver/extend/util"
)
@@ -30,13 +29,14 @@
}
type Gb28181ConfigVo struct {
    ID int `json:"ID,omitempty" gorm:"primary_key" `
    ServerIp string `json:"ServerIp,omitempty" example:"SIP服务器IP" gorm:"column:ServerIp"`
    ServerPort int `json:"ServerPort,omitempty" example:"21231" gorm:"column:ServerPort"`
    ServerId string `json:"ServerId,omitempty" example:"SIP服务器Id" gorm:"column:ServerId"`
    UserAuthId string `json:"UserAuthId,omitempty" example:"SIP用户认证ID" gorm:"column:UserAuthId"`
    Password string `json:"Password,omitempty" example:"密码" gorm:"column:Password"`
    UpdateTime time.Time `json:"-" gorm:"column:UpdateTime"`
    Id string `json:"Id" gorm:"primary_key" `
    ServerIp string `json:"ServerIp" example:"国标服务器IP" gorm:"column:ServerIp"`
    ServerPort int `json:"ServerPort" example:"服务器端口:8060" gorm:"column:ServerPort"`
    PublicId string `json:"ServerId" example:"国标服务器Id" gorm:"column:PublicId"`
    GbServerPort int `json:"GbServerPort" example:"国标服务端口:7060" gorm:"column:GbServerPort"`
    IsAuth bool `json:"IsAuth" example:"是否开启鉴权:true" gorm:"column:IsAuth"`
    Password string `json:"Password" example:"密码" gorm:"column:Password"`
    UpdateTime string `json:"UpdateTime" gorm:"column:UpdateTime"`
}
// @Summary 存储信息查询
@@ -205,7 +205,7 @@
// @Failure 500 {string} json "{"code":500,  msg:"返回错误信息", success:false}"
// @Router /data/api-v/sysset/gb28181ConfigEdit [POST]
func (sset SysSetController) Gb28181ConfigEdit(c *gin.Context) {
    var args LocalConfigVo
    var args Gb28181ConfigVo
    err := c.BindJSON(&args)
    if err !=nil {
        util.ResponseFormat(c,code.RequestParamError,"参数有误")
controllers/taglist.go
@@ -25,7 +25,7 @@
    url := "http://" + config.EsInfo.Masterip + ":" + config.EsInfo.Httpport +
        "/" + config.EsInfo.EsIndex.DbTables.IndexName + "/_search"
    prama := "{\"query\":{\"match_all\":{}},\"_source\":[\"tableName\",\"uuid\"]}"
    prama := "{\"query\":{\"bool\":{\"filter\":[{\"term\":{\"isDelete\":0}}]}},\"_source\":[\"tableName\",\"uuid\"]}"
    tokenRes := esutil.GetEsDataReq(url, prama, true)
    sources := make([]map[string]interface{}, 0)
extend/logger/logger.go
New file
@@ -0,0 +1,217 @@
package logger
import (
    "fmt"
    "log"
    "os"
    "os/exec"
    "strings"
    "time"
)
const (
    PanicLevel int = iota
    FatalLevel
    ErrorLevel
    WarnLevel
    InfoLevel
    DebugLevel
)
const (
    color_red = uint8(iota + 91)
    color_green        //    绿
    color_yellow        //    黄
    color_blue            //     蓝
    color_magenta         //    洋红
)
const (
    fatalPrefix        =    "[FATAL] "
    errorPrefix        =    "[ERROR] "
    warnPrefix        =    "[WARN] "
    infoPrefix        =    "[INFO] "
    debugPrefix        =    "[DEBUG] "
)
const (
    ByDay    int = iota
    ByWeek
    ByMonth
    BySize
)
type LogFile struct {
    level    int        // 日志等级
    saveMode int        // 保存模式
    saveDays int        // 日志保存天数
    logTime  int64        //
    fileName string        // 日志文件名
    filesize int64        // 文件大小, 需要设置 saveMode 为 BySize 生效
    fileFd   *os.File
}
var logFile LogFile
func init()  {
    logFile.saveMode = ByDay    // 默认按天保存
    logFile.saveDays = 15        // 默认保存三天的
    logFile.level = ErrorLevel
    logFile.filesize = 1024 * 1024 * 10    // 默认10M, 需要设置 saveMode 为 BySize
}
func Config(logFolder string, level int) {
    logFile.fileName = logFolder
    logFile.level = level
    log.SetOutput(logFile)
    //log.SetFlags(log.Lmicroseconds | log.Lshortfile)
    log.SetFlags(log.Ldate | log.Ltime)
}
func GetLogFile() (*LogFile) {
    return &logFile
}
func SetLevel(level int) {
    logFile.level = level
}
func SetSaveMode(saveMode int)  {
    logFile.saveMode = saveMode
}
func SetSaveDays(saveDays int)  {
    logFile.saveDays = saveDays
}
func SetSaveSize(saveSize int64)  {
    logFile.filesize = saveSize
}
func Debug(args ...interface{}) {
    if logFile.level >= DebugLevel {
        log.SetPrefix(blue(debugPrefix))
        _ = log.Output(2, fmt.Sprintln(args...))
    }
}
func Info(args ...interface{}) {
    if logFile.level >= InfoLevel {
        log.SetPrefix(green(infoPrefix))
        _ = log.Output(2, fmt.Sprintln(args...))
    }
}
func Warn(args ...interface{}) {
    if logFile.level >= WarnLevel {
        log.SetPrefix(magenta(warnPrefix))
        _ = log.Output(2, fmt.Sprintln(args...))
    }
}
func Error(args ...interface{}) {
    if logFile.level >= ErrorLevel {
        log.SetPrefix(red(errorPrefix))
        _ = log.Output(2, fmt.Sprintln(args...))
    }
}
func Fatal(args ...interface{}) {
    if logFile.level >= FatalLevel {
        log.SetPrefix(red(fatalPrefix))
        _ = log.Output(2, fmt.Sprintln(args...))
    }
}
func GetRedPrefix(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
}
func red(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_red, s)
}
func green(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_green, s)
}
func yellow(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_yellow, s)
}
func blue(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_blue, s)
}
func magenta(s string) string {
    return fmt.Sprintf("\x1b[%dm%s\x1b[0m", color_magenta, s)
}
func (me LogFile) Write(buf []byte) (n int, err error) {
    if me.fileName == "" {
        fmt.Printf("consol: %s", buf)
        return len(buf), nil
    }
    switch logFile.saveMode {
    case BySize:
        fileInfo, err := os.Stat(logFile.fileName)
        if  err != nil {
            logFile.createLogFile()
            logFile.logTime = time.Now().Unix()
        }else {
            filesize:= fileInfo.Size();
            if logFile.fileFd == nil ||
                filesize > logFile.filesize {
                logFile.createLogFile()
                logFile.logTime = time.Now().Unix()
            }
        }
    default:    // 默认按天  ByDay
        if logFile.logTime+3600 < time.Now().Unix() {
            logFile.createLogFile()
            logFile.logTime = time.Now().Unix()
        }
    }
    if logFile.fileFd == nil {
        fmt.Printf("log fileFd is nil !\n")
        return len(buf), nil
    }
    return logFile.fileFd.Write(buf)
}
func (me *LogFile) createLogFile() {
    logdir := "./"
    if index := strings.LastIndex(me.fileName, "/"); index != -1 {
        logdir = me.fileName[0:index] + "/"
        os.MkdirAll(me.fileName[0:index], os.ModePerm)
    }
    now := time.Now()
    filename := fmt.Sprintf("%s_%04d%02d%02d",
        me.fileName, now.Year(), now.Month(), now.Day())
    if err := os.Rename(me.fileName, filename); err == nil {
        go func() {
            tarCmd := exec.Command("tar", "-zcf", filename+".tar.gz", filename, "--remove-files")
            tarCmd.Run()
            rmCmd := exec.Command("/bin/sh", "-c",
                "find "+logdir+` -type f -mtime +` +string(logFile.saveDays)+ ` -exec rm {} \;`)
            rmCmd.Run()
        }()
    }
    for index := 0; index < 10; index++ {
        if fd, err := os.OpenFile(me.fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, os.ModeExclusive); nil == err {
            me.fileFd.Sync()
            me.fileFd.Close()
            me.fileFd = fd
            break
        }else {
            fmt.Println("Open logfile error! err: ", err.Error())
        }
        me.fileFd = nil
    }
}
main.go
@@ -6,12 +6,22 @@
    "github.com/golang/glog"
    "strconv"
    "webserver/extend/config"
    "webserver/extend/logger"
    "webserver/router"
    "webserver/service"
)
var envirment = flag.String("e", "dev", "")
var dbIp = flag.String("dbIp","127.0.0.1","default dbIp=127.0.0.1")
var dbPort = flag.String("dbPort","8001","default dbPort=8001")
func init(){
    var logFile = "./webserver.log"
    var logSaveDays    =    15
    // 日志初始化
    logger.Config(logFile, logger.DebugLevel)
    logger.SetSaveDays(logSaveDays)
    logger.Info("loginit success !")
}
func main() {
    flag.Parse()
    service.InitService()
router/router.go
@@ -62,6 +62,7 @@
    area := r.Group(urlPrefix + "/area")
    {
        area.GET("/localmenu", areaController.CameraTree)
        area.GET("/gb28181Tree",areaController.CameraGb28181Tree)
        area.POST("/add", areaController.AreaAdd)
        area.POST("/del", areaController.AreaDelete)
        area.POST("/update", areaController.AreaUpdate)
@@ -92,6 +93,7 @@
        cameraTaskArgsApi.GET("/deleteByGroup", cameraTaskArgsController.DeleteByGroup)
        cameraTaskArgsApi.POST("/getLinkRulesByCameraIds", cameraTaskArgsController.GetLinkRulesByCameraIds)
        cameraTaskArgsApi.POST("/saveLinkRulesByGroup", cameraTaskArgsController.SaveLinkRulesByGroup)
        cameraTaskArgsApi.POST("/updateDefenceStateByGroup",cameraTaskArgsController.UpdateDefenceStateByGroup)
    }
    cameraTaskApi := r.Group(urlPrefix + "/cameraTask")
service/FaceSdkService.go
@@ -3,7 +3,6 @@
import (
    "basic.com/pubsub/protomsg.git"
    "basic.com/valib/deliver.git"
    "fmt"
    "github.com/gogo/protobuf/proto"
    "github.com/pierrec/lz4"
    "github.com/pkg/errors"
@@ -11,12 +10,13 @@
    "gocv.io/x/gocv"
    "sync"
    "time"
    "webserver/extend/logger"
)
type FaceSdkService struct {
    File []byte
    Id string
    Result []*protomsg.ResultFaceExtCom
    Result []*protomsg.ResultFaceDetect
}
const (
@@ -28,6 +28,27 @@
    Url_Service_PUSH   = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Push_Ext
    Url_Service_PULL   = Ipc_Url_Pre + Virtual_FaceSdkId + Ipc_Pull_Ext
)
func GetFaceFeaFromSdk(fileBytes []byte) ([]*protomsg.ResultFaceDetect,error,*protomsg.Image){
    s := NewFaceSdkService(fileBytes)
    i, err := s.ReadFromUploadImg()
    if err !=nil{
        logger.Debug("readFromUploadImg err:",err)
        return nil,err,i
    }
    bc, err := ImgCompress(i)
    if err !=nil {
        logger.Debug("ImgCompress err:",err)
        return nil,err,i
    }
    s.PushImgMsg(bc)
    s.GetFaceFea()
    if s.Result == nil{
        return nil,errors.New("no fea"),i
    } else {
        return s.Result,nil,i
    }
}
func NewFaceSdkService(fileBytes []byte) FaceSdkService{
    return FaceSdkService{
@@ -45,11 +66,11 @@
    i := readTestImgFile()
    fmt.Printf("width:%d,height:%d,data.length:%d,timestamp:%s,id:%d\n",i.Width,i.Height,len(i.Data),i.Timestamp,i.Id)
    logger.Debug("width:%d,height:%d,data.length:%d,timestamp:%s,id:%d\n",i.Width,i.Height,len(i.Data),i.Timestamp,i.Id)
    bc, err := ImgCompress(&i)
    if err !=nil {
        fmt.Println("image is not compressible")
        logger.Debug("image is not compressible")
    } else {
        var s FaceSdkService
        s.PushImgMsg(bc)
@@ -60,18 +81,18 @@
    //defer (*(s.File)).Close()
    //imgB, err := ioutil.ReadAll(*(s.File))
    //if err !=nil{
    //    fmt.Println("File.Read err:",err)
    //    logger.Debug("File.Read err:",err)
    //    return nil,err
    //}
    picMat, err := gocv.IMDecode(s.File, gocv.IMReadColor)
    if err !=nil {
        fmt.Println("gocv.IMDecode err:",err)
        logger.Debug("gocv.IMDecode err:",err)
        return nil,err
    }
    defer picMat.Close()
    if picMat.Empty() {
        fmt.Println("file not exist")
        logger.Debug("file not exist")
        return nil,errors.New("picMat is empty")
    }
    height := int32(picMat.Rows())
@@ -92,18 +113,18 @@
func ImgCompress(i *protomsg.Image) ([]byte,error){
    if b, err := proto.Marshal(i); err != nil {
        fmt.Println("protoImage marshal err")
        logger.Debug("protoImage marshal err")
        return nil,err
    } else {
        bc := make([]byte, len(b))
        ht := make([]int, 64<<10)
        n, err := lz4.CompressBlock(b, bc, ht)
        if err != nil {
            fmt.Println(err)
            logger.Debug(err)
            return nil,err
        }
        if n >= len(b) {
            fmt.Println("image is not compressible")
            logger.Debug("image is not compressible")
            return nil,errors.New("compressed len is 0")
        }
        bc = bc[:n]
@@ -124,8 +145,8 @@
            case <-ticker.C:
                return
            default:
                if feas,ok := resultMap.Get(s.Id);ok {
                    s.Result = feas
                if faces,ok := resultMap.Get(s.Id);ok {
                    s.Result = faces
                    return
                }
            }
@@ -145,7 +166,7 @@
    defer picMat.Close()
    if picMat.Empty() {
        fmt.Println("file not exist")
        logger.Debug("file not exist")
        return i
    }
    height := int32(picMat.Rows())
@@ -163,7 +184,7 @@
        Id:        timeUnix,
    }
    i.Cid = uuid.NewV4().String() //数据唯一id
    fmt.Println("gocv read img completed")
    logger.Debug("gocv read img completed")
    return i
}
@@ -172,35 +193,35 @@
}
type FeaResult struct {
    FeaM map[string][]*protomsg.ResultFaceExtCom
    FaceM map[string][]*protomsg.ResultFaceDetect
    Lock sync.Mutex
}
func (f *FeaResult) Write(id string,faceResult []*protomsg.ResultFaceExtCom){
func (f *FeaResult) Write(id string,faceDetectResult []*protomsg.ResultFaceDetect){
    f.Lock.Lock()
    defer f.Lock.Unlock()
    f.FeaM[id] = faceResult
    f.FaceM[id] = faceDetectResult
}
func (f *FeaResult) Get(id string) ([]*protomsg.ResultFaceExtCom,bool){
func (f *FeaResult) Get(id string) ([]*protomsg.ResultFaceDetect,bool){
    f.Lock.Lock()
    defer f.Lock.Unlock()
    coms,ok := f.FeaM[id]
    coms,ok := f.FaceM[id]
    return coms,ok
}
func (f *FeaResult) Delete(id string){
    f.Lock.Lock()
    defer f.Lock.Unlock()
    delete(f.FeaM,id)
    delete(f.FaceM,id)
}
var resultMap =  FeaResult{}
func InitService() {
    fmt.Println("service init!")
    logger.Debug("service init!")
    imgPushChan = make(chan []byte)
    resultMap.FeaM = make(map[string][]*protomsg.ResultFaceExtCom,0)
    resultMap.FaceM = make(map[string][]*protomsg.ResultFaceDetect,0)
    client_push = deliver.NewClient(deliver.PushPull, Url_Service_PUSH)
    client_pull = deliver.NewClient(deliver.PushPull, Url_Service_PULL)
    defer func() {
@@ -216,13 +237,13 @@
    for {
        select {
        case d := <-imgPushChan:
            fmt.Println("imgPushChan in")
            logger.Debug("imgPushChan in")
            err := client_push.Send(d)
            if err != nil {
                fmt.Println("img Send err:", err)
                logger.Debug("img Send err:", err)
            }
        default:
            //fmt.Println("no img in")
            //logger.Debug("no img in")
        }
    }
}
@@ -231,60 +252,46 @@
    for {
        resultBytes, err := client_pull.Recv()
        if err != nil {
            //fmt.Println("pull err:", err)
            //logger.Debug("pull err:", err)
            continue
        }
        rMsg := protomsg.SdkMessage{}
        if err := proto.Unmarshal(resultBytes, &rMsg); err == nil {
            fmt.Println("received MSG:", rMsg.Cid)
            logger.Debug("received MSG:", rMsg.Cid)
            perId := rMsg.Cid //数据id
            if rMsg.Tasklab != nil && rMsg.Tasklab.Taskid == Virtual_FaceTaskId {
                sdkInfos := rMsg.Tasklab.Sdkinfos
                fmt.Println("Len(sdkInfos)=",len(sdkInfos))
                logger.Debug("Len(sdkInfos)=",len(sdkInfos))
                for _,swt :=range sdkInfos{
                    //人脸检测的结果
                    //if swt.Sdktype =="FaceDetect"{
                    //    fmt.Println("人脸检测结果长度:",len(swt.Sdkdata))
                    //    if len(swt.Sdkdata)>1{
                    //        var pfp protomsg.ParamFacePos
                    //        err := proto.Unmarshal(swt.Sdkdata, &pfp)
                    //        if err !=nil {
                    //            fmt.Println("faceDetect result unmarshal err:",err)
                    //        } else {
                    //            for _,face :=range pfp.Faces{
                    //                fmt.Println("FacePos:",face.Pos)
                    //                fmt.Println("ThftResult:",face.Result)
                    //            }
                    //        }
                    //    }
                    //}
                    //人脸提取的结果
                    if swt.Sdktype == "FaceExtract"{
                        fmt.Println("人脸提取结果长度:",len(swt.Sdkdata))
                        if len(swt.Sdkdata) > 1{
                            var pff protomsg.ParamFaceFeature
                            if err := proto.Unmarshal(swt.Sdkdata, &pff);err !=nil{
                                //fmt.Println("ParamFaceFeature unmarshal err:",err)
                    if swt.Sdktype =="FaceDetect"{
                        logger.Debug("人脸检测结果长度:",len(swt.Sdkdata))
                        if len(swt.Sdkdata)>1{
                            var pfp protomsg.ParamFacePos
                            err := proto.Unmarshal(swt.Sdkdata, &pfp)
                            if err !=nil {
                                logger.Debug("faceDetect result unmarshal err:",err)
                            } else {
                                fmt.Println("目标数:",len(pff.ExtComp))
                                if len(pff.ExtComp) >0 {
                                    resultMap.Write(perId,pff.ExtComp)
                                    //for _,fea :=range pff.ExtComp{
                                    //    base64Fea := base64.StdEncoding.EncodeToString(fea.Feats)
                                    //    fmt.Println("perId:",perId)
                                    //    fmt.Println("faceFeature:",base64Fea)
                                    //}
                                logger.Debug("检测人脸数:",len(pfp.Faces))
                                if len(pfp.Faces)>0{
                                    resultMap.Write(perId,pfp.Faces)
                                }
                                //for _,face :=range pfp.Faces{
                                    //logger.Debug("FacePos:",face.Pos)
                                    //logger.Debug("ThftResult:",face.Result)
                                    //    base64Fea := base64.StdEncoding.EncodeToString(face.Feats)
                                    //    logger.Debug("perId:",perId)
                                    //    logger.Debug("faceFeature:",base64Fea)
                                //}
                            }
                            break
                        }
                        break
                    }
                }
            }
        } else {
            fmt.Println("recv msg Err:", err)
            logger.Debug("recv msg Err:", err)
        }
    }