| | |
| | | "bytes" |
| | | "encoding/json" |
| | | "fmt" |
| | | "log" |
| | | "strconv" |
| | | urlLib "net/url" |
| | | ) |
| | | |
| | | func SmartPrintStruct(src interface{}) string { |
| | |
| | | |
| | | //SetPlatformServerInfo 设置服务器信息 |
| | | func (api Gb28181Api) SetPlatformServerInfo(serverInfo GbServerInfo) bool { |
| | | url := BASIC_URL + DATA_URL_PREFIX + "/set_platform_server" |
| | | 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() |
| | | |
| | | 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 |
| | | } |
| | | |
| | |
| | | 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 |
| | | } |
| | | |
| | |
| | | |
| | | //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 |
| | | } |
| | | |
| | |
| | | //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...) |
| | |
| | | //pageNo (数字) 指定获取第几页,第一次为1,返回总页数,总条数等,再根据这些信息去再次查询,直到取完全部 |
| | | //srcType (字符串) "all"-表示获取设备的所有资源 "node"-父节点下的第一级资源 |
| | | //注意:根据"restype"字段,忽略资源组,只保留通道资源------"restype":(数字)1-通道资源 2-资源组 |
| | | func (api Gb28181Api) GetCamsByDevAndPage(devID string, srcType string, pageNo int) (CamerasInOnePage, bool) { |
| | | func (api Gb28181Api) getCamsAndGroupsByDevAndPage(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 { |
| | | di := camerasPerPage.Data[i] |
| | | camerasPerPage.Groups = append(camerasPerPage.Groups, DomainUnit{ |
| | | DevPubID: di.DevPubID, |
| | | ResType: 2, |
| | | PublicID: di.PublicID, |
| | | Name: di.Name, |
| | | ParentID: di.ParentID, |
| | | }) |
| | | camerasPerPage.Data = append(camerasPerPage.Data[:i], camerasPerPage.Data[i+1:]...) |
| | | i-- |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | //GetAllCamerasByDevID 获取全部下级设备的摄像机列表 |
| | | //devID (字符串) 注册的设备的20位id |
| | | func (api Gb28181Api) GetAllCamerasByDevID(devID string) ([]CameraInfo, bool) { |
| | | func (api Gb28181Api) GetAllCamerasAndGroupsByDevID(devID string) ([]CameraInfo, []DomainUnit, bool) { |
| | | var cameraSlice []CameraInfo |
| | | camerasPerPage, flag := api.GetCamsByDevAndPage(devID, "all", 1) |
| | | var groups []DomainUnit |
| | | camerasPerPage, flag := api.getCamsAndGroupsByDevAndPage(devID, "all", 1) |
| | | if !flag { |
| | | fmt.Println("GetCamsByDevAndPage Error, deviceSlice is nil") |
| | | log.Println("GetCamsByDevAndPage Error, deviceSlice is nil") |
| | | return cameraSlice, groups, false |
| | | } |
| | | cameraSlice = camerasPerPage.Data |
| | | groups = camerasPerPage.Groups |
| | | for i := 1; i < camerasPerPage.TotalPage; i++ { |
| | | camerasPerPage, flag := api.getCamsAndGroupsByDevAndPage(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, groups, false |
| | | } |
| | | cameraSlice = append(cameraSlice, camerasPerPage.Data...) |
| | | groups = append(groups, camerasPerPage.Groups...) |
| | | } |
| | | |
| | | return cameraSlice, groups, 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) |
| | | log.Println("getAllCamerasByDomainUnitAndPage:", url) |
| | | 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.GetCamsByDevAndPage(devID, "all", i+1) |
| | | camerasPerPage, flag := api.getAllCamerasByDomainUnitAndPage(domainpubid, 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:" + 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云台控制 |
| | |
| | | |
| | | 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 |
| | | } |
| | | |