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)
|
}
|