Problem bardziej ogólny bo dotyczy bardziej komunikacji soap'owej niż samego Delphi ale aktualnie problem tkwi w Delphi.
Komunikacja z DVR/Kamerami po protokole ONVIF - działa wszystko (GetCapabilities[device], GetDeviceInfo[device], GetVideoSources[media], GetProfiles[media]) za wyjątkiem dwóch akcji: GetStreamUri i GetNetworkInterfaces, które zwracają
"HTTP/1.0 503 Service Unavailable"
Nie jest to problem samego DVR gdyż program OnvifManager łączy się z tym samym DVR i poprawnie wysyła tę kopertę otrzymując prawidłową odpowiedź.
Porównałem obie koperty (z obu programów) i są takie same:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
<UsernameToken>
<Username>Admin</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">NUY2RkRFNTFEMDY5ODU1NDU0MEVGNTY1RDNGM0FEQzQwMkYxQzY0NQ==</Password>
<Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">bmV4dDEyMw==</Nonce>
<Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2016-05-19T06:43:42.689Z</Created>
</UsernameToken>
</Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
<StreamSetup>
<Stream xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast</Stream>
<Transport xmlns="http://www.onvif.org/ver10/schema">
<Protocol>HTTP</Protocol>
</Transport>
</StreamSetup>
<ProfileToken>Profile1</ProfileToken>
</GetStreamUri>
</s:Body>
</s:Envelope>
Natomiast w moim programie ta akcja zwraca powyższy błąd.
Sposób wysyłki kopert jest taki sam dla każdej z akcji:
try
oMsgStr := TStringStream.Create(FMsgContent);
try
oMsgStr.Position := 0;
FMsgResponse := FIdHTTP.Post(sAddr, oMsgStr);
prProcessResponse(FMsgResponse);
Result := True;
finally
oMsgStr.Free;
end;
except
on eExc: Exception do begin
if (Assigned(ErrorLog)) then
ErrorLog.Add(eExc.Message);
end;
end;
Adres dla serwisu media oczywiście pobrany z GetCapabilities ale jest taki sam jak główny adres.
http://ADRES_IP:83/onvif/device_service
Reasumując... skąd stały problem z tymi dwoma ramkami? I jak sobie z nim poradzić?