使用Onvif協議進行裝置發現以及指定裝置資訊探測
阿新 • • 發佈:2019-02-05
EasyNVR支援使用onvif協議對裝置進行裝置發現,雲臺控制,onvif地址獲取等功能
這裡第一篇我們來說一下關於如何進行裝置發現
準備
這裡我們之探討如何使用gsoap進行onvif客戶端的開發,關於gsoap的onvif框架生成請自行google
Onvif協議的功能有很多,這裡我們之探討安防監控直播常用的幾種功能
原理
Onvif協議要求實現Onvif協議服務的裝置支援裝置發現以及探測,也就是discovery和probe
discovery,客戶端向網段內的組播地址為239.255.255.250,埠為3702傳送廣播訊息,等待網內Onvif協議裝置響應
響應訊息的裝置會返回自己的IP、UUID、EP Address、Type等,最重要的會返回裝置的Device Service Address,格式如: http://192.168.1.2:8080/onvif/devices ,此地址就是為裝置提供Onvif服務的服務地址,我們需要使用此地址進行其他的操作
使用gsoap進行discover devices
SOAP_ENV__Header header;
soap_default_SOAP_ENV__Header(soap_, &header);
header.wsa__MessageID = const_cast<char*>(soap_wsa_rand_uuid(soap_));
header.wsa__To = "urn:schemas-xmlsoap-org:ws:2005:04:discovery" ;
header.wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe";
soap_->header = &header;
wsdd__ScopesType scopesType;
soap_default_wsdd__ScopesType(soap_, &scopesType);
scopesType.__item = "";
wsdd__ProbeType probeType;
soap_default_wsdd__ProbeType(soap_, &probeType);
probeType.Scopes = &scopesType;
probeType.Types = "" ;
__wsdd__ProbeMatches probeMatches;
int result = soap_send___wsdd__Probe(soap_, "soap.udp://239.255.255.250:3702", NULL, &probeType);
if (result == SOAP_OK)
{
do
{
result = soap_recv___wsdd__ProbeMatches(soap_, &probeMatches);
if (result == SOAP_OK)
{
//處理接收到的響應訊息,提取裝置資訊
//這裡我們通常需要IP、Device Service Address
//IP: soap_->ip
//Address: probeMatches.wsdd__ProbeMatches->ProbeMatch->XAddrs
}
else
{
break;
}
} while (true);
}
想要更多
上面的情況我們可以發現到統一網段內的裝置,或者所可以廣播到的裝置,但是,一旦我們出現了跨網段無法廣播到的裝置,我們如何進行裝置資訊獲取呢?
首先,我們需要知道這個裝置的IP地址,否則還是無從下手,如果你不知道,無力繼續…..
在知道裝置的IP地址時,同理,我們可以向此裝置進行探測,也就是我們說的probe
目前能查到的說明了Onvif如何獲取指定裝置資訊的,估計也只有我這一篇了
SOAP_ENV__Header header;
soap_default_SOAP_ENV__Header(soap_, &header);
header.wsa__MessageID = const_cast<char*>(soap_wsa_rand_uuid(soap_));
header.wsa__To = "urn:schemas-xmlsoap-org:ws:2005:04:discovery";
header.wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe";
soap_->header = &header;
wsdd__ScopesType scopesType;
soap_default_wsdd__ScopesType(soap_, &scopesType);
scopesType.__item = "";
wsdd__ProbeType probeType;
soap_default_wsdd__ProbeType(soap_, &probeType);
probeType.Scopes = &scopesType;
probeType.Types = "";
__wsdd__ProbeMatches probeMatches;
std::string soapAddress(Format("soap.udp://%s:3702", host));
if (soap_send___wsdd__Probe(soap_, soapAddress.c_str(), NULL, &probeType) == SOAP_OK)
{
if (soap_recv___wsdd__ProbeMatches(soap_, &probeMatches) == SOAP_OK)
//Address: probeMatches.wsdd__ProbeMatches->ProbeMatch->XAddrs
}
獲取更多資訊
Copyright © EasyDarwin.org 2012-2017