0

Delphi を使用して、Onvif SOAP プロトコルを使用して IP カメラにアクセスし、制御したいと考えています。

ただし、Delphi からの呼び出しを実際に実行する方法がわかりません。次の WDSL をインポートしました。

http://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl

Delphiでユニットが生成されました。しかし、どうすればカメラに向かって呼び出しを実行できますか? 生成されたこれを THTTPRIO と一緒に何らかの方法で使用することになっていますか? 所有しているカメラ (現在は Axis Q1755 カメラ) の IP アドレスを指定する方法を教えてください。

誰かが私を正しい方向に向けることによって私を始めさせることができれば、私はとても感謝しています.

4

2 に答える 2

1

Delphi のインポータを使用した場合は、Web サービスとそれに対応する .xml ファイルWSDLを表すために必要なクラスが生成されます。requestSOAPresponse

wrapperまた、実際に呼び出しを行うために使用するも生成されます。通常、次のようないくつかのメソッドがあります。

function mySoapMethod(myRequest: TmyRequestType): TMyResponse;

電話をかけるには、基本的に次のようにします。

  1. wrapperインスタンス参照を取得します。に似たものと呼ばれるメソッドがユニットにあるはずGetWrapperです。
  2. 必要に応じて、 のインスタンスを作成し、request typeそのすべてのプロパティを設定します。SOAPメソッドがパラメーターとしていくつかの基本的な型を必要とするだけの場合、リクエストクラス自体が存在しない可能性があります。request typeまた、非常に複雑な場合は、オブジェクトのインスタンスを作成し、それらをプロパティとしてリクエストに割り当てる必要があることを暗示する可能性があることも考慮してください。
  3. 対応する を使用しwrapper methodてリクエストを送信します (単純な呼び出しの場合はパラメーターを設定します)。
  4. responseオブジェクトを受け取り、必要に応じて操作します。

擬似コードでは、次のようになります。

myWrapper := GetMyWrapper();
myRequest := TMyRequest.Create;
//set myRequest properties
myResponse := myWrapper.mySoapMethod(myRequest);
//do whatever you need with the response

ラッパーについて

は、いくつかのメソッドが追加されwrapperたインターフェイスの実装になります。実際には、呼び出すことができるIInvokableメソッドごとに 1 つのメソッドが必要です。SOAP method

通常、そのインターフェイス宣言は次のようになります。

TmyWrapper = interface(IInvokable)
['...'] //GUID here
  function oneMethod(...): oneMethodResponse;
  function anotherMethod(...): anotherMethodResponse;
end;

function getMyWrapper(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): TmyWrapper ;

関数の実装は次のようになります。

function GetMyWrapper(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): TmyWrapper;
const
  defWSDL = 'http://<soap service IP and port>/<soap service name>?wsdl';
  defURL  = 'http://<soap service IP and port>/<soap service name>';
  defSvc  = '<default service name>';
  defPrt  = '<default service port>';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as TmyWrapper );
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

いくつかの補足事項:

  • メソッドを使用してインスタンスを取得するときに、HTTPRIOインスタンスを に注入できます。これは、たとえば、別のものを設定したり、生成されたものを調べたりするのに役立ちます。wrappergetXYZWrapperSOAP URLXML
  • Delphi は、が期待するXMLのとは少し異なる方法で送信される を生成することがあります。SOAP機能するはずなのに機能しない場合は、XML生成されたものを調べて、本来あるべきものと比較してください。HTTPRIOオブジェクトのonBeforeExecuteイベントを使用して、XML送信する前に を変更できます。
  • 必要な場合onAfterExecuteは、オブジェクトのメソッドを使用して応答HTTPRIOを検査することもできます。XML
于 2014-09-28T20:16:15.777 に答える