你可以使用我通过 Delphi XE7 导入的 WSDL
媒体:媒体
.WSDL
成像:
Imaging.wsdl
设备管理:
devicemgmt.wsdl
通常导入的 WSDL 具有如下功能
function GetMySoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): MySoap;
但它不存在于 onvif 导入的 wsdl 中。
将此函数添加到您的项目实例中,Media2 是 IInvokable 类的名称
function GetWSSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Media2;
const
defWSDL = 'http://192.168.1.1/onvif/Media?WSDL';
defURL = 'http://192.168.1.1/onvif/Media';
defSvc = 'Media';
defPrt = '80';
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 Media2);
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;
另一种解决方案,通过发送 http 请求示例请求获取一些一般信息 GetProfiles 是方法的名称
<?xml version="1.0"?> <soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsdl="http://www.onvif.org/ver10/media/wsdl">
<soap:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
<UsernameToken>
<Username>%s</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%s</Password>
<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%s</Nonce>
<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">%s</Created>
</UsernameToken>
</Security>
</soap:Header>
<soap:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<GetProfiles xmlns="http://www.onvif.org/ver10/media/wsdl" />
</soap:Body>
</soap:Envelope>
按钮代码:
ip:http: //192.168.1.1
网址:onvif/媒体
GetONVIFPasswordDigest(ed_user.text, ED_pass.text, PasswordDigest, Nonce, Created);
User_Pass := Format(M_Request, [UserName, PasswordDigest, Nonce, Created]);
ONVIFRequest(ED_IP.Text + ED_URL.Text,User_Pass,Result);
密码制作程序:
procedure GetONVIFPasswordDigest(const UserName, Password: String; Var PasswordDigest, Nonce, Created: String);
Var
i: Integer;
raw_nonce, bnonce, digest , S_In: TBytes;
raw_digest: TBytes;
DT : TDateTime;
begin
SetLength(raw_nonce, 20);
for i := 0 to High(raw_nonce) do
raw_nonce[i] := Random(256);
bnonce := TNetEncoding.Base64.Encode(raw_nonce);
Nonce := BytesToString(bnonce);
DT := Now();
Created := GetONVIFDateTime(DT);
S_In := raw_nonce + StringToBytes(Created) + StringToBytes(Password);
raw_digest := SHA1(S_In);
digest := TNetEncoding.Base64.Encode(raw_digest);
PasswordDigest := BytesToString(digest);
end;
获取数据过程:
procedure ONVIFRequest(const Addr: String; const InStream, OutStream: TStringStream);overload;
Var
idhtp1: TIdHTTP;
Uri: TIdURI;
begin
idhtp1 := TIdHTTP.Create;
Uri := TIdURI.Create(Addr);
try
With idhtp1 do
begin
AllowCookies := True;
HandleRedirects := True;
Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
Request.Host := '';
Request.Connection := '';
Request.Accept := '';
Request.UserAgent := '';
Request.CustomHeaders.Clear;
Request.ContentType := 'text/xml;charset=utf-8';
Request.CustomHeaders.Add('Host: ' + Uri.Host);
//-------------------
request.username := ed_user.text;
request.password := ed_pass.text;
HTTPOptions := [hoInProcessAuth,hoForceEncodeParams,hoNoProtocolErrorException, hoWantProtocolErrorContent];
//-------------------
ProtocolVersion := pv1_1;
Post(Addr, InStream, OutStream);
end;
finally
Uri.Free;
idhtp1.Free;
end;
end;
procedure ONVIFRequest(const Addr, Request: String; Var Answer: String);overload;
Var
InStream, OutStream: TStringStream;
begin
InStream := TStringStream.Create(Request);
OutStream := TStringStream.Create;
try
ONVIFRequest(Addr, InStream, OutStream);
Answer := OutStream.DataString;
finally
InStream.Free;
OutStream.Free;
end;
end;
您还可以在此处找到更好的示例
https://github.com/Laex/Delphi-ONVIF