package service import ( "basic.com/gb28181api.git" "basic.com/pubsub/protomsg.git" "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/logger.git" "vamicro/config" "vamicro/sync-service/models" "encoding/json" "github.com/satori/go.uuid" "strings" "time" "vamicro/extend/util" ) type Gb28181Service struct { bk bhomeclient.Broker } func NewGb28181Service(broker bhomeclient.Broker) *Gb28181Service { return &Gb28181Service{ bk: broker, } } func (s Gb28181Service) Edit(gbConfig models.Gb28181Config)bool{ timeUnix :=time.Now().Unix() fmtTimeStr := time.Unix(timeUnix,0).Format("2006-01-02 15:04:05") gbConfig.UpdateTime = fmtTimeStr var gbConf models.Gb28181Config rows, _ := gbConf.Select() if rows >0 {//已存在,编辑 gbConfig.Id = gbConf.Id data := util.Struct2Map(gbConfig) if err := models.GetDB().Table("gb28181_config").Updates(data).Error;err !=nil{ return false } } else { //新增 gbConfig.Id = uuid.NewV4().String() if err := models.GetDB().Table("gb28181_config").Create(&gbConfig).Error;err !=nil{ return false } } setGbIp := "" var syssetApi bhomedbapi.SysSetApi fb, rConf := syssetApi.GetResourceConfig() if fb { setGbIp = rConf.ServiceIp //如果有对外服务配置,则取设置的 } else { setGbIp,_,_ = util.GetLocalIP(config.Server.NetworkAdapter) //没有配置,则取本机ip } if setGbIp != "" { //接入国标的平台树 var gbApi gb28181api.Gb28181Api gb28181api.Init(setGbIp,gbConfig.ServerPort) //设置国标平台基础配置 gbApi.SetPlatformServerInfo(gb28181api.GbServerInfo{ Name: "贝思科国标服务", PublicID: gbConfig.PublicId, GbServerPort: gbConfig.GbServerPort, RtspServrPort: 7554, HTTPClientIP: "", HTTPClientPort: gbConfig.ServerPort, RegisterAuth: gbConfig.IsAuth, GbPasswd: gbConfig.Password, }) //先更新资源 gbApi.UpdateAllResource() go s.updateGb28181Data(gbApi,gbConfig) } return true } type gbDevAndArea struct { PublicId string ParentId string } func (s Gb28181Service) updateGb28181Data(gbApi gb28181api.Gb28181Api,config models.Gb28181Config) bool { time.Sleep(65 * time.Second) var err error tx := models.GetDB().Begin() defer func() { if err !=nil && tx !=nil{ tx.Rollback() } }() gbCids := "" uIds := "" devices, flag := gbApi.GetAllDevices() logger.Debug("gb28181 group devices:",devices) uIdMap := make(map[string]gbDevAndArea,0) if flag { for _,gbu := range devices { uIdMap[gbu.PublicID] = gbDevAndArea{ PublicId: gbu.PublicID, ParentId: gbu.Parentid, } uIds = uIds + "'"+gbu.PublicID+"'," } for _,d := range devices { gbArea :=models.Area{ Id:d.PublicID, Name:d.Name, Parentid: d.Parentid, Type: models.TYPE_GB28181_TREE, } if _,ok :=uIdMap[d.Parentid];!ok { gbArea.Parentid = "0" } //递归得到parentids parentIds := "" GetPidsByRecursion(&uIdMap, gbArea.Parentid, &parentIds) gbArea.Parentids = parentIds if d.Name == ""{ gbArea.Name = d.PublicID } var areaE models.Area rows, _ := areaE.SelectbyId(gbArea.Id) if rows>0{ gbArea.Alias = areaE.Alias if err = tx.Table("area").Where("id=?",gbArea.Id).Update(&gbArea).Error;err !=nil{ return false } } else { if err = tx.Table("area").Create(&gbArea).Error;err !=nil{ return false } } groupDomains := gbApi.GetAllGroupBydevID(d.PublicID) logger.Debug("gb28181 groupDomains:",groupDomains) if groupDomains !=nil && len(groupDomains) >0 { for _,gbd := range groupDomains { uIdMap[gbd.PublicID] = gbDevAndArea{ PublicId: gbd.PublicID, ParentId: gbd.ParentID, } uIds = uIds + "'"+gbd.PublicID+"'," } for _,gD :=range groupDomains { gbArea :=models.Area{ Id: gD.PublicID, Name: gD.Name, Parentid: gD.ParentID, Type: models.TYPE_GB28181_TREE, } if _,ok :=uIdMap[gD.ParentID];!ok { gbArea.Parentid = "0" } //递归得到parentids parentIds := "" GetPidsByRecursion(&uIdMap, gbArea.Parentid, &parentIds) gbArea.Parentids = parentIds if gD.Name == ""{ gbArea.Name = gD.PublicID } var areaE models.Area rows, _ := areaE.SelectbyId(gbArea.Id) if rows>0{ gbArea.Alias = areaE.Alias if err = tx.Table("area").Where("id=?",gbArea.Id).Update(&gbArea).Error;err !=nil{ return false } } else { if err = tx.Table("area").Create(&gbArea).Error;err !=nil{ return false } } groupCams, gf := gbApi.GetAllCamerasByGroupID(gD.PublicID) logger.Debug("gb28181 groupCams:",groupCams) if gf { for _,gbCam :=range groupCams{ gbCids = gbCids + "'"+gbCam.PublicID+"'," var cameraE models.Camera rI, _ := cameraE.SelectById(gbCam.PublicID) if rI>0{ cameraE.Name = gbCam.Name cameraE.Ip = gbCam.IP cameraE.Port = gbCam.Port cameraE.Rtsp = gbCam.RealRtspURL cameraE.Longitude = float32(gbCam.Longitude) cameraE.Latitude = float32(gbCam.Latitude) if err = tx.Table("cameras").Where("id=?",cameraE.Id).Update(&cameraE).Error;err !=nil{ return false } }else{ cameraE =models.Camera{ Id:gbCam.PublicID, Name:gbCam.Name, Ip:gbCam.IP, Port:gbCam.Port, Rtsp:gbCam.RealRtspURL, Addr:gbCam.Name, Alias: gbCam.Name,//别名默认取国标摄像机的名称 Longitude : float32(gbCam.Longitude), Latitude : float32(gbCam.Latitude), Type: models.TYPE_GB28181_CAMERA,//国标摄像机 Floor: models.Default_Layer, RunType: models.TYPE_RUNTYPE_VIDEO,//新增无任务,默认是监控 } if err = tx.Table("cameras").Create(&cameraE).Error;err !=nil{ return false } } //挂到设备树下 var cameraArea []models.CameraArea if err = tx.Table("camera_area").Where("cameraId=? and areaId=?",gbCam.PublicID,gbArea.Id).Find(&cameraArea).Error;err !=nil{ return false } if len(cameraArea) ==0 { if err = tx.Table("camera_area").Create(&models.CameraArea{Cameraid:gbCam.PublicID,Areaid:gbArea.Id}).Error;err !=nil{ return false } } } } } } } } domainUnits, b := gbApi.GetAllDomainUnit()//获取所有国标区域 logger.Debug("gb28181 gb units:",domainUnits) if b{ for _,gbu := range domainUnits { uIdMap[gbu.PublicID] = gbDevAndArea{ PublicId: gbu.PublicID, ParentId: gbu.ParentID, } uIds = uIds + "'"+gbu.PublicID+"'," } for _,gbUnit :=range domainUnits{ gbArea :=models.Area{ Id:gbUnit.PublicID, Name:gbUnit.Name, Parentid: gbUnit.ParentID, Type: models.TYPE_GB28181_TREE, } if _,ok :=uIdMap[gbUnit.ParentID];!ok { gbArea.Parentid = "0" } //递归得到parentids parentIds := "" GetPidsByRecursion(&uIdMap, gbArea.Parentid, &parentIds) gbArea.Parentids = parentIds if gbUnit.Name == ""{ gbArea.Name = gbUnit.PublicID } var areaE models.Area rows, _ := areaE.SelectbyId(gbArea.Id) if rows>0{ gbArea.Alias = areaE.Alias if err = tx.Table("area").Where("id=?",gbArea.Id).Update(&gbArea).Error;err !=nil{ return false } } else { if err = tx.Table("area").Create(&gbArea).Error;err !=nil{ return false } } if cameras, flag := gbApi.GetAllCamerasByDomainUnit(gbArea.Id);flag{ logger.Debug("gb28181 cameras by ",gbArea.Id," ",cameras) for _,gbCam :=range cameras{ gbCids = gbCids + "'"+gbCam.PublicID+"'," var cameraE models.Camera rI, _ := cameraE.SelectById(gbCam.PublicID) if rI>0{ cameraE.Name = gbCam.Name cameraE.Ip = gbCam.IP cameraE.Port = gbCam.Port cameraE.Rtsp = gbCam.RealRtspURL cameraE.Longitude = float32(gbCam.Longitude) cameraE.Latitude = float32(gbCam.Latitude) if err = tx.Table("cameras").Where("id=?",cameraE.Id).Update(&cameraE).Error;err !=nil{ return false } }else{ cameraE =models.Camera{ Id: gbCam.PublicID, Name: gbCam.Name, Ip: gbCam.IP, Port: gbCam.Port, Rtsp: gbCam.RealRtspURL, Addr: gbCam.Name, Alias: gbCam.Name,//别名默认取国标摄像机的名称 Longitude : float32(gbCam.Longitude), Latitude : float32(gbCam.Latitude), Type: models.TYPE_GB28181_CAMERA,//国标摄像机 Floor: models.Default_Layer, RunType: models.TYPE_RUNTYPE_VIDEO,//新增无任务,默认是监控 } if err = tx.Table("cameras").Create(&cameraE).Error;err !=nil{ return false } } //挂到设备树下 var cameraArea []models.CameraArea if err = tx.Table("camera_area").Where("cameraId=? and areaId=?",gbCam.PublicID,gbArea.Id).Find(&cameraArea).Error;err !=nil{ return false } if len(cameraArea) ==0 { if err = tx.Table("camera_area").Create(&models.CameraArea{Cameraid:gbCam.PublicID,Areaid:gbArea.Id}).Error;err !=nil{ return false } } } } } } uIds = strings.Trim(uIds, ",") if uIds != "" { var rmCamAreas []models.CameraArea if err = tx.Raw("select * from camera_area where areaId in (select id from area where type=1) and areaId not in ("+uIds+")").Scan(&rmCamAreas).Error;err !=nil { return false } if rmCamAreas !=nil && len(rmCamAreas) >0 { for _,rmCA :=range rmCamAreas { if err = tx.Exec("delete from camera_area where areaId='"+rmCA.Areaid+"'").Error;err !=nil { return false } } } var rmAreas []models.Area if err = tx.Raw("select * from area where type=1 and id not in ("+uIds+")").Scan(&rmAreas).Error;err !=nil { return false } if rmAreas !=nil && len(rmAreas) >0 { for _,rmArea :=range rmAreas { if err = tx.Exec("delete from area where type=1 and id='"+rmArea.Id+"'").Error;err !=nil { return false } } } } else { if err = tx.Exec("delete from camera_area where areaId in (select id from area where type=1)").Error;err !=nil { return false } if err = tx.Exec("delete from area where type=1").Error;err !=nil { return false } } //删除已经被删除的国标摄像机 gbCids = strings.Trim(gbCids, ",") if gbCids != "" { var rmCams []models.Camera if err = tx.Raw("select * from cameras where type=1 and id not in ("+gbCids+")").Scan(&rmCams).Error;err !=nil { return false } if rmCams !=nil && len(rmCams) >0 { for _,rmCam :=range rmCams { if err = tx.Exec("delete from cameras where id='"+rmCam.Id+"'").Error;err !=nil { return false } } } } else { if err = tx.Exec("delete from cameras where type=1").Error;err !=nil { return false } } tx.Commit() s.AddDbChangeMsg(protomsg.DbAction_Update) return true } func GetPidsByRecursion(uIdMap *map[string]gbDevAndArea,parentId string,pIds *string) { if unit,ok :=(*uIdMap)[parentId];ok { *pIds = ","+parentId +","+ *pIds GetPidsByRecursion(uIdMap,unit.ParentId,pIds) } else { *pIds = ",0,"+*pIds *pIds = strings.Replace(*pIds,",,",",",-1) return } } //刷新国标树和设备 func (s Gb28181Service) RefreshById(id string) bool { var gbE models.Gb28181Config rows, err := gbE.Select() if err ==nil && rows >0 { return s.Edit(gbE) } return false } //删除国标 func (s Gb28181Service) Delete() bool { var err error tx := models.GetDB().Begin() defer func() { if err !=nil && tx !=nil{ tx.Rollback() } }() if err = tx.Exec("delete from area where type=1").Error;err !=nil { return false } if err = tx.Exec("delete from cameras where type=1").Error;err !=nil { return false } if err = tx.Exec("delete from camera_area where areaId in (select id from area where type=1)").Error;err !=nil { return false } tx.Commit() s.AddDbChangeMsg(protomsg.DbAction_Update) return false } //摄像机表有更新 func (s Gb28181Service) AddDbChangeMsg(action protomsg.DbAction){ dbMsg := protomsg.DbChangeMessage{ Table:protomsg.TableChanged_T_Camera, Action:action, } pb,_ := json.Marshal(dbMsg) s.bk.Publish(ProcName,pb) }