如何生成GetSystemDateAndTime xml

我从这个来源获得了以下一些代码……

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... 

当我在调试器中通过GetProfiles()部分运行wireshark时,我看到生成的XML看起来像:

xml0

将xml更改为以下代码需要什么代码:

XML1

我该如何调用GetSystemDateAndTime函数?

要调用GetProfiles函数,我必须创建一个MediaClient ,然后调用该函数…

是否有MediaClient这样的东西可以访问GetSystemDateAndTime?

编辑:

我发现你可以使用DeviceClient来访问GetSystemDateAndTime函数……

您需要先将设备管理wsdl添加到您的连接服务: https : //www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl

我还添加了System.Net.ServicePointManager.Expect100Continue = false; 在那里,因为我看到有人说这有助于这个链接 ……

所以我补充说:

 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(); 

注意:我仍然收到错误:

  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 

这个错误说在尝试阅读邮件时有麻烦,所以我很难说这可能是由于某种编码…

而且我是对的!

我所要做的就是更改TextMessageEncodingBindingElement创建中的参数。

 MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.WSAddressing10) 

您需要做的就是确保您具有良好的编码AuthenticationScheme

这是我的最终代码,以获得一个onvif相机(这里cohuHD相机)系统和日期和时间设置:

 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; } 

奖金:

如果要执行需要凭据的function,可以将其添加到deviceClient,如下所示:

 //DIGEST (httpBinding) deviceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; deviceClient.ClientCredentials.HttpDigest.ClientCredential.UserName = userName; deviceClient.ClientCredentials.HttpDigest.ClientCredential.Password = password; 

还要注意EndpointAddress的URL …我认为有些相机使用Device_service和其他device_service。