chenshijun
2019-10-23 53d55bb6057d1d1065ef34d98829bed5038164cd
gb28181Api.go
@@ -4,6 +4,7 @@
   "bytes"
   "encoding/json"
   "fmt"
   "log"
   "strconv"
)
@@ -24,30 +25,31 @@
//SetPlatformServerInfo 设置服务器信息
func (api Gb28181Api) SetPlatformServerInfo(serverInfo GbServerInfo) bool {
   url := BASIC_URL + DATA_URL_PREFIX + "/set_platform_server"
   serverInfo.GbUsername = serverInfo.PublicID   //鉴权名字不生效,最好和设备id一致
   url := BASIC_URL + DATA_URL_PREFIX + "/set_platform_server?" +
      //"gbsvrname=" + serverInfo.Name +
      "gbsvrid=" + serverInfo.PublicID +
      "&gbsvrport=" + strconv.Itoa(serverInfo.GbServerPort) +
      "&registerauth=" + strconv.FormatBool(serverInfo.RegisterAuth) +
      "&gbusername=" + serverInfo.GbUsername +
      "&gbpasswd=" + serverInfo.GbPasswd
   log.Println("url:", url)
   client := NewClient()
   paramBody := make(map[string]string, 0)
   paramBody["gbsvrid"] = serverInfo.PublicID
   paramBody["gbsvrport"] = strconv.Itoa(serverInfo.GbServerPort)
   paramBody["gbsvrname"] = serverInfo.Name
   paramBody["rtspsvrport"] = strconv.Itoa(serverInfo.RtspServrPort)
   // fmt.Println("url:", url)
   body, err := client.DoGetRequest(url, paramBody, nil)
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      return false
   }
   var res GbResult
   // fmt.Println("body", string(body))
   log.Println("body:", string(body[:]))
   if err = json.Unmarshal(body, &res); err != nil {
      fmt.Println("jsonErr:", err)
      log.Println("jsonErr:", err)
      return false
   }
   if res.ErrCode != 0 {
      fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      log.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      return false
   }
@@ -67,18 +69,18 @@
   var info GbServerInfo
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      fmt.Println("err:", err)
      log.Println("err:", err)
      return info, false
   }
   //解析retGbServerInfo
   var res retGbServerInfo
   if err = json.Unmarshal(body, &res); err != nil {
      fmt.Println("jsonErr:", err)
      log.Println("jsonErr:", err)
      return info, false
   }
   if res.ErrCode != 0 {
      fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      log.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      return info, false
   }
