2023-11-21 02:50:33 +00:00
|
|
|
|
package iot
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"encoding/json"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
"myschools.me/suguo/hikvision/iot/model"
|
2023-11-20 10:12:30 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
基础服务能力 > 设备管理 > 设备接入管理
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// 注册设备到对应分组内。
|
|
|
|
|
|
//
|
|
|
|
|
|
// 注册设备时首先会将设备添加到平台,然后异步同步设备通道。如果设备添加成功而同步设备通道失败,则可以先获取设备列表信息,再手动调用通道同步接口同步设备下的通道。\
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceRegister(deviceserial, groupno, validatecode string) (*model.DeviceData, error) {
|
2023-11-21 02:50:33 +00:00
|
|
|
|
|
|
|
|
|
|
req := &struct {
|
|
|
|
|
|
DeviceSerial string `json:"deviceSerial"` //设备序列号
|
|
|
|
|
|
GroupNo string `json:"groupNo"` //组编号
|
|
|
|
|
|
ValidateCode string `json:"validateCode"` //验证码
|
|
|
|
|
|
}{
|
|
|
|
|
|
|
|
|
|
|
|
DeviceSerial: deviceserial,
|
|
|
|
|
|
GroupNo: groupno,
|
|
|
|
|
|
ValidateCode: validatecode,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 06:37:13 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", "/api/v1/open/basic/devices/create", req)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 06:37:13 +00:00
|
|
|
|
result := &model.DeviceData{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 06:37:13 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 从某一分组内删除设备
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceDelete(deviceSerial string) (*model.Hikvision, error) {
|
2023-11-22 06:37:13 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", fmt.Sprintf("/api/v1/open/basic/devices/delete?deviceSerial=%s", deviceSerial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于修改设备名称
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceUpdate(deviceserial, devicename string) (*model.Hikvision, error) {
|
2023-11-21 02:50:33 +00:00
|
|
|
|
|
|
|
|
|
|
req := &struct {
|
|
|
|
|
|
DeviceSerial string `json:"deviceSerial"` //设备序列号
|
|
|
|
|
|
DeviceName string `json:"deviceName"` //设备名称
|
|
|
|
|
|
}{
|
|
|
|
|
|
DeviceSerial: deviceserial,
|
|
|
|
|
|
DeviceName: devicename,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 06:37:13 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", `/api/v1/open/basic/devices/update`, req)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于根据设备序列号获取单个设备详细信息
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceDetail(deviceSerial string) (*model.DeviceData, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("/api/v1/open/basic/devices/get?deviceSerial=%s", deviceSerial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceData{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 07:15:19 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
// 该接口用于查询某组下设备列表信息 ,组编号,页数,页行数
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceList(groupno string, pageno, pagesize int) (*model.DeviceListData, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
url := fmt.Sprintf("/api/v1/open/basic/devices/list?groupNo=%s&pageNo=%d&pageSize=%d", groupno, pageno, pagesize)
|
2023-11-21 02:50:33 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", url, nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceListData{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 07:15:19 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于获取用户接入的设备总数
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceNum() (*int, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", "/api/v1/open/basic/devices/actions/deviceCount", nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceNum{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return &result.Data.TotalCount, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于查询设备的状态信息,目前仅支持萤石设备 /*测试未通过*/
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceStatus(deviceserial string) (*model.DeviceStatusData, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("/api/v1/open/basic/devices/api/v1/ezviz/devices/queryDeviceStatus?deviceSerial=%s", deviceserial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceStatusData{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 07:15:19 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于重启设备,请谨慎操作
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceReboot(deviceserial string) (*model.Hikvision, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
params := &struct {
|
|
|
|
|
|
DeviceSerial string `json:"deviceSerial"`
|
|
|
|
|
|
}{
|
|
|
|
|
|
DeviceSerial: deviceserial,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", "/api/v1/open/basic/devices/actions/system/reboot", params)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
确权流程说明
|
|
|
|
|
|
设备接入政策进行了如下调整:
|
|
|
|
|
|
(1)设备首次激活,需要在规定的时间(72小时)内上线平台,否则,上线时需要走确权流程;
|
|
|
|
|
|
(2)设备重新注册平台,删除设备并重新添加设备超过规定时间(72小时)需要走确权流程;
|
|
|
|
|
|
|
|
|
|
|
|
什么时候需要进行确权
|
|
|
|
|
|
注册设备接口返回内容code=60058时,需要进行设备确权操作。
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2023-11-21 08:27:11 +00:00
|
|
|
|
// 下线确认 errcode:20002003 errmsg:离线失败
|
|
|
|
|
|
func DeviceOffline(deviceserial string) (*model.Hikvision, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("https://api2.hik-cloud.com/v1/carrier/wing/endpoint/confirm/right/offlineconfirm?deviceSerial=%s", deviceserial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 上线线确认
|
2023-11-21 08:27:11 +00:00
|
|
|
|
func DeviceOnline(deviceserial string) (*model.Hikvision, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("https://api2.hik-cloud.com/v1/carrier/wing/endpoint/confirm/right/onlineconfirm?deviceSerial=%s", deviceserial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于获取设备当前校时配置
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeGeMode(deviceserial string) (*string, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("/api/v1/device/isapi/system/time?deviceSerial=%s", deviceserial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result = &struct {
|
|
|
|
|
|
model.Hikvision
|
|
|
|
|
|
Data struct {
|
|
|
|
|
|
TimeMode string `json:"timeMode"`
|
|
|
|
|
|
} `json:"data"`
|
|
|
|
|
|
}{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
return &result.Data.TimeMode, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于配置设备校时模式
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeSetMode(deviceSerial, timeMode string) (*model.Hikvision, error) {
|
2023-11-21 02:50:33 +00:00
|
|
|
|
|
|
|
|
|
|
req := &struct {
|
|
|
|
|
|
DeviceSerial string `json:"deviceSerial"`
|
|
|
|
|
|
TimeMode string `json:"timeMode"`
|
|
|
|
|
|
}{
|
|
|
|
|
|
DeviceSerial: deviceSerial,
|
|
|
|
|
|
TimeMode: timeMode,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", "/api/v1/device/isapi/system/time", req)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于获取设备当前NTP服务器配置
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeGetNTPCfg(deviceserial string) (*model.DeviceSetNTPCfgServerRes, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("/api/v1/device/isapi/system/time/ntpServers?deviceSerial=%s", deviceserial), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceSetNTPCfgServerRes{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 07:15:19 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
// 该接口用于配置设备NTP服务器参数
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeSetNTPCfg(deviceSerial string, ntpserver *model.DeviceSetNTPCfgServerChild) (*model.Hikvision, error) {
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-21 02:50:33 +00:00
|
|
|
|
req := &struct {
|
2023-11-22 07:15:19 +00:00
|
|
|
|
DeviceSerial string `json:"deviceSerial"`
|
|
|
|
|
|
NtpServer model.DeviceSetNTPCfgServerChild `json:"ntpServer"`
|
2023-11-21 02:50:33 +00:00
|
|
|
|
}{
|
|
|
|
|
|
DeviceSerial: deviceSerial,
|
|
|
|
|
|
NtpServer: *ntpserver,
|
|
|
|
|
|
}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", "/api/v1/device/isapi/system/time/ntpServers", req)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于获取设备指定NTP服务器配置
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeGetNTPServerCfg(deviceserial string, ntpserverid int) (*model.DeviceSetNTPCfgServerRes, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("GET", fmt.Sprintf("/api/v1/device/isapi/system/time/ntpServers/config?deviceSerial=%s&ntpServerId=%d", deviceserial, ntpserverid), nil)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-22 07:15:19 +00:00
|
|
|
|
var result = &model.DeviceSetNTPCfgServerRes{}
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-11-22 07:15:19 +00:00
|
|
|
|
return result, nil
|
2023-11-20 10:12:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 该接口用于配置设备指定NTP服务器参数
|
2023-11-27 05:22:34 +00:00
|
|
|
|
func DeviceTimeSetNTPServerCfg(req *model.DeviceSetNTPServerCfgReq) (*model.Hikvision, error) {
|
2023-11-27 07:19:19 +00:00
|
|
|
|
resp, err := hikvisionRequest("POST", "/api/v1/device/isapi/system/time/ntpServers/config", req)
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2023-11-21 02:50:33 +00:00
|
|
|
|
var result *model.Hikvision
|
2023-11-20 10:12:30 +00:00
|
|
|
|
if err := json.Unmarshal(resp, &result); err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|