如何生成 GetSystemDateAndTime xml
How to generate GetSystemDateAndTime xml
我从 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...
当我 运行 wireshark 在调试器中通过 GetProfiles()
部分时,我看到生成的 XML 看起来像:
需要什么代码才能将 xml 更改为:
我该如何调用 GetSystemDateAndTime
函数?
要调用 GetProfiles
函数,我必须创建一个 MediaClient
,然后调用该函数...
是否有 MediaClient 之类的东西可以访问 GetSystemDateAndTime?
编辑:
我发现您可以使用 DeviceClient
来访问 GetSystemDateAndTime
函数...
您需要先将设备管理 wsdl 添加到您连接的服务中:
https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
我还在那里添加了 System.Net.ServicePointManager.Expect100Continue = false;
因为我看到有人说它对 this link 有帮助...
所以我补充说:
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)
您需要做的就是确保您拥有良好的 encoding 和 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;
}
奖金:
如果您想执行需要凭证的功能,您可以像这样将它们添加到您的 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 .
我从 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...
当我 运行 wireshark 在调试器中通过 GetProfiles()
部分时,我看到生成的 XML 看起来像:
需要什么代码才能将 xml 更改为:
我该如何调用 GetSystemDateAndTime
函数?
要调用 GetProfiles
函数,我必须创建一个 MediaClient
,然后调用该函数...
是否有 MediaClient 之类的东西可以访问 GetSystemDateAndTime?
编辑:
我发现您可以使用 DeviceClient
来访问 GetSystemDateAndTime
函数...
您需要先将设备管理 wsdl 添加到您连接的服务中: https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
我还在那里添加了 System.Net.ServicePointManager.Expect100Continue = false;
因为我看到有人说它对 this link 有帮助...
所以我补充说:
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)
您需要做的就是确保您拥有良好的 encoding 和 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;
}
奖金:
如果您想执行需要凭证的功能,您可以像这样将它们添加到您的 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 .