package gb28181api
|
|
import (
|
"bytes"
|
"encoding/json"
|
"fmt"
|
"log"
|
"strconv"
|
urlLib "net/url"
|
)
|
|
func SmartPrintStruct(src interface{}) string {
|
b, err := json.Marshal(src)
|
if err != nil {
|
return fmt.Sprintf("%+v", src)
|
}
|
var out bytes.Buffer
|
err = json.Indent(&out, b, "", " ")
|
if err != nil {
|
return fmt.Sprintf("%+v", src)
|
}
|
return out.String()
|
}
|
|
type Gb28181Api struct{}
|
|
//SetPlatformServerInfo 设置服务器信息
|
func (api Gb28181Api) SetPlatformServerInfo(serverInfo GbServerInfo) bool {
|
serverInfo.GbUsername = serverInfo.PublicID //鉴权名字不生效,最好和设备id一致
|
|
u := urlLib.Values{}
|
u.Set("gbsvrname", serverInfo.Name)
|
u.Set("gbsvrid", serverInfo.PublicID)
|
u.Set("gbsvrport", strconv.Itoa(serverInfo.GbServerPort))
|
u.Set("registerauth", strconv.FormatBool(serverInfo.RegisterAuth))
|
u.Set("gbusername", serverInfo.GbUsername)
|
u.Set("gbpasswd", serverInfo.GbPasswd)
|
str := u.Encode()
|
url := BASIC_URL + DATA_URL_PREFIX + "/set_platform_server?" + str
|
log.Println("url:", url)
|
|
client := NewClient()
|
body, err := client.DoGetRequest(url, nil, nil)
|
if err != nil {
|
return false
|
}
|
|
var res GbResult
|
log.Println("body:", string(body[:]))
|
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
|
}
|
|
type retGbServerInfo struct {
|
GbServerInfo
|
GbResult
|
}
|
|
//GetPlatformServerInfo 获取服务器信息
|
func (api Gb28181Api) GetPlatformServerInfo() (GbServerInfo, bool) {
|
url := BASIC_URL + DATA_URL_PREFIX + "/get_platform_server"
|
client := NewClient()
|
|
var info GbServerInfo
|
body, err := client.DoGetRequest(url, nil, nil)
|
if err != nil {
|
log.Println("err:", err)
|
return info, false
|
}
|
|
//解析retGbServerInfo
|
var res retGbServerInfo
|
if err = json.Unmarshal(body, &res); err != nil {
|
log.Println("jsonErr:", err)
|
return info, false
|
}
|
if res.ErrCode != 0 {
|
log.Println("errcode: ", res.ErrCode, " errdesc: ", res.ErrDesc)
|
return info, false
|
}
|
|
return res.GbServerInfo, true
|
}
|
|
//GetDevicesByPageNO 按页获取下级设备(平台或摄像机)列表
|
//pageNo (数字) 指定获取第几页,第一次为1,返回总页数,总条数等,再根据这些信息去再次查询,直到取完全部
|
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 {
|
log.Println("err:", err)
|
return devicesPerPage, false
|
}
|
|
//解析 DevicesInOnePage
|
if err = json.Unmarshal(body, &devicesPerPage); err != nil {
|
log.Println("jsonErr:", err)
|
return devicesPerPage, false
|
}
|
if devicesPerPage.ErrCode != 0 {
|
log.Println("errcode: ", devicesPerPage.ErrCode, " errdesc: ", devicesPerPage.ErrDesc)
|
return devicesPerPage, false
|
}
|
|
return devicesPerPage, true
|
}
|
|
//GetAllDevices 获取全部下级设备(平台或摄像机)信息列表
|
func (api Gb28181Api) GetAllDevices() ([]DeviceInfo, bool) {
|
var deviceSlice []DeviceInfo
|
devicesPerPage, flag := api.getDevicesByPageNO(1)
|
if !flag {
|
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)
|
if !flag {
|
log.Println("GetDevicesByPageNO Error,pageno:" + strconv.Itoa(i+1) + " ,deviceSlice is not completed")
|
return deviceSlice, false
|
}
|
deviceSlice = append(deviceSlice, devicesPerPage.Data...)
|
}
|
|
return deviceSlice, true
|
}
|
|
//GetCamsByDevAndPage 按页获取下级设备的摄像机列表
|
//devID (字符串) 注册的设备的20位id
|
//pageNo (数字) 指定获取第几页,第一次为1,返回总页数,总条数等,再根据这些信息去再次查询,直到取完全部
|
//srcType (字符串) "all"-表示获取设备的所有资源 "node"-父节点下的第一级资源
|
//注意:根据"restype"字段,忽略资源组,只保留通道资源------"restype":(数字)1-通道资源 2-资源组
|
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 {
|
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
|
}
|
|
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
|
}
|
|
//GetAllCamerasByDevID 获取全部下级设备的摄像机列表
|
//devID (字符串) 注册的设备的20位id
|
func (api Gb28181Api) GetAllCamerasByDevID(devID string) ([]CameraInfo, bool) {
|
var cameraSlice []CameraInfo
|
camerasPerPage, flag := api.getCamsByDevAndPage(devID, "all", 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.getCamsByDevAndPage(devID, "all", i+1)
|
if !flag {
|
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云台控制
|
//"channelid": (字符串) 通道20位编号
|
//"ptztype": (字符串) 控制类型:上"up",下"down",左"left",右"right",左上"leftup",左下"leftdown",右上"rightup",右下"rightdown",镜头近"zoomin",镜头远"zoomout",
|
// 焦距远"focusfar",焦距近"focusnear", 设置预置位"setpos",调预置位"callpos",停止"stop"
|
//"ptzparam": (数字) 参数,速度范围为1-255
|
func (api Gb28181Api) SetCameraPtz(chanID string, ptzType string, ptzParam int) bool {
|
url := BASIC_URL + "/vss/ptz/" + ptzType + "/" + strconv.Itoa(ptzParam) + "/" + chanID
|
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
|
}
|