@@ -87,24 +89,24 @@
//GetDevicesByPageNO 按页获取下级设备(平台或摄像机)列表
//pageNo (数字)   指定获取第几页,第一次为1,返回总页数,总条数等,再根据这些信息去再次查询,直到取完全部
func (api Gb28181Api) GetDevicesByPageNO(pageNo int) (DevicesInOnePage, bool) {
func (api Gb28181Api) getDevicesByPageNO(pageNo int) (DevicesInOnePage, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_all_device/" + strconv.Itoa(pageNo)
   client := NewClient()
   var devicesPerPage DevicesInOnePage
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      fmt.Println("err:", err)
      log.Println("err:", err)
      return devicesPerPage, false
   }
   //解析 DevicesInOnePage
   if err = json.Unmarshal(body, &devicesPerPage); err != nil {
      fmt.Println("jsonErr:", err)
      log.Println("jsonErr:", err)
      return devicesPerPage, false
   }
   if devicesPerPage.ErrCode != 0 {
      fmt.Println("errcode: ", devicesPerPage.ErrCode, " errdesc: ", devicesPerPage.ErrDesc)
      log.Println("errcode: ", devicesPerPage.ErrCode, " errdesc: ", devicesPerPage.ErrDesc)
      return devicesPerPage, false
   }
@@ -114,17 +116,17 @@
//GetAllDevices 获取全部下级设备(平台或摄像机)信息列表
func (api Gb28181Api) GetAllDevices() ([]DeviceInfo, bool) {
   var deviceSlice []DeviceInfo
   devicesPerPage, flag := api.GetDevicesByPageNO(1)
   devicesPerPage, flag := api.getDevicesByPageNO(1)
   if !flag {
      fmt.Println("GetDevicesByPageNO Error, deviceSlice is nil")
      log.Println("GetDevicesByPageNO Error, deviceSlice is nil")
      return deviceSlice, false
   }
   deviceSlice = devicesPerPage.Data
   for i := 1; i < devicesPerPage.TotalPage; i++ {
      devicesPerPage, flag := api.GetDevicesByPageNO(i + 1)
      devicesPerPage, flag := api.getDevicesByPageNO(i + 1)
      if !flag {
         fmt.Println("GetDevicesByPageNO Error,pageno:" + strconv.Itoa(i+1) + " ,deviceSlice is not completed")
         log.Println("GetDevicesByPageNO Error,pageno:" + strconv.Itoa(i+1) + " ,deviceSlice is not completed")
         return deviceSlice, false
      }
      deviceSlice = append(deviceSlice, devicesPerPage.Data...)
@@ -138,32 +140,32 @@
//pageNo (数字)   指定获取第几页,第一次为1,返回总页数,总条数等,再根据这些信息去再次查询,直到取完全部
//srcType (字符串) "all"-表示获取设备的所有资源  "node"-父节点下的第一级资源
//注意:根据"restype"字段,忽略资源组,只保留通道资源------"restype":(数字)1-通道资源 2-资源组
func (api Gb28181Api) GetCamsByDevAndPage(devID string, srcType string, pageNo int) (CamerasInOnePage, bool) {
func (api Gb28181Api) getCamsByDevAndPage(devID string, srcType string, pageNo int) (CamerasInOnePage, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_all_channel/" + devID + "/" + srcType + "/" + strconv.Itoa(pageNo)
   client := NewClient()
   var camerasPerPage CamerasInOnePage
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      fmt.Println("err:", err)
      log.Println("err:", err)
      return camerasPerPage, false
   }
   //解析 CamerasInOnePage
   if err = json.Unmarshal(body, &camerasPerPage); err != nil {
      fmt.Println("jsonErr:", err)
      log.Println("jsonErr:", err)
      return camerasPerPage, false
   }
   if camerasPerPage.ErrCode != 0 {
      fmt.Println("errcode: ", camerasPerPage.ErrCode, " errdesc: ", camerasPerPage.ErrDesc)
      log.Println("errcode: ", camerasPerPage.ErrCode, " errdesc: ", camerasPerPage.ErrDesc)
      return camerasPerPage, false
   }
   if len(camerasPerPage.Data) > 0 {
      for i, v := range camerasPerPage.Data {
         if v.ResType == 2 {
            fmt.Println("v.restype == 2")
      for i := 0; i < len(camerasPerPage.Data); i++ {
         if camerasPerPage.Data[i].ResType == 2 {
            camerasPerPage.Data = append(camerasPerPage.Data[:i], camerasPerPage.Data[i+1:]...)
            i--
         }
      }
   }
@@ -175,23 +177,267 @@
//devID  (字符串)  注册的设备的20位id
func (api Gb28181Api) GetAllCamerasByDevID(devID string) ([]CameraInfo, bool) {
   var cameraSlice []CameraInfo
   camerasPerPage, flag := api.GetCamsByDevAndPage(devID, "all", 1)
   camerasPerPage, flag := api.getCamsByDevAndPage(devID, "all", 1)
   if !flag {
      fmt.Println("GetCamsByDevAndPage Error, deviceSlice is nil")
      log.Println("GetCamsByDevAndPage Error, deviceSlice is nil")
      return cameraSlice, false
   }
   cameraSlice = camerasPerPage.Data
   for i := 1; i < camerasPerPage.TotalPage; i++ {
      camerasPerPage, flag := api.GetCamsByDevAndPage(devID, "all", i+1)
      camerasPerPage, flag := api.getCamsByDevAndPage(devID, "all", i+1)
      if !flag {
         fmt.Println("GetCamsByDevAndPage Error! devID:" + devID + ",type:all,pageno:" + strconv.Itoa(i+1) + " ,cameraSlice is not completed")
         log.Println("GetCamsByDevAndPage Error! devID:" + devID + ",type:all,pageno:" + strconv.Itoa(i+1) + " ,cameraSlice is not completed")
         return cameraSlice, false
      }
      cameraSlice = append(cameraSlice, camerasPerPage.Data...)
   }
   return cameraSlice, true
}
//GetAllDomainUnit get all domainunit 获取所有行政区域
func (api Gb28181Api) GetAllDomainUnit() ([]DomainUnit, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_all_domainunit"
   client := NewClient()
   var dmUnit DomainUnitInfo
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      log.Println("err:", err)
      return dmUnit.Data, false
   }
   //解析 dmUnit
   if err = json.Unmarshal(body, &dmUnit); err != nil {
      log.Println("jsonErr:", err)
      return dmUnit.Data, false
   }
   if dmUnit.ErrCode != 0 {
      log.Println("errcode: ", dmUnit.ErrCode, " errdesc: ", dmUnit.ErrDesc)
      return dmUnit.Data, false
   }
   return dmUnit.Data, true
}
//GetAllCamerasByDomainUnit  get all cameras by domainunit 获取所有行政区域下的设备
func (api Gb28181Api) getAllCamerasByDomainUnitAndPage(domainpubid string, pageNo int) (CamerasInOnePage, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_domainunit_channel/" + domainpubid + "/" + strconv.Itoa(pageNo)
   client := NewClient()
   var camerasPerPage CamerasInOnePage
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      log.Println("err:", err)
      return camerasPerPage, false
   }
   //解析 CamerasInOnePage
   if err = json.Unmarshal(body, &camerasPerPage); err != nil {
      log.Println("jsonErr:", err)
      return camerasPerPage, false
   }
   if camerasPerPage.ErrCode != 0 {
      log.Println("errcode: ", camerasPerPage.ErrCode, " errdesc: ", camerasPerPage.ErrDesc)
      return camerasPerPage, false
   }
   return camerasPerPage, true
}
//GetAllCamerasByDevID 获取指定行政区域的摄像机列表
func (api Gb28181Api) GetAllCamerasByDomainUnit(domainpubid string) ([]CameraInfo, bool) {
   var cameraSlice []CameraInfo
   camerasPerPage, flag := api.getAllCamerasByDomainUnitAndPage(domainpubid, 1)
   if !flag {
      log.Println("GetCamsByDevAndPage Error, deviceSlice is nil")
      return cameraSlice, false
   }
   cameraSlice = camerasPerPage.Data
   for i := 1; i < camerasPerPage.TotalPage; i++ {
      camerasPerPage, flag := api.getAllCamerasByDomainUnitAndPage(domainpubid, i+1)
      if !flag {
         log.Println("GetCamsByDevAndPage Error! devID:" + domainpubid + ",type:all,pageno:" + strconv.Itoa(i+1) + " ,cameraSlice is not completed")
         return cameraSlice, false
      }
      cameraSlice = append(cameraSlice, camerasPerPage.Data...)
   }
   return cameraSlice, true
}
//getAllGroupBygroupIDAndpage get all group by groupID ang page 按页和组id获取下属分组
func (api Gb28181Api) getAllGroupBygroupIDAndpage(groupID string, pageNo int) ([]DomainUnit, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_all_channel/" + groupID + "/node/" + strconv.Itoa(pageNo)
   client := NewClient()
   var camerasPerPage CamerasInOnePage
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      log.Println("err:", err)
      return nil, false
   }
   if camerasPerPage.ErrCode != 0 {
      log.Println("errcode: ", camerasPerPage.ErrCode, " errdesc: ", camerasPerPage.ErrDesc)
      return nil, false
   }
   //解析 cameras
   //log.Println("body:", body)
   if err = json.Unmarshal(body, &camerasPerPage); err != nil {
      log.Println("jsonErr:", err)
      return nil, false
   }
   //cameraInfo 转 DomainUnit
   var dmUnits []DomainUnit
   var tmpUnit DomainUnit
   for _, cam := range camerasPerPage.Data {
      if cam.ResType == 2 {
         tmpUnit.Name = cam.Name
         tmpUnit.DevPubID = cam.DevPubID
         tmpUnit.OnlineNum = 0
         tmpUnit.ParentID = cam.ParentID
         tmpUnit.PublicID = cam.PublicID
         tmpUnit.ResType = cam.ResType
         tmpUnit.TotalNum = 0
         dmUnits = append(dmUnits, tmpUnit)
      }
   }
   log.Println("dmUnits:", dmUnits)
   return dmUnits, true
}
//GetAllGroupByDevID  按组id获取下属分组
func (api Gb28181Api) getAllGroupByGroupID(groupID string) []DomainUnit {
   var dmUnitAll []DomainUnit
   pageNo := 1
   for {
      dmUnitsPerPage, flag := api.getAllGroupBygroupIDAndpage(groupID, pageNo)
      if !flag || dmUnitsPerPage == nil {
         break
      }
      dmUnitAll = append(dmUnitAll, dmUnitsPerPage...)
      pageNo++
   }
   return dmUnitAll
}
//
func (api Gb28181Api) getGroupsByGroupID(groupID string, groupsAll *[]DomainUnit) {
   if groupID != "" {
      groups := api.getAllGroupByGroupID(groupID)
      if groups == nil {
         return
      }
      if len(groups) > 0 {
         *groupsAll = append(*groupsAll, groups...)
         for _, groupid := range groups {
            api.getGroupsByGroupID(groupid.PublicID, groupsAll)
         }
      }
   }
}
//GetAllGroupByDevID get all group by devid 按设备id获取分组
func (api Gb28181Api) GetAllGroupBydevID(devID string) []DomainUnit {
   var dmUnitAll []DomainUnit
   api.getGroupsByGroupID(devID, &dmUnitAll)
   log.Println("dmUnitAll:", dmUnitAll)
   return dmUnitAll
}
//getAllCamerasByGroupIDAndPage 按分组和页获取摄像机列表
func (api Gb28181Api) getAllCamerasByGroupIDAndPage(groupID string, pageNo int) (CamerasInOnePage, bool) {
   url := BASIC_URL + DATA_URL_PREFIX + "/get_all_channel/" + groupID + "/node/" + strconv.Itoa(pageNo)
   client := NewClient()
   var camerasPerPage CamerasInOnePage
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      log.Println("err:", err)
      return camerasPerPage, false
   }
   //解析 cameras
   if err = json.Unmarshal(body, &camerasPerPage); err != nil {
      log.Println("jsonErr:", err)
      return camerasPerPage, false
   }
   if len(camerasPerPage.Data) > 0 {
      for i := 0; i < len(camerasPerPage.Data); i++ {
         if camerasPerPage.Data[i].ResType == 2 {
            camerasPerPage.Data = append(camerasPerPage.Data[:i], camerasPerPage.Data[i+1:]...)
            i--
         }
      }
   }
   return camerasPerPage, true
}
//GetAllGroupByDevID get all group by devid 按设备id获取分组
func (api Gb28181Api) GetAllCamerasByGroupID(groupID string) ([]CameraInfo, bool) {
   var cameraSlice []CameraInfo
   camerasPerPage, flag := api.getAllCamerasByGroupIDAndPage(groupID, 1)
   if !flag {
      log.Println("GetCamsByDevAndPage Error, deviceSlice is nil")
      return cameraSlice, false
   }
   cameraSlice = camerasPerPage.Data
   for i := 1; i < camerasPerPage.TotalPage; i++ {
      camerasPerPage, flag := api.getAllCamerasByGroupIDAndPage(groupID, i+1)
      if !flag {
         log.Println("getAllCamerasByGroupIDAndPage Error! devID:" + groupID + ",type:all,pageno:" + strconv.Itoa(i+1) + " ,cameraSlice is not completed")
         return cameraSlice, false
      }
      cameraSlice = append(cameraSlice, camerasPerPage.Data...)
   }
   return cameraSlice, true
}
//updateResourceByID 更新下级平台资源
func (api Gb28181Api) updateResourceByID(devID string) bool {
   url := BASIC_URL + "/vss/get_catalog/" + devID
   client := NewClient()
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      log.Println("err:", err)
      return false
   }
   var res GbResult
   if err = json.Unmarshal(body, &res); err != nil {
      log.Println("jsonErr:", err)
      return false
   }
   if res.ErrCode != 0 {
      log.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      return false
   }
   return true
}
func (api Gb28181Api) UpdateAllResource() {
   devices, b := api.GetAllDevices()
   if b && len(devices) > 0 {
      for _, device := range devices {
         api.updateResourceByID(device.PublicID)
      }
   }
}
//SetCameraPtz 2.3 PTZ云台控制
@@ -205,18 +451,17 @@
   body, err := client.DoGetRequest(url, nil, nil)
   if err != nil {
      fmt.Println("err:", err)
      log.Println("err:", err)
      return false
   }
   //解析 CamerasInOnePage
   var res GbResult
   if err = json.Unmarshal(body, &res); err != nil {
      fmt.Println("jsonErr:", err)
      log.Println("jsonErr:", err)
      return false
   }
   if res.ErrCode != 0 {
      fmt.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      log.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
      return false
   }