Onvif学習ノート2-クライアント検索とコンピテンシー取得例説明

4137 ワード

注:私が実際に開発したコードは主に ブログ園DoubleLiなので、完全なソースコードは元ブロガーのリンクを与えます.私はこの文章の中で主に設備検索の流れと元ブロガーが説明していないところを詳しく説明しているかもしれません.
デバイス検索
元ブロガーソースアドレス:『Onvif開発のクライアント検索編』(http://www.cnblogs.com/lidabo/p/6604957.html)
まず、OnvifはIP:239.255.255.250/Port:32702のマルチキャストアドレスを使用した.
クライアントは、ネットワークセグメント内でProbeを送信し、ネットワークセグメント内のOnvifサービス側デバイスは、このProbeを受信すると、このサービス側デバイスの基本情報を含むProbeMatchを生成してクライアントに返信する.
以前に生成されたOnvifフレームワークによると、このProbeMatchに対応する構造体は
struct __wsdd__ProbeMatches
DoubleLiのブログでは、主な流れは次のとおりです.
1.soapオブジェクトを初期化します.
ONVIFでClientDiscovery関数でstruct SOAP_ENV__ヘッドヘッドヘッドとは
SOAPのEnvelope要素、was_To,was_Actionはヘッダにデータを埋め込むためのパラメータでもある.
2. ONVIF_Initsoap()
上記の内容を定義した後、このブロガーはこのInitsoapインタフェースを作り、同時にこのインタフェースが後続の便利さのためであることを説明した.この便利さは実は後の開発の鑑権操作である.検索する部分ではしばらく使えません.
このインタフェースにはuuidを生成するためのコードがあります.このuuidはheader->wsa_を埋め込むために使用されます.MessageIDフィールドの.毎回値取りが異なるため,部分乱数+部分定値の組み合わせを用いた.uuidの生成には実際にはいくつかのオープンソース法の実装があるが,ここでは乱数法を用いた方が巧みである.
なぜ毎回uuidが違うのかについて:私も知らないが、Onvif公式の「
Application Programmers Guide
」(APG)で説明しています.
// Each probe should have a unique MessageID to be able to match requests and responses.

3. soap_send___wsdd__Porbe()とsoap_recv___wsdd__ProbeMatches()
この部分はProbeプローブの送受信です.
APGのテキストを完全に貼り付けます.
/* ONVIF::Discovery */
// Send WS-Discovery Probe, collect the responses and then
// process the responses.
probematch_type probematcheslist[]={};
// Send probe. See chapter 4.3.1 for details
probe = ONVIF::DiscoverySendProbe(scopes, types);
// Wait a while for responses
while (data_available_and_not_timeout(probe.net_handle))
{
// This fetch next probe match so that we can put it into the list
// See chapter 4.3.2 for details
probematch = ONVIF::DiscoveryReadResponse(probe);
// Store info about the match, first check for duplicates
if (!in_list(probematcheslist, probematch))
{
    add_to_list(probematcheslist, probematch);
}
}
// Process the responses, see chapter 5.1.3 for details.
foreach (probeMatch in probematcheslist)
{
    ONVIF::ProcessMatch(probeMatch);
}
/* ONVIF::DiscoverySendProbe */
DiscoverySendProbe(scopes, types)
{
// Each probe should have a unique MessageID to be able to match
// requests and responses. We store it in the probe place holder for later checking
probe.MessageID = "uuid:" + App.uuidGenerate();
// Build probe message, we provide
// MessageID, Types and Scopes. See SOAP trace section for how
// it actually looks like.
message = App.BuildProbeMessage(probe.MessageID, types, scopes);
// Send probe to multicast address and port according to [WS-Discovery] section 2.4
probe.net_handle = App.send_multicast("239.255.255.250", 3702, message);
return probe;
}
/* ONVIF::DiscoveryReadResponse */
DiscoveryReadResponse(probe)
{
// Read response and process it.
// We need both the body and the Header:
aProbeMatches = App.ReadProbeMatches(probe.net_handle, Header);
// Check if this is a response to the probe we sent:
if (Header.RelatesTo != probe.MessageID) {
return -1;
}
// We pick what we need from the response:
probematch.types = aProbeMatches.ProbeMatch.Types;
probematch.scopes = aProbeMatches.ProbeMatch.Scopes;
// XAddrs is a space separated list of URLs to the Device service:
probematch.xaddrs = aProbeMatches.ProbeMatch.XAddrs;
probematch.metadataversion = aProbeMatches.ProbeMatch.MetadataVersion;
probematch.address = aProbeMatches.ProbeMatch.EndpointReference.Address;
return probematch;
}

デバイスコンピテンシーの取得
デバイス検索時にONVIF_Initsoapはインタフェースを作ったのですが、実は鑑権のためです.
認証とは,サービス側デバイスのユーザ名とパスワード情報を含め,対応する暗号化を行うことである.
Onvifプロトコルを使用してデバイスを操作する場合は、もちろんユーザー名のパスワードが必要です.
なぜInitsoapでこの仕事をするのかというと、認証の情報はsoapのヘッダに含まれるからです.
元ブロガーソースアドレス:《
Onvif開発のクライアント検索編

(http://www.cnblogs.com/lidabo/p/6604963.html)
注意:
認証時のONVIF_GenerateDigest()インタフェースにはSHA 1アルゴリズムが使用されており,OpenSSLオープンソースライブラリ実装を呼び出すことができる.
この文章は前のフレームワークと生成して、書いたのは比較的水で、ものが確かに多くないからです.しかし、多くの資料は基本的にこれらの内容を話しています.実際の操作の内容については『Application Programmers Guide』と合わせて詳しく書きますが、少し長引くかもしれません.