Files
zmkgC/third/isc/isc_auth.go

264 lines
7.2 KiB
Go
Raw Normal View History

2025-07-07 20:11:59 +08:00
package isc
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"crypto/tls"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
"strconv"
"strings"
"time"
)
var AppKey = "22422818" //海康平台的key
var AppSecret = "smyUkLf2Rd9VOkLV9Ndv"
//var AppKey = "22422818" //海康平台的key
//var AppSecret = "smyUkLf2Rd9VOkLV9Ndv"
var Protocol = "https://"
var HOST = "192.168.1.153"
var PORT = "2443"
var reqError = "2003"
var reqErrorMsg = "请求失败"
var Ok = "0"
var Method = "POST"
func GetStatusList() {
config := map[string]interface{}{}
config["includeSubNode"] = 1
config["pageNo"] = 1
config["pageSize"] = 1000
config["regionId"] = "root000000"
//config["indexCodes"] = []string{"7cbd5a4c2dab46579b09c297cf649721", "7ec4f9689dc1466d813c801a5a0686b2"}
t := CameraStatus{Code: reqError, Msg: reqErrorMsg}
//content, _ := request("/api/nms/v1/online/camera/get", config)
content, _ := request("/api/nms/v1/online/camera/get", config)
fmt.Println("获取设备状态")
_ = json.Unmarshal([]byte(content), &t)
for _, v := range t.Data.List {
if ca, ok := DbCameraMap[v.IndexCode]; ok {
ca.Status = v.Online
DbCameraMap[v.IndexCode] = ca
}
//fmt.Println("v.Cn", v.Cn)
//fmt.Println("v.Online", v.Online)
//fmt.Println("v.DeviceIndexCode", v.DeviceIndexCode)
//fmt.Println("v.IndexCode", v.IndexCode)
//fmt.Println("v.CollectTime", v.CollectTime)
//fmt.Println("************************")
}
}
/*抓图接口*/
func ManualCapture(cameraIndexCode string) CameraCap {
config := map[string]interface{}{}
config["cameraIndexCode"] = cameraIndexCode
t := CameraCap{Code: reqError, Msg: reqErrorMsg}
content, _ := request("/api/video/v1/manualCapture", config)
_ = json.Unmarshal([]byte(content), &t)
return t
}
/*
云台控制
action number 0-开始 1-停止
GOTO_PRESET命令下填任意值均可转到预置点,建议填0即可
command string 不区分大小写
说明
LEFT 左转
RIGHT右转
UP 上转
DOWN 下转
ZOOM_IN 焦距变大
ZOOM_OUT 焦距变小
LEFT_UP 左上
LEFT_DOWN 左下
RIGHT_UP 右上
RIGHT_DOWN 右下
FOCUS_NEAR 焦点前移
FOCUS_FAR 焦点后移
IRIS_ENLARGE 光圈扩大
IRIS_REDUCE 光圈缩小
WIPER_SWITCH 接通雨刷开关
START_RECORD_TRACK 开始记录轨迹
STOP_RECORD_TRACK 停止记录轨迹
START_TRACK 开始轨迹
STOP_TRACK 停止轨迹
以下命令presetIndex不可为空
GOTO_PRESET到预置点
*/
func CtrlPtz(cameraIndexCode string, action int, command string) Usual {
config := map[string]interface{}{}
config["cameraIndexCode"] = cameraIndexCode
config["action"] = action
config["command"] = command
config["speed"] = 50 //默认速度为50
t := Usual{Code: reqError, Msg: reqErrorMsg}
content, _ := request("/api/video/v1/ptzs/controlling", config)
_ = json.Unmarshal([]byte(content), &t)
return t
}
/*获取对讲地址*/
func GettalkURLs(cameraIndexCode string) CameraTalk {
config := map[string]interface{}{}
config["cameraIndexCode"] = cameraIndexCode
config["protocol"] = "ws"
t := CameraTalk{Code: reqError, Msg: reqErrorMsg}
content, _ := request("/api/video/v1/cameras/talkURLs", config)
_ = json.Unmarshal([]byte(content), &t)
return t
}
/*获取预览地址 ws协议*/
func GetpreviewURLs(cameraIndexCode string) CameraPreview {
config := map[string]interface{}{}
config["cameraIndexCode"] = cameraIndexCode
config["protocol"] = "ws"
t := CameraPreview{Code: reqError, Msg: reqErrorMsg}
content, _ := request("/api/video/v1/cameras/previewURLs", config)
//fmt.Println(api)
//content, _ := request(api, config)
fmt.Println(content)
_ = json.Unmarshal([]byte(content), &t)
return t
}
/*获取监控点列表*/
func GetCameraList(pageNo, pageSize int) {
fmt.Println("开始获取第一页数据")
config := map[string]interface{}{}
config["pageNo"] = pageNo
config["pageSize"] = pageSize
t := CameraData{Code: reqError, Msg: reqErrorMsg}
content, err := request("/api/resource/v1/cameras", config)
if err != nil {
return
}
fmt.Println("数据完成")
fmt.Println(content)
err = json.Unmarshal([]byte(content), &t)
if err != nil {
fmt.Println("数据反序列化失败")
fmt.Println(err)
return
}
if t.Code == Ok {
fmt.Println("监控点总数", t.Data.Total)
fmt.Println("页码", t.Data.PageNo)
fmt.Println("当前页数量", t.Data.PageSize)
//fmt.Println(t.Data.List)
for _, v := range t.Data.List {
fmt.Println(v.CameraIndexCode, v.Name, v.Status)
//if v.Status == 1 {
// ca = v
//}
}
} else {
fmt.Println("数据获取失败")
fmt.Println(t)
}
}
// 请求
func request(url string, body map[string]interface{}) (string, error) {
configData, _ := json.Marshal(body)
param := bytes.NewBuffer(configData)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
url = "/artemis" + url
headers, _ := getSignature(url, Method)
url = Protocol + HOST + ":" + PORT + url
fmt.Println(url)
// 2. 创建请求实例
req, err := http.NewRequest(Method, url, param)
if err != nil {
panic(err)
}
//header
for i := 0; i < len(headers); i++ {
//fmt.Println(headers[i].Key, headers[i].Val)
req.Header.Add(headers[i].Key, headers[i].Val)
}
//发送请求
res, err := client.Do(req)
if err != nil {
return "", err
}
defer res.Body.Close()
content, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
return string(content), nil
}
func getSignature(url, method string) ([]Header, string) {
var now = time.Now()
var headers = []Header{
{Key: "Accept", Val: "*/*"},
{Key: "Content-Type", Val: "application/json"},
{Key: "Date", Val: now.Format("2006-01-02 15:04:05")},
{Key: "x-ca-key", Val: AppKey, Use: true},
{Key: "x-ca-nonce", Val: RandAllString(32), Use: true},
{Key: "x-ca-timestamp", Val: strconv.Itoa(int(now.UnixNano() / 1e6)), Use: true},
}
var arr = append(headers, Header{Key: "url", Val: url})
var arr2 = append([]Header{{Val: method, Key: "method"}}, arr...)
var str []string
for i := 0; i < len(arr2); i++ {
if arr2[i].Use {
str = append(str, arr2[i].Key+":"+arr2[i].Val)
} else {
str = append(str, arr2[i].Val)
}
}
sign := ComputeHmac256(strings.Join(str, "\n"), AppSecret)
headers = append(headers, Header{Key: "x-ca-signature-headers", Val: "x-ca-key,x-ca-nonce,x-ca-timestamp"}, Header{Key: "x-ca-signature", Val: sign})
return headers, sign
}
func ComputeHmac256(message string, secret string) string {
key := []byte(secret)
h := hmac.New(sha256.New, key)
h.Write([]byte(message))
return base64.StdEncoding.EncodeToString(h.Sum(nil))
}
type Header struct {
Key string `json:"key"`
Val string `json:"val"`
Use bool `json:"use"`
}
/*
RandAllString 生成随机字符串([a~zA~Z0~9])
lenNum 长度
*/
func RandAllString(lenNum int) string {
var CHARS = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}
str := strings.Builder{}
length := len(CHARS)
for i := 0; i < lenNum; i++ {
l := CHARS[rand.Intn(length)]
str.WriteString(l)
}
return str.String()
}