1.初始化订阅
// 初始化 订阅所有测温相机设备
func Sub() {
//获取测温相机设备信息
cas := mysql.ListTempCamera()
for _, c := range cas {
//相机用户名
var username = c.UserName
//相机密码
var password = c.Password
//相机ip
var devideIp = c.DeviceIp
//定义订阅告警参数
params := make(map[string]interface{})
//ip地址类型 0:IPv4 1:IPv6 2:域名 3:IPv4 和 IPv6 都需要
params["AddressType"] = 0
//ip 本服务ip用于注册到测温相机设备
params["IPAddress"] = "192.168.10.158"
//端口 本服务端口
params["Port"] = "8080"
//订阅周期,单位s 固定时间
params["Duration"] = 3600
//宇视测温相机订阅类型:取Bit3+Bit12+Bit13的Bit值,取十进制数 12296
params["Type"] = 12296
//相机编码或域编码
params["DeviceID"] = "34020000001320000134"
str, err := json.Marshal(params)
if err != nil {
logs.Error("订阅参数转码失败: %v", err)
continue
}
req, err := http.NewRequest("POST", "http://"+devideIp+uri, bytes.NewBuffer(str))
if err != nil {
logs.Error("发送post请求异常: %v", err)
continue
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
logs.Error("发送http订阅请求异常: %v", err)
continue
}
defer resp.Body.Close()
buffer := bytes.NewBuffer(make([]byte, 4096))
_, errs := io.Copy(buffer, resp.Body)
if errs != nil {
logs.Error("read error: %v", err)
}
if resp.StatusCode == 200 {
var responseData map[string]interface{}
json.Unmarshal(buffer.Bytes(), &responseData)
if _, ok := responseData["success"]; !ok || !responseData["success"].(bool) {
logs.Info("启动订阅 success: %v", resp.StatusCode)
subId := gjson.Get(buffer.String(), "Response.CreatedID").String()
//subId := responseData[]
m[devideIp] = subId
mm[devideIp] = username
mmm[devideIp] = password
logs.Info(m, mm, mmm)
} else {
logs.Info("启动订阅失败,重新订阅: %v", resp.StatusCode)
}
}
//判断没有权限时
if resp.StatusCode == 401 {
req, err := http.NewRequest("POST", "http://"+devideIp+uri, bytes.NewBuffer(str))
if err != nil {
logs.Error("发送失败重试异常: %v", err)
continue
}
req.Header.Set("Content-Type", "application/json")
var (
realm string
nonce string
opaque string
)
auth := resp.Header.Get("Www-Authenticate")
for _, v := range strings.Split(auth, " ") {
if strings.Contains(v, "=") {
b, _, _ := strings.Cut(v, ",")
entry := strings.Split(b, "=")
switch entry[0] {
case "realm":
realm = entry[1]
case "nonce":
nonce = entry[1]
case "opaque":
opaque = entry[1]
}
}
}
b := make([]rune, 16)
for i := range b {
ii, err := rand.Int(rand.Reader, big.NewInt(int64(len(letters))))
if err != nil {
logs.Info(err)
}
b[i] = letters[ii.Int64()]
}
m1 := MD5(username + ":" + strings.ReplaceAll(realm, "\"", "") + ":" + password)
m2 := MD5(req.Method + ":" + uri)
response := MD5(m1 + ":" + strings.ReplaceAll(nonce, "\"", "") + ":" + "00000002" + ":" + string(b) + ":" + "auth" + ":" + m2)
a := fmt.Sprintf("Digest username=\"%v\", realm=%v, nonce=%v, algorithm=MD5, opaque=%v, qop=auth, nc=00000002, uri=\"%v\", cnonce=\"%v\", response=\"%v\"", username, realm, nonce, opaque, uri, string(b), response)
req.Header.Set("Authorization", a)
resp, err := http.DefaultClient.Do(req)
if err != nil {
logs.Error("获取请求失败了: %v", err)
continue
}
defer resp.Body.Close()
buffer := bytes.NewBuffer(make([]byte, 4096))
_, errs := io.Copy(buffer, resp.Body)
if errs != nil {
logs.Error("read error: %v", err)
}
if resp.StatusCode == 200 {
var responseData map[string]interface{}
json.Unmarshal(buffer.Bytes(), &responseData)
if _, ok := responseData["success"]; !ok || !responseData["success"].(bool) {
logs.Info("启动订阅 success: %v", resp.StatusCode)
subId := gjson.