问题描述
我有以下从
需要什么代码才能将 xml 更改为如下所示:
我应该如何调用 GetSystemDateAndTime
函数?
要调用 GetProfiles
函数,我必须创建一个 MediaClient
,然后调用该函数...
是否有 MediaClient 之类的东西可以访问 GetSystemDateAndTime??
我发现您可以使用 DeviceClient
来访问 GetSystemDateAndTime
函数...
您需要先将设备管理 wsdl 添加到您连接的服务中:https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
我还在其中添加了 System.Net.ServicePointManager.Expect100Continue = false;
因为我看到有人在 这个链接...
所以我补充说:
CustomBinding 绑定 = new CustomBinding(messageElement, httpBinding);System.Net.ServicePointManager.Expect100Continue = false;DeviceClient d = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));var time = d.GetSystemDateAndTime();
注意:我仍然收到错误消息:
ErrorMessage "来自命名空间 'http://www.w3.org/2005/08/addressing' 的标头 'To' 不被此消息的接收者理解,导致消息未被处理. 此错误一般表示此消息的发送方启用了接收方无法处理的通信协议.请确保客户端绑定的配置与服务的绑定一致." string
这个错误是说尝试阅读消息时出现问题,所以我认为这可能是由于某种编码......
我是对的!!
我所要做的就是在 TextMessageEncodingBindingElement
的创建中更改一个参数.
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)
您需要做的就是确保您拥有良好的encoding和AuthenticationScheme...
这是我获取 onvif 相机(此处为 cohuHD 相机)系统以及日期和时间设置的最终代码:
public bool Initialise(string cameraAddress, string userName, string password){布尔结果=假;尝试{var messageElement = new TextMessageEncodingBindingElement(){MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)};HttpTransportBindingElement httpBinding = 新的 HttpTransportBindingElement(){AuthenticationScheme = AuthenticationSchemes.Digest};CustomBinding 绑定 = new CustomBinding(messageElement, httpBinding);System.Net.ServicePointManager.Expect100Continue = false;DeviceClient deviceClient = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));var temps = deviceClient.GetSystemDateAndTime();}捕捉(例外前){ErrorMessage = ex.Message;}返回结果;}
奖励:
如果你想执行一个需要凭据的函数,你可以像这样将它们添加到你的 deviceClient 中:
//DIGEST (httpBinding)deviceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;deviceClient.ClientCredentials.HttpDigest.ClientCredential.UserName = 用户名;deviceClient.ClientCredentials.HttpDigest.ClientCredential.Password = 密码;
还要注意 EndpointAddress
的 URL...我认为有些相机使用 Device_service 和其他 device_service.
I have the following bit of code that i took from this source...
public bool Initialise(string cameraAddress, string userName, string password)
{
bool result = false;
try
{
var messageElement = new TextMessageEncodingBindingElement()
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
{
AuthenticationScheme = AuthenticationSchemes.Digest
};
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
mediaClient = new MediaClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/Media"));
mediaClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
mediaClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
mediaClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;
var profs = mediaClient.GetProfiles();
//rest of the code...
When i run wireshark while going through the GetProfiles()
part in the debugger, I see that the generated XML looks like:
What code would it take to change the xml to look like:
How am i supposed to call the GetSystemDateAndTime
function?
To call the GetProfiles
function, I had to create a MediaClient
and, then, call that function...
Is there such thing as a MediaClient to get access to the GetSystemDateAndTime??
Edit:
I found that you could use the DeviceClient
to get access the the GetSystemDateAndTime
function...
You'll need to add the device management wsdl to your connected services before: https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
I also added System.Net.ServicePointManager.Expect100Continue = false;
in there because i saw someone said it helped at this link...
So i added :
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
System.Net.ServicePointManager.Expect100Continue = false;
DeviceClient d = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));
var time = d.GetSystemDateAndTime();
Note: I'm still getting the error:
ErrorMessage "The header 'To' from the namespace 'http://www.w3.org/2005/08/addressing' was not understood by the recipient of this message, causing the message to not be processed. This error typically indicates that the sender of this message has enabled a communication protocol that the receiver cannot process. Please ensure that the configuration of the client's binding is consistent with the service's binding. " string
This error is saying that there is trouble when trying to read a message, so i tough it was probably due to some sort of encoding ...
AND I WAS RIGHT!!
All I had to do was changing a parameter in the TextMessageEncodingBindingElement
's creation.
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)
All you need to do is make sure that you have good encoding and AuthenticationScheme...
Here's my final code to get an onvif camera's (here cohuHD camera) system and date and time settings:
public bool Initialise(string cameraAddress, string userName, string password)
{
bool result = false;
try
{
var messageElement = new TextMessageEncodingBindingElement()
{
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10)
};
HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
{
AuthenticationScheme = AuthenticationSchemes.Digest
};
CustomBinding bind = new CustomBinding(messageElement, httpBinding);
System.Net.ServicePointManager.Expect100Continue = false;
DeviceClient deviceClient = new DeviceClient(bind, new EndpointAddress($"http://{cameraAddress}/onvif/device_service"));
var temps = deviceClient.GetSystemDateAndTime();
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
}
return result;
}
Bonus:
If you want to execute a function that needs credentials, you can add those to your deviceClient like so:
//DIGEST (httpBinding)
deviceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
deviceClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName;
deviceClient.ClientCredentials.HttpDigest.ClientCredential.Password = password;
Watch out also for the EndpointAddress
' URL... I think some cameras use Device_service and other device_service .
这篇关于如何生成 GetSystemDateAndTime xml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!