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 }