王集成
【摘要】通過PSIA協(xié)議,控制不同廠家的網(wǎng)絡(luò)攝像頭運動,實現(xiàn)集中統(tǒng)一控制目的。并用Python語言實現(xiàn)了攝像頭運動的相關(guān)控制。
【關(guān)鍵詞】網(wǎng)絡(luò)攝像頭? HTTP協(xié)議? PSIA標(biāo)準(zhǔn)
1、問題提出
很多高校在建設(shè)多媒體教室和智慧教室時,一般采取分批次建設(shè)方式,造成不同批次的設(shè)備來自不同生產(chǎn)廠家,控制設(shè)備軟件各不相同,信息很難共享,自然形成多個信息孤島。其次,隨著硬件技術(shù)不斷發(fā)展,原有設(shè)備落后被淘汰,這類升級同樣會造成信息孤島。網(wǎng)絡(luò)攝像頭是最基礎(chǔ)的使用設(shè)備,大部分教室前后各配1個攝像頭,有些教室根據(jù)大小、結(jié)構(gòu)和用途不同,配備4-5個攝像頭(如高清錄播攝像頭),這些攝像頭來自不同廠商(比如??怠⒋笕A、宇視、華為等),因此形成管控平臺互不兼容、信息孤島等問題需要解決。
2、視頻監(jiān)控行業(yè)標(biāo)準(zhǔn)和現(xiàn)狀
視頻監(jiān)控行業(yè)發(fā)展至今,各設(shè)備廠商擁有自己核心技術(shù),導(dǎo)致硬件設(shè)備和軟件平臺的異構(gòu)性,加上客戶需求多樣性,軟件二次開發(fā)變得非常復(fù)雜。業(yè)內(nèi)逐步認(rèn)識到行業(yè)標(biāo)準(zhǔn)重要性后,國際標(biāo)準(zhǔn)化組織0NVIF(Open Network Video Interface Forum)和PSIA(Physical Security Interoperability Alliance)應(yīng)運而生,旨在解決視頻監(jiān)控系統(tǒng)中不同廠商設(shè)備的互聯(lián)互通問題,為系統(tǒng)軟硬件設(shè)備提供標(biāo)準(zhǔn)化網(wǎng)絡(luò)接口,提高可互操作性和可移植性。
目前國際上有ONVIF、PSIA和HDCCTV三大網(wǎng)絡(luò)視頻監(jiān)控標(biāo)準(zhǔn)。國內(nèi)有GB/T28181聯(lián)網(wǎng)監(jiān)控標(biāo)準(zhǔn),由公安部組織制定的國家標(biāo)準(zhǔn)《安全防范視頻監(jiān)控聯(lián)網(wǎng)系統(tǒng)信息傳輸、交換、控制技術(shù)要求》(GB/T 28181-2011)(以下簡稱“國標(biāo) 28181”),2012年6月1日起正式實行,其核心采用 SIP 協(xié)議標(biāo)準(zhǔn)。
PSIA標(biāo)準(zhǔn)采用表象化狀態(tài)轉(zhuǎn)變(REST)架構(gòu),REST只需一個簡單的XML解析器,運算過程較為簡便,消耗資源少,管理成本低。每條PSIA請求報文清晰可讀,擁有報文傳輸信息量小的優(yōu)勢。本文僅研究PSIA協(xié)議控制網(wǎng)絡(luò)攝像頭運動。
3、PSIA協(xié)議控制原理
3.1判斷攝像頭是否支持PSIA協(xié)議
PSIA協(xié)議是基于HTTP協(xié)議作為網(wǎng)絡(luò)傳輸協(xié)議,繼承了HTTP的通用方法(GET、PUT、POST和DELETE),因此通過HTTP協(xié)議GET方法,獲取網(wǎng)絡(luò)攝像頭的/PSIA/index網(wǎng)絡(luò)地址的信息,如果支持PSIA協(xié)議,則返回XML格式的PSIA協(xié)議服務(wù)列表信息,包括System、Network、IO、Video、Audio、PTZ等服務(wù),其中PTZ是提供網(wǎng)絡(luò)攝像頭運動服務(wù),否則返回HTTP協(xié)議中404錯誤碼。
3.2 PSIA協(xié)議控制攝像頭運動的命令
使用PSIA協(xié)議PUT方法,向網(wǎng)絡(luò)攝像頭的/PSIA/PTZ/channels/1/continuous地址(URL地址)發(fā)送
向上運動:
向下運動:
向左運動:
向右運動:
拉近運動:
推遠(yuǎn)運動:
停止運動:
左上運動并拉近:
3.3 Python語言實現(xiàn)控制網(wǎng)絡(luò)攝像頭運動的部分代碼
例程需要使用HTTP協(xié)議和Basic認(rèn)證,因此需要通過import urllib.request和import base64語句加載相關(guān)模塊。
def gbase64(s):
return str(base64.b64encode(s.encode('utf-8')),'utf-8')
def senddata(method, ip, url, sdata, username, pwd):
req = urllib.request.Request(method = method, url = "http://"+ip+url, data = sdata )
req.add_header("Authorization","Basic %s"%(gbase64(username+":"+pwd))) # username,pwd是登錄網(wǎng)絡(luò)攝像頭的用戶名和密碼
try:
res_data = urllib.request.urlopen(req)
return res_data.read().decode('utf-8')
except urllib.error.URLError as e:
if hasattr(e,"code"):
print("Error: ",e.code)
return? None
def makecmd(l_r,u_d,zi_zo):#l_r,u_d,zi_zo分別是左右、上下和遠(yuǎn)近運動速度值
rs="
return bytes(rs,encoding="utf-8") # HTTP協(xié)議要求傳輸字節(jié)串
def PTZup(ip,speed): #向上
senddata("PUT",ip , url, makecmd(0,speed,0), username, pwd)
def PTZdown (ip,speed): #向下
senddata("PUT",ip , url, makecmd(0,-speed,0), username, pwd)
def PTZnear(ip,speed): #拉近
senddata("PUT",ip , url, makecmd(0,0,speed), username, pwd)
def PTZfar(ip,speed): #推遠(yuǎn)
senddata("PUT",ip , url, makecmd(0,0,-speed), username, pwd)
def PTZstop(ip,speed): #停止
senddata("PUT",ip , url, makecmd(0,0,0),username, pwd)
def PTZleftupzoomin(ip,speed): #左上運動并拉近
senddata("PUT",ip , url, makecmd(-speed,speed,speed), username, pwd)
4、結(jié)論
運用PSIA協(xié)議實現(xiàn)控制??低暫痛笕A網(wǎng)絡(luò)攝像頭上下、左右和近遠(yuǎn)等基本控制功能,很好解決了不同品牌網(wǎng)絡(luò)攝像頭集控問題,有效屏蔽不同品牌網(wǎng)絡(luò)攝像頭的管控命令。
參考文獻(xiàn):
[1]阿奎.Python編程基礎(chǔ)與HTTP接口測試[M].北京:電子工業(yè)出版社,2018.
[2]周智勇.PSIA標(biāo)準(zhǔn)的發(fā)展需要系統(tǒng)集成商積極支持—專訪PSIA執(zhí)行總監(jiān)Dave Bunzel[J].中國公共安全(綜合版),2009(11):25-27.
[3]朱耀麟,李倩,王昊星.ONVIF協(xié)議的網(wǎng)絡(luò)視頻監(jiān)控客戶端接口研究[J].西北大學(xué)學(xué)報(自然科學(xué)版),2014,44(03):392-396.
[4]郝繼輝.HDcctv高清監(jiān)控系統(tǒng)的應(yīng)用[J].中國安防,2012(05):48-51.