1. 程式人生 > >使用Onvif協議進行裝置發現以及指定裝置資訊探測

使用Onvif協議進行裝置發現以及指定裝置資訊探測

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

EasyDarwin