Go語(yǔ)言開源庫(kù)實(shí)現(xiàn)Onvif協(xié)議客戶端設(shè)備搜索
1、前言
之前我們已經(jīng)簡(jiǎn)單介紹過(guò)use-go的開源方案,其也是通過(guò)其它的開源方案進(jìn)行的封裝,提供了初步的接口,我們這里利用對(duì)onvif協(xié)議的學(xué)習(xí),然后結(jié)合該開源庫(kù)進(jìn)行設(shè)備發(fā)現(xiàn)、設(shè)備IP設(shè)置、Profiles token獲取、流媒體Uri地址獲取、PTZ云臺(tái)控制、預(yù)置點(diǎn)設(shè)置等功能進(jìn)行進(jìn)一步的實(shí)現(xiàn)和封裝,以此加深對(duì)Onvif協(xié)議的了解和加深Go語(yǔ)言的使用。
2、設(shè)備搜索思路
這個(gè)不清楚原理的再去看一下我們Onvif學(xué)習(xí)時(shí)的設(shè)備搜索那里的內(nèi)容,主要是通過(guò)WS-Discovery實(shí)現(xiàn)設(shè)備的搜索,你可以簡(jiǎn)單理解為局域網(wǎng)廣播和組播說(shuō):我在找符合Onvif協(xié)議的設(shè)置,然后設(shè)備回復(fù)說(shuō):我是,并且會(huì)發(fā)送相關(guān)的設(shè)備ip等信息給到客戶端。
這里我們使用的Go開源方案提供了對(duì)應(yīng)接口用于搜索設(shè)備,我們直接使用就好了。
3、搜索設(shè)備Go源碼
package client import ( "fmt" "github.com/beevik/etree" goonvif "github.com/use-go/onvif" "github.com/use-go/onvif/device" "github.com/use-go/onvif/gosoap" "github.com/use-go/onvif/media" "github.com/use-go/onvif/ptz" "github.com/use-go/onvif/xsd" "github.com/use-go/onvif/xsd/onvif" "io/ioutil" "log" "net/http" "strings" ) type Code int32 const ( OK Code = 0 SearchErr Code = -1 ConnectErr Code = -2 CreateUserErr Code = -20 GetProfilesErr Code = -30 GetStreamUriErr Code = -40 PTZErr Code = -50 SetPresetErr Code = -70 GotoPresetErr Code = -71 RemovePresetErr Code = -72 GetSnapShotUriErr Code = -100 ) type returnInfo struct { //狀態(tài)碼 Code Code //錯(cuò)誤或者返回信息 ErrInfo string } /** * @Description: 搜索設(shè)備,返回搜索到的設(shè)備列表 * @Author:ZY * @time: 2021-03-25 14:23:04 * @receiver client * @return returnInfo */ func (client *GoOnvifClient) SearchDevice() returnInfo { devices := goonvif.GetAvailableDevicesAtSpecificEthernetInterface("eth0") if devices == nil { return returnInfo{SearchErr, "search devices failed."} } client.Devices = devices return returnInfo{OK, "search device success"} }
client是我們定義的調(diào)用者,是一個(gè)包含我們需要傳遞的各類信息的結(jié)構(gòu)體,模擬面向?qū)ο笏枷雱?chuàng)建的Onvif客戶端,即創(chuàng)建一個(gè)Onvif客戶端,客戶端來(lái)處理外部調(diào)用參數(shù)和內(nèi)部處理庫(kù)的數(shù)據(jù)交互,簡(jiǎn)化對(duì)外展現(xiàn)的接口參數(shù)。
4、問(wèn)題
一個(gè)主要問(wèn)題就是當(dāng)我們搜索到多個(gè)符合Onvif協(xié)議的設(shè)備后如何進(jìn)行區(qū)分,目前我們先采用暴力輪詢的方式對(duì)每個(gè)設(shè)備進(jìn)行設(shè)備信息獲取,然后解析返回的XML信息結(jié)合我們傳遞的搜索條件(比如設(shè)備類型、設(shè)備mac地址等)進(jìn)行進(jìn)一步的區(qū)分。
以上就是Go語(yǔ)言O(shè)nvif協(xié)議客戶端設(shè)備搜索示例實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Onvif客戶端設(shè)備搜索的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GoLang并發(fā)機(jī)制探究goroutine原理詳細(xì)講解
goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò) go 關(guān)鍵字來(lái)開啟 goroutine 即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下2022-12-12Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11etcd通信接口之客戶端API核心方法實(shí)戰(zhàn)
這篇文章主要為大家介紹了etcd通信接口之客戶端API核心方法實(shí)戰(zhàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso)
這篇文章主要介紹了golang實(shí)現(xiàn)單點(diǎn)登錄系統(tǒng)(go-sso),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06go本地環(huán)境配置及vscode go插件安裝的詳細(xì)教程
這篇文章主要介紹了go本地環(huán)境配置及vscode go插件安裝的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05