TSINGSEE青犀視頻介紹過關于EasyNVR云臺控制——onvif協議的作用,EasyNVR級聯EasyGBS也可以控制云臺,

EasyNVR級聯EasyGBS后,在EasyNVR中使用Onvif協議接入支持云臺控制的設備,將EasyNVR級聯到EasyGBS,在EasyGBS中播放支持云臺的設備,點擊云臺控制按鈕中的放大、縮小按鈕,發現按鈕不可用,當將云臺速率調至大于130后,放大、縮小按鈕才能起作用,

原因分析
由于是EasyNVR級聯注冊到EasyGBS控制攝像頭,這個云臺控制流程是:EasyGBS向EasyNVR發送控制指令,EasyNVR接受到指令后,EasyNVR在通過Onvif協議控制攝像頭,那我們就按照這個流程一步步分析,
1、先查看EasyNVR本身通過Onvif協議控制攝像頭有沒有問題,我們通過EasyNVR的云臺控制功能控制攝像頭沒有問題,于是我們排除了攝像頭Onvif協議的問題,
2、EasyGBS向EasyNVR發送的云臺控制指令是通過GB28181協議發送的,需要按照GB28181協議對這個指令進行加密,然后EasyNVR接受到指令后解密,

3、分析日志,日志反饋了兩個重要資訊,一個是EasyGBS的通道ID(DeviceID)、一個是加密后的控制指令(PTZCmd),這個資訊的反饋代表EasyGBS和EasyNVR的互動沒有問題,
4、接下來我們分析指令本身是否有問題,

這個EasyGBS對云臺控制的兩個引數(cmd:控制指令;speed:速度)符合GB28181協議進行加密的方法,然后得到PTZCmd,

此方法是EasyNVR將PTZCmd反解得到cmd和speed,查看這兩個引數是不是能對應得上,然后發現就是這里有問題,
/**
反解PtzCmd
*/
func ParsePtzCmd(ptzcmd string) (cmd string, speed int, err error) {
ptz, _ := hex.DecodeString(ptzcmd)
if len(ptz) != 8 {
return "", 0, fmt.Errorf("error")
}
var b1, b2, b3, b4, b5, b6, b7 = 0xA5, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00
b1 = int(ptz[0])
b2 = int(ptz[1])
b3 = int(ptz[2])
b4 = int(ptz[3])
b5 = int(ptz[4])
b6 = int(ptz[5])
b7 = int(ptz[6])
b8 := int(ptz[7])
b8Tmp := (b1 + b2 + b3 + b4 + b5 + b6 + b7) % 256
if b8 != b8Tmp {
return "", 0, fmt.Errorf("error")
}
switch b4 {
case 0x01:
cmd = "right"
speed = b5
case 0x02:
cmd = "left"
speed = b5
case 0x04:
cmd = "down"
speed = b6
case 0x08:
cmd = "up"
speed = b6
case 0x04 | 0x01:
cmd = "downright"
speed = b5
case 0x04 | 0x02:
cmd = "downleft"
speed = b5
case 0x08 | 0x01:
cmd = "upright"
speed = b5
case 0x08 | 0x02:
cmd = "upleft"
speed = b5
case 0x10:
cmd = "zoomin"
speed = b7 >> 4
case 0x20:
cmd = "zoomout"
speed = b7 >> 4
}
return cmd, speed, nil
}
5、查看GB28181檔案,分析是加密出錯還是解密出錯,

測驗發現需要將EasyGBS加密那塊需改動,解碼也需要相應改動,加密部分將取余(%)改為除(/)就行了,如下圖:

解密部分也是如下圖改動:

解決問題
經過了以上修改,我們再進行測驗,可以看到云臺控制得放大和縮小按鈕已經沒有問題了,可以隨意控制,

關于EasyNVR與EasyGBS級聯,我們之前寫過幾篇博文給大家介紹,大家可以回顧一下:《EasyNVR到EasyGBS上是如何注冊及注銷的》、《EasyGBS如何實作調閱EasyNVR的視頻通道》,

如果有朋友對此仍有疑問,歡迎聯系我們一起探討,視頻相關解決方案均可訪問TSINGSEE青犀視頻,可以聯系我們獲取演示方案,直觀感受,也可自行進行下載及測驗,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/3256.html
標籤:其他
上一篇:ESP32 開發筆記(三)原始碼示例 5_KEY_Short_Long 使用IO中斷和系統時間來檢測按鍵時長實作長按短按
下一篇:工業樹莓派應用案例8:水處理設備
