fajiao
2 years ago
46 changed files with 34242 additions and 274 deletions
@ -0,0 +1,54 @@ |
|||
using Cis.Application.Cb; |
|||
using EC.Helper.Onvif; |
|||
|
|||
namespace Cis.Application.Core.Component.Onvif; |
|||
|
|||
public interface IOnvifServer |
|||
{ |
|||
#region Base Method
|
|||
|
|||
/// <summary>
|
|||
/// 注册 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="camera"></param>
|
|||
/// <returns></returns>
|
|||
public bool Register(CbCamera camera); |
|||
|
|||
/// <summary>
|
|||
/// 注册 onvifClient(异步)
|
|||
/// </summary>
|
|||
/// <param name="camera"></param>
|
|||
/// <returns></returns>
|
|||
public Task<bool> RegisterAsync(CbCamera camera); |
|||
|
|||
/// <summary>
|
|||
/// 注销 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool Delete(long cameraId); |
|||
|
|||
/// <summary>
|
|||
/// 是否存在 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public bool IsExists(long cameraId); |
|||
|
|||
/// <summary>
|
|||
/// 获取 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <returns></returns>
|
|||
public OnvifClient Get(long cameraId); |
|||
|
|||
/// <summary>
|
|||
/// 获取 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId"></param>
|
|||
/// <param name="client"></param>
|
|||
/// <returns></returns>
|
|||
public bool TryGet(long cameraId, out OnvifClient client); |
|||
|
|||
#endregion Base Method
|
|||
} |
@ -0,0 +1,68 @@ |
|||
using Cis.Application.Cb; |
|||
using EC.Helper.Onvif; |
|||
using System.Collections.Concurrent; |
|||
|
|||
namespace Cis.Application.Core.Component.Onvif; |
|||
|
|||
public class OnvifServer : IOnvifServer, ISingleton |
|||
{ |
|||
#region Attr
|
|||
|
|||
/// <summary>
|
|||
/// {cameraId, OnvifClient}
|
|||
/// </summary>
|
|||
private ConcurrentDictionary<long, OnvifClient> OnvifClientDict { get; set; } = new(); |
|||
|
|||
#endregion Attr
|
|||
|
|||
public OnvifServer() |
|||
{ |
|||
} |
|||
|
|||
#region Base Method
|
|||
|
|||
public bool Register(CbCamera camera) |
|||
{ |
|||
bool ret = OnvifClientDict.ContainsKey(camera.Id); |
|||
if (ret) return false; |
|||
OnvifClient client = new(camera.Ip, camera.UserName, camera.Password); |
|||
ret = client.Init().Result; |
|||
if (!ret) return false; |
|||
ret = OnvifClientDict.TryAdd(camera.Id, client); |
|||
return ret; |
|||
} |
|||
|
|||
public async Task<bool> RegisterAsync(CbCamera camera) |
|||
{ |
|||
bool ret = OnvifClientDict.ContainsKey(camera.Id); |
|||
if (ret) return false; |
|||
OnvifClient client = new(camera.Ip, camera.UserName, camera.Password); |
|||
ret = await client.Init(); |
|||
if(!ret) return false; |
|||
ret = OnvifClientDict.TryAdd(camera.Id, client); |
|||
return ret; |
|||
} |
|||
|
|||
public bool Delete(long cameraId) |
|||
{ |
|||
return OnvifClientDict.TryRemove(cameraId, out _); |
|||
} |
|||
|
|||
public bool IsExists(long cameraId) |
|||
{ |
|||
return OnvifClientDict.ContainsKey(cameraId); |
|||
} |
|||
|
|||
public OnvifClient Get(long cameraId) |
|||
{ |
|||
OnvifClientDict.TryGetValue(cameraId, out OnvifClient client); |
|||
return client; |
|||
} |
|||
|
|||
public bool TryGet(long cameraId, out OnvifClient client) |
|||
{ |
|||
return OnvifClientDict.TryGetValue(cameraId, out client); |
|||
} |
|||
|
|||
#endregion Base Method
|
|||
} |
@ -0,0 +1,245 @@ |
|||
using Cis.Application.Cb; |
|||
using Cis.Application.Core.Component.Onvif; |
|||
using EC.Helper.Onvif; |
|||
|
|||
namespace Cis.Application.Core; |
|||
|
|||
[ApiDescriptionSettings(CoreInfo.GroupName, Order = CoreInfo.OnvifGroupOrder)] |
|||
public class OnvifService : IDynamicApiController, ITransient |
|||
{ |
|||
#region
|
|||
|
|||
private readonly SqlSugarRepository<CbCamera> _cbCameraRep; |
|||
|
|||
private readonly OnvifServer _onvifServer; |
|||
|
|||
#endregion
|
|||
|
|||
public OnvifService(SqlSugarRepository<CbCamera> cbCameraRep, OnvifServer onvifServer) |
|||
{ |
|||
_cbCameraRep = cbCameraRep; |
|||
_onvifServer = onvifServer; |
|||
} |
|||
|
|||
#region Base Method
|
|||
|
|||
/// <summary>
|
|||
/// 注册 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> Register([Required][FromForm] long cameraId) |
|||
{ |
|||
CbCamera camera = await _cbCameraRep.GetByIdAsync(cameraId); |
|||
if (camera == null) return false; |
|||
bool ret = _onvifServer.IsExists(camera.Id); |
|||
if (ret) return false; |
|||
ret = await _onvifServer.RegisterAsync(camera); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 注销 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public bool Delete([Required][FromForm] long cameraId) |
|||
{ |
|||
return _onvifServer.Delete(cameraId); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 是否存在 onvifClient
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsExists([Required] long cameraId) |
|||
{ |
|||
return _onvifServer.IsExists(cameraId); |
|||
} |
|||
|
|||
#endregion Base Method
|
|||
|
|||
#region Imaging Method
|
|||
|
|||
/// <summary>
|
|||
/// 变焦绝对移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="position">变焦移动绝对点:[-1,1]</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> FocusAbsoluteMove([Required][FromForm] long cameraId, [Required][FromForm] float position) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.FocusAbsoluteMove(position); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 变焦相对移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="distance">变焦移动相对点:[-1,1]</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> FocusRelativeMove([Required][FromForm] long cameraId, [Required][FromForm] float distance) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.FocusRelativeMove(distance); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 变焦持续移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="speed">持续移动方向:[-1,1]</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> FocusContinuousMove([Required][FromForm] long cameraId, [Required][FromForm] float speed) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.FocusContinuousMove(speed); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 停止变焦
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
[HttpPost] |
|||
public async Task<bool> FocusStopMove([Required][FromForm] long cameraId) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.FocusStopMove(); |
|||
return true; |
|||
} |
|||
|
|||
#endregion Imaging Method
|
|||
|
|||
#region Media Method
|
|||
|
|||
/// <summary>
|
|||
/// 获取播放视频 URL
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public async Task<string> GetStreamUrl([Required] long cameraId) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return string.Empty; |
|||
string url = await client.GetStreamUrl(); |
|||
return url; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 获取抓图 URL
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public async Task<string> GetSnapshotUrl([Required] long cameraId) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return string.Empty; |
|||
string url = await client.GetSnapshotUrl(); |
|||
return url; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 获取抓图 Base64
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public async Task<string> GetSnapshot([Required] long cameraId) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return string.Empty; |
|||
string snapshotBase64 = await client.GetSnapshot(); |
|||
return snapshotBase64; |
|||
} |
|||
|
|||
#endregion Media Method
|
|||
|
|||
#region Ptz Method
|
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="pan">水平方向移动绝对点:[-1,1]</param>
|
|||
/// <param name="tilt">垂直方向移动绝对点:[-1,1]</param>
|
|||
/// <param name="zoom">变倍绝对点:[-1,1]</param>
|
|||
/// <param name="atomDist">可以理解为移动速度:[0,1],默认 0.1</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> AbsoluteMove([Required][FromForm] long cameraId, |
|||
[Required][FromForm] float pan, [Required][FromForm] float tilt, [Required][FromForm] float zoom, [FromForm] float atomDist = 0.1f) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.AbsoluteMove(pan, tilt, zoom, atomDist); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 相对移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="pan">水平方向移动相对点:[-1,1]</param>
|
|||
/// <param name="tilt">垂直方向移动相对点:[-1,1]</param>
|
|||
/// <param name="zoom">变倍相对点:[-1,1]</param>
|
|||
/// <param name="atomSpeed">移动速度:[0,1],默认 0.1</param>
|
|||
[HttpPost] |
|||
public async Task<bool> RelativeMove([Required][FromForm] long cameraId, |
|||
[Required][FromForm] float pan, [Required][FromForm] float tilt, [Required][FromForm] float zoom, [FromForm] float atomSpeed = 0.1f) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.RelativeMove(pan, tilt, zoom, atomSpeed); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 持续移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
/// <param name="pan">水平方向移动方向:[-1,1]</param>
|
|||
/// <param name="tilt">垂直方向移动方向:[-1,1]</param>
|
|||
/// <param name="zoom">变倍移动方向:[-1,1]</param>
|
|||
/// <param name="timeout">超时时间,ms</param>
|
|||
[HttpPost] |
|||
public async Task<bool> ContinuousMove([Required][FromForm] long cameraId, |
|||
[Required][FromForm] float pan, [Required][FromForm] float tilt, [Required][FromForm] float zoom, [FromForm] string timeout = "") |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.ContinuousMove(pan, tilt, zoom, timeout); |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 停止移动
|
|||
/// </summary>
|
|||
/// <param name="cameraId">cbCameraId</param>
|
|||
[HttpPost] |
|||
public async Task<bool> StopMove([Required][FromForm] long cameraId) |
|||
{ |
|||
bool ret = _onvifServer.TryGet(cameraId, out OnvifClient client); |
|||
if (!ret) return false; |
|||
await client.StopMove(); |
|||
return true; |
|||
} |
|||
|
|||
#endregion Ptz Method
|
|||
} |
File diff suppressed because it is too large
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,723 @@ |
|||
//------------------------------------------------------------------------------
|
|||
// <auto-generated>
|
|||
// 此代码由工具生成。
|
|||
//
|
|||
// 对此文件的更改可能导致不正确的行为,并在以下条件下丢失:
|
|||
// 代码重新生成。
|
|||
// </auto-generated>
|
|||
//------------------------------------------------------------------------------
|
|||
|
|||
namespace EC.Helper.Onvif.Discovery; |
|||
|
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.onvif.org/ver10/network/wsdl", ConfigurationName= "EC.Onvif.Discovery.RemoteDiscoveryPort")] |
|||
public interface RemoteDiscoveryPort |
|||
{ |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Hello", ReplyAction="*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] |
|||
HelloResponse Hello(HelloRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Hello", ReplyAction="*")] |
|||
System.Threading.Tasks.Task<HelloResponse> HelloAsync(HelloRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Bye", ReplyAction="*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] |
|||
ByeResponse Bye(ByeRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Bye", ReplyAction="*")] |
|||
System.Threading.Tasks.Task<ByeResponse> ByeAsync(ByeRequest request); |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class EndpointReferenceType |
|||
{ |
|||
|
|||
private AttributedURI addressField; |
|||
|
|||
private ReferencePropertiesType referencePropertiesField; |
|||
|
|||
private ReferenceParametersType referenceParametersField; |
|||
|
|||
private AttributedQName portTypeField; |
|||
|
|||
private ServiceNameType serviceNameField; |
|||
|
|||
private System.Xml.XmlElement[] anyField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=0)] |
|||
public AttributedURI Address |
|||
{ |
|||
get |
|||
{ |
|||
return this.addressField; |
|||
} |
|||
set |
|||
{ |
|||
this.addressField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=1)] |
|||
public ReferencePropertiesType ReferenceProperties |
|||
{ |
|||
get |
|||
{ |
|||
return this.referencePropertiesField; |
|||
} |
|||
set |
|||
{ |
|||
this.referencePropertiesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=2)] |
|||
public ReferenceParametersType ReferenceParameters |
|||
{ |
|||
get |
|||
{ |
|||
return this.referenceParametersField; |
|||
} |
|||
set |
|||
{ |
|||
this.referenceParametersField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=3)] |
|||
public AttributedQName PortType |
|||
{ |
|||
get |
|||
{ |
|||
return this.portTypeField; |
|||
} |
|||
set |
|||
{ |
|||
this.portTypeField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=4)] |
|||
public ServiceNameType ServiceName |
|||
{ |
|||
get |
|||
{ |
|||
return this.serviceNameField; |
|||
} |
|||
set |
|||
{ |
|||
this.serviceNameField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order=5)] |
|||
public System.Xml.XmlElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class AttributedURI |
|||
{ |
|||
|
|||
private string valueField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlTextAttribute(DataType="anyURI")] |
|||
public string Value |
|||
{ |
|||
get |
|||
{ |
|||
return this.valueField; |
|||
} |
|||
set |
|||
{ |
|||
this.valueField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public partial class ProbeMatchType |
|||
{ |
|||
|
|||
private EndpointReferenceType endpointReferenceField; |
|||
|
|||
private string typesField; |
|||
|
|||
private ScopesType scopesField; |
|||
|
|||
private string xAddrsField; |
|||
|
|||
private uint metadataVersionField; |
|||
|
|||
private System.Xml.XmlElement[] anyField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing", Order=0)] |
|||
public EndpointReferenceType EndpointReference |
|||
{ |
|||
get |
|||
{ |
|||
return this.endpointReferenceField; |
|||
} |
|||
set |
|||
{ |
|||
this.endpointReferenceField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=1)] |
|||
public string Types |
|||
{ |
|||
get |
|||
{ |
|||
return this.typesField; |
|||
} |
|||
set |
|||
{ |
|||
this.typesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=2)] |
|||
public ScopesType Scopes |
|||
{ |
|||
get |
|||
{ |
|||
return this.scopesField; |
|||
} |
|||
set |
|||
{ |
|||
this.scopesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=3)] |
|||
public string XAddrs |
|||
{ |
|||
get |
|||
{ |
|||
return this.xAddrsField; |
|||
} |
|||
set |
|||
{ |
|||
this.xAddrsField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order=4)] |
|||
public uint MetadataVersion |
|||
{ |
|||
get |
|||
{ |
|||
return this.metadataVersionField; |
|||
} |
|||
set |
|||
{ |
|||
this.metadataVersionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order=5)] |
|||
public System.Xml.XmlElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public partial class ScopesType |
|||
{ |
|||
|
|||
private string matchByField; |
|||
|
|||
private string[] textField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")] |
|||
public string MatchBy |
|||
{ |
|||
get |
|||
{ |
|||
return this.matchByField; |
|||
} |
|||
set |
|||
{ |
|||
this.matchByField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlTextAttribute(DataType="anyURI")] |
|||
public string[] Text |
|||
{ |
|||
get |
|||
{ |
|||
return this.textField; |
|||
} |
|||
set |
|||
{ |
|||
this.textField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class ServiceNameType |
|||
{ |
|||
|
|||
private string portNameField; |
|||
|
|||
private System.Xml.XmlQualifiedName valueField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute(DataType="NCName")] |
|||
public string PortName |
|||
{ |
|||
get |
|||
{ |
|||
return this.portNameField; |
|||
} |
|||
set |
|||
{ |
|||
this.portNameField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlTextAttribute()] |
|||
public System.Xml.XmlQualifiedName Value |
|||
{ |
|||
get |
|||
{ |
|||
return this.valueField; |
|||
} |
|||
set |
|||
{ |
|||
this.valueField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class AttributedQName |
|||
{ |
|||
|
|||
private System.Xml.XmlQualifiedName valueField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlTextAttribute()] |
|||
public System.Xml.XmlQualifiedName Value |
|||
{ |
|||
get |
|||
{ |
|||
return this.valueField; |
|||
} |
|||
set |
|||
{ |
|||
this.valueField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class ReferenceParametersType |
|||
{ |
|||
|
|||
private System.Xml.XmlElement[] anyField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order=0)] |
|||
public System.Xml.XmlElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public partial class ReferencePropertiesType |
|||
{ |
|||
|
|||
private System.Xml.XmlElement[] anyField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order=0)] |
|||
public System.Xml.XmlElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="Hello", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class HelloRequest |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public EndpointReferenceType EndpointReference; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=1)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string Types; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=2)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public ScopesType Scopes; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=3)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string XAddrs; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=4)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public uint MetadataVersion; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=5)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public HelloRequest() |
|||
{ |
|||
} |
|||
|
|||
public HelloRequest(EndpointReferenceType EndpointReference, string Types, ScopesType Scopes, string XAddrs, uint MetadataVersion, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.EndpointReference = EndpointReference; |
|||
this.Types = Types; |
|||
this.Scopes = Scopes; |
|||
this.XAddrs = XAddrs; |
|||
this.MetadataVersion = MetadataVersion; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="HelloResponse", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class HelloResponse |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public EndpointReferenceType EndpointReference; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=1)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public HelloResponse() |
|||
{ |
|||
} |
|||
|
|||
public HelloResponse(EndpointReferenceType EndpointReference, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.EndpointReference = EndpointReference; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="Bye", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class ByeRequest |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public EndpointReferenceType EndpointReference; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=1)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string Types; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=2)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public ScopesType Scopes; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=3)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string XAddrs; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=4)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public uint MetadataVersion; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=5)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public ByeRequest() |
|||
{ |
|||
} |
|||
|
|||
public ByeRequest(EndpointReferenceType EndpointReference, string Types, ScopesType Scopes, string XAddrs, uint MetadataVersion, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.EndpointReference = EndpointReference; |
|||
this.Types = Types; |
|||
this.Scopes = Scopes; |
|||
this.XAddrs = XAddrs; |
|||
this.MetadataVersion = MetadataVersion; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="ByeResponse", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class ByeResponse |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public EndpointReferenceType EndpointReference; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=1)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public ByeResponse() |
|||
{ |
|||
} |
|||
|
|||
public ByeResponse(EndpointReferenceType EndpointReference, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.EndpointReference = EndpointReference; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
public interface RemoteDiscoveryPortChannel : RemoteDiscoveryPort, System.ServiceModel.IClientChannel |
|||
{ |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
public partial class RemoteDiscoveryPortClient : System.ServiceModel.ClientBase<RemoteDiscoveryPort>, RemoteDiscoveryPort |
|||
{ |
|||
|
|||
public RemoteDiscoveryPortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : |
|||
base(binding, remoteAddress) |
|||
{ |
|||
} |
|||
|
|||
public HelloResponse Hello(HelloRequest request) |
|||
{ |
|||
return base.Channel.Hello(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<HelloResponse> HelloAsync(HelloRequest request) |
|||
{ |
|||
return base.Channel.HelloAsync(request); |
|||
} |
|||
|
|||
public ByeResponse Bye(ByeRequest request) |
|||
{ |
|||
return base.Channel.Bye(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ByeResponse> ByeAsync(ByeRequest request) |
|||
{ |
|||
return base.Channel.ByeAsync(request); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task OpenAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen)); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task CloseAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose)); |
|||
} |
|||
} |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.onvif.org/ver10/network/wsdl", ConfigurationName= "EC.Onvif.Discovery.DiscoveryLookupPort")] |
|||
public interface DiscoveryLookupPort |
|||
{ |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Probe", ReplyAction="*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] |
|||
ProbeResponse Probe(ProbeRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action="http://www.onvif.org/ver10/network/wsdl/Probe", ReplyAction="*")] |
|||
System.Threading.Tasks.Task<ProbeResponse> ProbeAsync(ProbeRequest request); |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="Probe", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class ProbeRequest |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string Types; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=1)] |
|||
[System.Xml.Serialization.XmlElementAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public ScopesType Scopes; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=2)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public ProbeRequest() |
|||
{ |
|||
} |
|||
|
|||
public ProbeRequest(string Types, ScopesType Scopes, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.Types = Types; |
|||
this.Scopes = Scopes; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName="ProbeResponse", WrapperNamespace="http://www.onvif.org/ver10/network/wsdl", IsWrapped=true)] |
|||
public partial class ProbeResponse |
|||
{ |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery", Order=0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("ProbeMatch", Namespace="http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public ProbeMatchType[] ProbeMatch; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=1)] |
|||
[System.Xml.Serialization.XmlAnyElementAttribute()] |
|||
public System.Xml.XmlElement[] Any; |
|||
|
|||
public System.Xml.XmlAttribute[] AnyAttr; |
|||
|
|||
public ProbeResponse() |
|||
{ |
|||
} |
|||
|
|||
public ProbeResponse(ProbeMatchType[] ProbeMatch, System.Xml.XmlElement[] Any, System.Xml.XmlAttribute[] AnyAttr) |
|||
{ |
|||
this.ProbeMatch = ProbeMatch; |
|||
this.Any = Any; |
|||
this.AnyAttr = AnyAttr; |
|||
} |
|||
} |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
public interface DiscoveryLookupPortChannel : DiscoveryLookupPort, System.ServiceModel.IClientChannel |
|||
{ |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.3-preview3.21351.2")] |
|||
public partial class DiscoveryLookupPortClient : System.ServiceModel.ClientBase<DiscoveryLookupPort>, DiscoveryLookupPort |
|||
{ |
|||
|
|||
public DiscoveryLookupPortClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : |
|||
base(binding, remoteAddress) |
|||
{ |
|||
} |
|||
|
|||
public ProbeResponse Probe(ProbeRequest request) |
|||
{ |
|||
return base.Channel.Probe(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ProbeResponse> ProbeAsync(ProbeRequest request) |
|||
{ |
|||
return base.Channel.ProbeAsync(request); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task OpenAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen)); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task CloseAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose)); |
|||
} |
|||
} |
@ -0,0 +1,143 @@ |
|||
namespace EC.Helper.Onvif.Imaging; |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver20/imaging/wsdl")] |
|||
public partial class Capabilities |
|||
{ |
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
private bool imageStabilizationField; |
|||
|
|||
private bool imageStabilizationFieldSpecified; |
|||
|
|||
private bool presetsField; |
|||
|
|||
private bool presetsFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 0)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool ImageStabilization |
|||
{ |
|||
get |
|||
{ |
|||
return this.imageStabilizationField; |
|||
} |
|||
set |
|||
{ |
|||
this.imageStabilizationField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool ImageStabilizationSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.imageStabilizationFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.imageStabilizationFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool Presets |
|||
{ |
|||
get |
|||
{ |
|||
return this.presetsField; |
|||
} |
|||
set |
|||
{ |
|||
this.presetsField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool PresetsSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.presetsFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.presetsFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver20/imaging/wsdl")] |
|||
public partial class ImagingPreset |
|||
{ |
|||
private string nameField; |
|||
|
|||
private string tokenField; |
|||
|
|||
private string typeField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 0)] |
|||
public string Name |
|||
{ |
|||
get |
|||
{ |
|||
return this.nameField; |
|||
} |
|||
set |
|||
{ |
|||
this.nameField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public string token |
|||
{ |
|||
get |
|||
{ |
|||
return this.tokenField; |
|||
} |
|||
set |
|||
{ |
|||
this.tokenField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public string type |
|||
{ |
|||
get |
|||
{ |
|||
return this.typeField; |
|||
} |
|||
set |
|||
{ |
|||
this.typeField = value; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,185 @@ |
|||
using EC.Helper.Onvif.Common; |
|||
|
|||
namespace EC.Helper.Onvif.Imaging; |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://www.onvif.org/ver20/imaging/wsdl", ConfigurationName = "EC.Onvif.Imaging.Imaging")] |
|||
public interface Imaging |
|||
{ |
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetServiceCapabilities", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "Capabilities")] |
|||
System.Threading.Tasks.Task<Common.Capabilities> GetServiceCapabilitiesAsync(); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetImagingSettings", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "ImagingSettings")] |
|||
System.Threading.Tasks.Task<ImagingSettings20> GetImagingSettingsAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/SetImagingSettings", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
System.Threading.Tasks.Task SetImagingSettingsAsync(string VideoSourceToken, ImagingSettings20 ImagingSettings, bool ForcePersistence); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetOptions", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "ImagingOptions")] |
|||
System.Threading.Tasks.Task<ImagingOptions20> GetOptionsAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/Move", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
System.Threading.Tasks.Task MoveAsync(string VideoSourceToken, FocusMove Focus); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetMoveOptions", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "MoveOptions")] |
|||
System.Threading.Tasks.Task<MoveOptions20> GetMoveOptionsAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/FocusStop", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
System.Threading.Tasks.Task StopAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetStatus", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "Status")] |
|||
System.Threading.Tasks.Task<ImagingStatus20> GetStatusAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetPresets", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
System.Threading.Tasks.Task<GetPresetsResponse> GetPresetsAsync(GetPresetsRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/GetCurrentPreset", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "Preset")] |
|||
System.Threading.Tasks.Task<ImagingPreset> GetCurrentPresetAsync(string VideoSourceToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/imaging/wsdl/SetCurrentPreset", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
System.Threading.Tasks.Task SetCurrentPresetAsync(string VideoSourceToken, string PresetToken); |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresets", WrapperNamespace = "http://www.onvif.org/ver20/imaging/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetsRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/imaging/wsdl", Order = 0)] |
|||
public string VideoSourceToken; |
|||
|
|||
public GetPresetsRequest() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetsRequest(string VideoSourceToken) |
|||
{ |
|||
this.VideoSourceToken = VideoSourceToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresetsResponse", WrapperNamespace = "http://www.onvif.org/ver20/imaging/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetsResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/imaging/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("Preset")] |
|||
public ImagingPreset[] Preset; |
|||
|
|||
public GetPresetsResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetsResponse(ImagingPreset[] Preset) |
|||
{ |
|||
this.Preset = Preset; |
|||
} |
|||
} |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
public interface ImagingChannel : Imaging, System.ServiceModel.IClientChannel |
|||
{ |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
public partial class ImagingClient : System.ServiceModel.ClientBase<Imaging>, Imaging |
|||
{ |
|||
internal ImagingClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : |
|||
base(binding, remoteAddress) |
|||
{ |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<Common.Capabilities> GetServiceCapabilitiesAsync() |
|||
{ |
|||
return base.Channel.GetServiceCapabilitiesAsync(); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ImagingSettings20> GetImagingSettingsAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.GetImagingSettingsAsync(VideoSourceToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task SetImagingSettingsAsync(string VideoSourceToken, ImagingSettings20 ImagingSettings, bool ForcePersistence) |
|||
{ |
|||
return base.Channel.SetImagingSettingsAsync(VideoSourceToken, ImagingSettings, ForcePersistence); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ImagingOptions20> GetOptionsAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.GetOptionsAsync(VideoSourceToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task MoveAsync(string VideoSourceToken, FocusMove Focus) |
|||
{ |
|||
return base.Channel.MoveAsync(VideoSourceToken, Focus); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<MoveOptions20> GetMoveOptionsAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.GetMoveOptionsAsync(VideoSourceToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task StopAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.StopAsync(VideoSourceToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ImagingStatus20> GetStatusAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.GetStatusAsync(VideoSourceToken); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetPresetsResponse> Imaging.GetPresetsAsync(GetPresetsRequest request) |
|||
{ |
|||
return base.Channel.GetPresetsAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetPresetsResponse> GetPresetsAsync(string VideoSourceToken) |
|||
{ |
|||
GetPresetsRequest inValue = new GetPresetsRequest(); |
|||
inValue.VideoSourceToken = VideoSourceToken; |
|||
return ((Imaging)(this)).GetPresetsAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ImagingPreset> GetCurrentPresetAsync(string VideoSourceToken) |
|||
{ |
|||
return base.Channel.GetCurrentPresetAsync(VideoSourceToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task SetCurrentPresetAsync(string VideoSourceToken, string PresetToken) |
|||
{ |
|||
return base.Channel.SetCurrentPresetAsync(VideoSourceToken, PresetToken); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task OpenAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen)); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task CloseAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose)); |
|||
} |
|||
} |
@ -0,0 +1,662 @@ |
|||
using EC.Helper.Onvif.Common; |
|||
|
|||
namespace EC.Helper.Onvif.Media; |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver10/media/wsdl")] |
|||
public partial class Capabilities |
|||
{ |
|||
private ProfileCapabilities profileCapabilitiesField; |
|||
|
|||
private StreamingCapabilities streamingCapabilitiesField; |
|||
|
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
private bool snapshotUriField; |
|||
|
|||
private bool snapshotUriFieldSpecified; |
|||
|
|||
private bool rotationField; |
|||
|
|||
private bool rotationFieldSpecified; |
|||
|
|||
private bool videoSourceModeField; |
|||
|
|||
private bool videoSourceModeFieldSpecified; |
|||
|
|||
private bool oSDField; |
|||
|
|||
private bool oSDFieldSpecified; |
|||
|
|||
private bool temporaryOSDTextField; |
|||
|
|||
private bool temporaryOSDTextFieldSpecified; |
|||
|
|||
private bool eXICompressionField; |
|||
|
|||
private bool eXICompressionFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 0)] |
|||
public ProfileCapabilities ProfileCapabilities |
|||
{ |
|||
get |
|||
{ |
|||
return this.profileCapabilitiesField; |
|||
} |
|||
set |
|||
{ |
|||
this.profileCapabilitiesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 1)] |
|||
public StreamingCapabilities StreamingCapabilities |
|||
{ |
|||
get |
|||
{ |
|||
return this.streamingCapabilitiesField; |
|||
} |
|||
set |
|||
{ |
|||
this.streamingCapabilitiesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 2)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool SnapshotUri |
|||
{ |
|||
get |
|||
{ |
|||
return this.snapshotUriField; |
|||
} |
|||
set |
|||
{ |
|||
this.snapshotUriField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool SnapshotUriSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.snapshotUriFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.snapshotUriFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool Rotation |
|||
{ |
|||
get |
|||
{ |
|||
return this.rotationField; |
|||
} |
|||
set |
|||
{ |
|||
this.rotationField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool RotationSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.rotationFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.rotationFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool VideoSourceMode |
|||
{ |
|||
get |
|||
{ |
|||
return this.videoSourceModeField; |
|||
} |
|||
set |
|||
{ |
|||
this.videoSourceModeField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool VideoSourceModeSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.videoSourceModeFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.videoSourceModeFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool OSD |
|||
{ |
|||
get |
|||
{ |
|||
return this.oSDField; |
|||
} |
|||
set |
|||
{ |
|||
this.oSDField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool OSDSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.oSDFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.oSDFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool TemporaryOSDText |
|||
{ |
|||
get |
|||
{ |
|||
return this.temporaryOSDTextField; |
|||
} |
|||
set |
|||
{ |
|||
this.temporaryOSDTextField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool TemporaryOSDTextSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.temporaryOSDTextFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.temporaryOSDTextFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool EXICompression |
|||
{ |
|||
get |
|||
{ |
|||
return this.eXICompressionField; |
|||
} |
|||
set |
|||
{ |
|||
this.eXICompressionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool EXICompressionSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.eXICompressionFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.eXICompressionFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver10/media/wsdl")] |
|||
public partial class ProfileCapabilities |
|||
{ |
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
private int maximumNumberOfProfilesField; |
|||
|
|||
private bool maximumNumberOfProfilesFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 0)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public int MaximumNumberOfProfiles |
|||
{ |
|||
get |
|||
{ |
|||
return this.maximumNumberOfProfilesField; |
|||
} |
|||
set |
|||
{ |
|||
this.maximumNumberOfProfilesField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool MaximumNumberOfProfilesSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.maximumNumberOfProfilesFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.maximumNumberOfProfilesFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver10/media/wsdl")] |
|||
public partial class VideoSourceModeExtension |
|||
{ |
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 0)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver10/media/wsdl")] |
|||
public partial class VideoSourceMode |
|||
{ |
|||
private float maxFramerateField; |
|||
|
|||
private VideoResolution maxResolutionField; |
|||
|
|||
private string encodingsField; |
|||
|
|||
private bool rebootField; |
|||
|
|||
private string descriptionField; |
|||
|
|||
private VideoSourceModeExtension extensionField; |
|||
|
|||
private string tokenField; |
|||
|
|||
private bool enabledField; |
|||
|
|||
private bool enabledFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 0)] |
|||
public float MaxFramerate |
|||
{ |
|||
get |
|||
{ |
|||
return this.maxFramerateField; |
|||
} |
|||
set |
|||
{ |
|||
this.maxFramerateField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 1)] |
|||
public VideoResolution MaxResolution |
|||
{ |
|||
get |
|||
{ |
|||
return this.maxResolutionField; |
|||
} |
|||
set |
|||
{ |
|||
this.maxResolutionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 2)] |
|||
public string Encodings |
|||
{ |
|||
get |
|||
{ |
|||
return this.encodingsField; |
|||
} |
|||
set |
|||
{ |
|||
this.encodingsField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 3)] |
|||
public bool Reboot |
|||
{ |
|||
get |
|||
{ |
|||
return this.rebootField; |
|||
} |
|||
set |
|||
{ |
|||
this.rebootField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 4)] |
|||
public string Description |
|||
{ |
|||
get |
|||
{ |
|||
return this.descriptionField; |
|||
} |
|||
set |
|||
{ |
|||
this.descriptionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlElementAttribute(Order = 5)] |
|||
public VideoSourceModeExtension Extension |
|||
{ |
|||
get |
|||
{ |
|||
return this.extensionField; |
|||
} |
|||
set |
|||
{ |
|||
this.extensionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public string token |
|||
{ |
|||
get |
|||
{ |
|||
return this.tokenField; |
|||
} |
|||
set |
|||
{ |
|||
this.tokenField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool Enabled |
|||
{ |
|||
get |
|||
{ |
|||
return this.enabledField; |
|||
} |
|||
set |
|||
{ |
|||
this.enabledField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool EnabledSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.enabledFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.enabledFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver10/media/wsdl")] |
|||
public partial class StreamingCapabilities |
|||
{ |
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
private bool rTPMulticastField; |
|||
|
|||
private bool rTPMulticastFieldSpecified; |
|||
|
|||
private bool rTP_TCPField; |
|||
|
|||
private bool rTP_TCPFieldSpecified; |
|||
|
|||
private bool rTP_RTSP_TCPField; |
|||
|
|||
private bool rTP_RTSP_TCPFieldSpecified; |
|||
|
|||
private bool nonAggregateControlField; |
|||
|
|||
private bool nonAggregateControlFieldSpecified; |
|||
|
|||
private bool noRTSPStreamingField; |
|||
|
|||
private bool noRTSPStreamingFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 0)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool RTPMulticast |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTPMulticastField; |
|||
} |
|||
set |
|||
{ |
|||
this.rTPMulticastField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool RTPMulticastSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTPMulticastFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.rTPMulticastFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool RTP_TCP |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTP_TCPField; |
|||
} |
|||
set |
|||
{ |
|||
this.rTP_TCPField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool RTP_TCPSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTP_TCPFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.rTP_TCPFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool RTP_RTSP_TCP |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTP_RTSP_TCPField; |
|||
} |
|||
set |
|||
{ |
|||
this.rTP_RTSP_TCPField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool RTP_RTSP_TCPSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.rTP_RTSP_TCPFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.rTP_RTSP_TCPFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool NonAggregateControl |
|||
{ |
|||
get |
|||
{ |
|||
return this.nonAggregateControlField; |
|||
} |
|||
set |
|||
{ |
|||
this.nonAggregateControlField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool NonAggregateControlSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.nonAggregateControlFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.nonAggregateControlFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool NoRTSPStreaming |
|||
{ |
|||
get |
|||
{ |
|||
return this.noRTSPStreamingField; |
|||
} |
|||
set |
|||
{ |
|||
this.noRTSPStreamingField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool NoRTSPStreamingSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.noRTSPStreamingFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.noRTSPStreamingFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,286 @@ |
|||
using EC.Helper.Onvif.Common; |
|||
using EC.Helper.Onvif.Device; |
|||
using EC.Helper.Onvif.Imaging; |
|||
using EC.Helper.Onvif.Media; |
|||
using EC.Helper.Onvif.PTZ; |
|||
using System.Net; |
|||
using Capabilities = EC.Helper.Onvif.Common.Capabilities; |
|||
|
|||
namespace EC.Helper.Onvif; |
|||
|
|||
public class OnvifClient |
|||
{ |
|||
#region Attr
|
|||
|
|||
public string Hostname { get; private set; } |
|||
|
|||
public string Username { get; private set; } |
|||
|
|||
public string Password { get; private set; } |
|||
|
|||
#endregion Attr
|
|||
|
|||
#region Client Attr
|
|||
|
|||
protected DeviceClient Device { get; set; } |
|||
|
|||
protected MediaClient Media { get; set; } |
|||
|
|||
protected PTZClient PTZ { get; set; } |
|||
|
|||
protected ImagingClient Imaging { get; set; } |
|||
|
|||
protected Capabilities Caps { get; set; } |
|||
|
|||
#endregion Client Attr
|
|||
|
|||
#region Cache Attr
|
|||
|
|||
protected string ProfileToken { get; set; } |
|||
|
|||
protected string VideoSourceToken { get; set; } |
|||
|
|||
protected string SteamUrl { get; set; } |
|||
|
|||
protected string SnapshotUrl { get; set; } |
|||
|
|||
#endregion Cache Attr
|
|||
|
|||
public OnvifClient(string hostname, string username, string password) |
|||
{ |
|||
Hostname = hostname; |
|||
Username = username; |
|||
Password = password; |
|||
} |
|||
|
|||
public async Task<bool> Init() |
|||
{ |
|||
try |
|||
{ |
|||
Device = await OnvifClientFactory.CreateDeviceClientAsync(Hostname, Username, Password); |
|||
Media = await OnvifClientFactory.CreateMediaClientAsync(Hostname, Username, Password); |
|||
PTZ = await OnvifClientFactory.CreatePTZClientAsync(Hostname, Username, Password); |
|||
Imaging = await OnvifClientFactory.CreateImagingClientAsync(Hostname, Username, Password); |
|||
var profiles = await Media.GetProfilesAsync(); |
|||
var videoSources = await Media.GetVideoSourcesAsync(); |
|||
|
|||
foreach (var profile in profiles.Profiles) |
|||
{ |
|||
if (string.IsNullOrEmpty(ProfileToken)) |
|||
{ |
|||
ProfileToken = profile.token; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
foreach (var source in videoSources.VideoSources) |
|||
{ |
|||
if (string.IsNullOrEmpty(VideoSourceToken)) |
|||
{ |
|||
VideoSourceToken = source.token; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
Caps = (await Device.GetCapabilitiesAsync(new CapabilityCategory[] { CapabilityCategory.All })).Capabilities; |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
return false; |
|||
throw; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
#region DeviceClient
|
|||
|
|||
public bool IsDeviceContected() |
|||
{ |
|||
return Device != null; |
|||
} |
|||
|
|||
#endregion DeviceClient
|
|||
|
|||
#region MediaClient
|
|||
|
|||
public bool IsMediaContected() |
|||
{ |
|||
bool ret = IsDeviceContected(); |
|||
return ret; |
|||
} |
|||
|
|||
protected StreamSetup RtspStreamSetup { get; } = new() |
|||
{ |
|||
Stream = StreamType.RTPUnicast, |
|||
Transport = new() { Protocol = TransportProtocol.RTSP } |
|||
}; |
|||
|
|||
public async Task<string> GetStreamUrl() |
|||
{ |
|||
if (string.IsNullOrEmpty(SteamUrl)) |
|||
{ |
|||
MediaUri mediaUri = await Media.GetStreamUriAsync(RtspStreamSetup, ProfileToken); |
|||
SteamUrl = mediaUri.Uri; |
|||
} |
|||
return SteamUrl; |
|||
} |
|||
|
|||
public async Task<string> GetSnapshotUrl() |
|||
{ |
|||
if (string.IsNullOrEmpty(SnapshotUrl)) |
|||
{ |
|||
MediaUri mediaUri = await Media.GetSnapshotUriAsync(ProfileToken); |
|||
SnapshotUrl = mediaUri.Uri; |
|||
} |
|||
return SnapshotUrl; |
|||
} |
|||
|
|||
public async Task<string> GetSnapshot() |
|||
{ |
|||
string url = await GetSnapshotUrl(); |
|||
WebRequest request = WebRequest.Create(url); |
|||
request.Method = "GET"; |
|||
request.PreAuthenticate = true; |
|||
request.Credentials = new NetworkCredential(Username, Password); |
|||
using HttpWebResponse response = (HttpWebResponse)request.GetResponse(); |
|||
using Stream stream = response.GetResponseStream(); |
|||
using MemoryStream mStream = new(); |
|||
byte[] buffer = new byte[1024]; |
|||
int byteCount; |
|||
do |
|||
{ |
|||
byteCount = stream.Read(buffer, 0, buffer.Length); |
|||
mStream.Write(buffer, 0, byteCount); |
|||
} while (byteCount > 0); |
|||
mStream.Position = 0; |
|||
return Convert.ToBase64String(mStream.ToArray()); |
|||
} |
|||
|
|||
#endregion MediaClient
|
|||
|
|||
#region PTZClient
|
|||
|
|||
public bool IsPTZContected() |
|||
{ |
|||
bool ret = IsDeviceContected() && (PTZ != null) && !string.IsNullOrEmpty(ProfileToken); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
/// <param name="atomDist"></param>
|
|||
/// <returns></returns>
|
|||
public async Task AbsoluteMove(float pan, float tilt, float zoom, float atomDist = 0.1f) |
|||
{ |
|||
await PTZ.AbsoluteMoveAsync(ProfileToken, new PTZVector |
|||
{ |
|||
PanTilt = new Vector2D { x = pan, y = tilt }, |
|||
Zoom = new Vector1D { x = zoom } |
|||
}, new PTZSpeed |
|||
{ |
|||
PanTilt = new Vector2D { x = atomDist, y = atomDist }, |
|||
Zoom = new Vector1D { x = atomDist } |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 相对移动
|
|||
/// </summary>
|
|||
/// <param name="pan">[-1,1]</param>
|
|||
/// <param name="tilt">[-1,1]</param>
|
|||
/// <param name="zoom">[-1,1]</param>
|
|||
/// <param name="atomSpeed">[0,1]</param>
|
|||
public async Task RelativeMove(float pan, float tilt, float zoom, float atomSpeed = 0.1f) |
|||
{ |
|||
await PTZ.RelativeMoveAsync(ProfileToken, new PTZVector |
|||
{ |
|||
PanTilt = new Vector2D { x = pan, y = tilt }, |
|||
Zoom = new Vector1D { x = zoom } |
|||
}, new PTZSpeed |
|||
{ |
|||
PanTilt = new Vector2D { x = atomSpeed, y = atomSpeed }, |
|||
Zoom = new Vector1D { x = atomSpeed } |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 持续移动
|
|||
/// </summary>
|
|||
/// <param name="pan">[-1,1]</param>
|
|||
/// <param name="tilt">[-1,1]</param>
|
|||
/// <param name="zoom">[-1,1]</param>
|
|||
/// <param name="timeout">ms</param>
|
|||
public async Task ContinuousMove(float pan, float tilt, float zoom, string timeout = "") |
|||
{ |
|||
await PTZ.ContinuousMoveAsync(ProfileToken, new PTZSpeed |
|||
{ |
|||
PanTilt = new Vector2D { x = pan, y = tilt }, |
|||
Zoom = new Vector1D { x = zoom } |
|||
}, timeout); |
|||
} |
|||
|
|||
public async Task StopMove() |
|||
{ |
|||
await PTZ.StopAsync(ProfileToken, true, true); |
|||
} |
|||
|
|||
public async Task<PTZStatus> GetStatus() |
|||
{ |
|||
return await PTZ.GetStatusAsync(ProfileToken); |
|||
} |
|||
|
|||
#endregion PTZClient
|
|||
|
|||
#region ImagingClient
|
|||
|
|||
public bool IsImagingContected() |
|||
{ |
|||
bool ret = IsDeviceContected(); |
|||
return ret; |
|||
} |
|||
|
|||
public async Task FocusAbsoluteMove(float position) |
|||
{ |
|||
await Imaging.MoveAsync(VideoSourceToken, new FocusMove |
|||
{ |
|||
Absolute = new AbsoluteFocus |
|||
{ |
|||
Position = position, |
|||
//Speed = 1f,
|
|||
//SpeedSpecified = true
|
|||
} |
|||
}); |
|||
} |
|||
|
|||
public async Task FocusRelativeMove(float distance) |
|||
{ |
|||
await Imaging.MoveAsync(VideoSourceToken, new FocusMove |
|||
{ |
|||
Relative = new RelativeFocus |
|||
{ |
|||
Distance = distance, |
|||
//Speed = 1f,
|
|||
//SpeedSpecified = true
|
|||
} |
|||
}); |
|||
} |
|||
|
|||
public async Task FocusContinuousMove(float speed) |
|||
{ |
|||
await Imaging.MoveAsync(VideoSourceToken, new FocusMove |
|||
{ |
|||
Continuous = new ContinuousFocus { Speed = speed } |
|||
}); |
|||
} |
|||
|
|||
public async Task FocusStopMove() |
|||
{ |
|||
await Imaging.StopAsync(VideoSourceToken); |
|||
} |
|||
|
|||
#endregion ImagingClient
|
|||
} |
@ -0,0 +1,114 @@ |
|||
using EC.Helper.Onvif.Common; |
|||
using EC.Helper.Onvif.Device; |
|||
using EC.Helper.Onvif.Imaging; |
|||
using EC.Helper.Onvif.Media; |
|||
using EC.Helper.Onvif.PTZ; |
|||
using EC.Helper.Onvif.Security; |
|||
using System.ServiceModel; |
|||
using System.ServiceModel.Channels; |
|||
|
|||
namespace EC.Helper.Onvif; |
|||
|
|||
public static class OnvifClientFactory |
|||
{ |
|||
private static Binding CreateBinding() |
|||
{ |
|||
var binding = new CustomBinding(); |
|||
var textBindingElement = new TextMessageEncodingBindingElement |
|||
{ |
|||
MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None) |
|||
}; |
|||
var httpBindingElement = new HttpTransportBindingElement |
|||
{ |
|||
AllowCookies = true, |
|||
MaxBufferSize = int.MaxValue, |
|||
MaxReceivedMessageSize = int.MaxValue |
|||
}; |
|||
|
|||
binding.Elements.Add(textBindingElement); |
|||
binding.Elements.Add(httpBindingElement); |
|||
|
|||
return binding; |
|||
} |
|||
|
|||
public static async Task<DeviceClient> CreateDeviceClientAsync(string host, string username, string password) |
|||
{ |
|||
return await CreateDeviceClientAsync(new Uri($"http://{host}/onvif/device_service"), username, password); |
|||
} |
|||
|
|||
public static async Task<DeviceClient> CreateDeviceClientAsync(Uri uri, string username, string password) |
|||
{ |
|||
var binding = CreateBinding(); |
|||
var endpoint = new EndpointAddress(uri); |
|||
var device = new DeviceClient(binding, endpoint); |
|||
var time_shift = await GetDeviceTimeShift(device); |
|||
|
|||
device = new DeviceClient(binding, endpoint); |
|||
device.ChannelFactory.Endpoint.EndpointBehaviors.Clear(); |
|||
device.ChannelFactory.Endpoint.EndpointBehaviors.Add(new SoapSecurityHeaderBehavior(username, password, time_shift)); |
|||
|
|||
// Connectivity Test
|
|||
await device.OpenAsync(); |
|||
|
|||
return device; |
|||
} |
|||
|
|||
public static async Task<MediaClient> CreateMediaClientAsync(string host, string username, string password) |
|||
{ |
|||
var binding = CreateBinding(); |
|||
var device = await CreateDeviceClientAsync(host, username, password); |
|||
var caps = await device.GetCapabilitiesAsync(new CapabilityCategory[] { CapabilityCategory.Media }); |
|||
var media = new MediaClient(binding, new EndpointAddress(new Uri(caps.Capabilities.Media.XAddr))); |
|||
|
|||
var time_shift = await GetDeviceTimeShift(device); |
|||
media.ChannelFactory.Endpoint.EndpointBehaviors.Clear(); |
|||
media.ChannelFactory.Endpoint.EndpointBehaviors.Add(new SoapSecurityHeaderBehavior(username, password, time_shift)); |
|||
|
|||
// Connectivity Test
|
|||
await media.OpenAsync(); |
|||
|
|||
return media; |
|||
} |
|||
|
|||
public static async Task<PTZClient> CreatePTZClientAsync(string host, string username, string password) |
|||
{ |
|||
var binding = CreateBinding(); |
|||
var device = await CreateDeviceClientAsync(host, username, password); |
|||
var caps = await device.GetCapabilitiesAsync(new CapabilityCategory[] { CapabilityCategory.PTZ }); |
|||
var ptz = new PTZClient(binding, new EndpointAddress(new Uri(caps.Capabilities.PTZ.XAddr))); |
|||
|
|||
var time_shift = await GetDeviceTimeShift(device); |
|||
ptz.ChannelFactory.Endpoint.EndpointBehaviors.Clear(); |
|||
ptz.ChannelFactory.Endpoint.EndpointBehaviors.Add(new SoapSecurityHeaderBehavior(username, password, time_shift)); |
|||
|
|||
// Connectivity Test
|
|||
await ptz.OpenAsync(); |
|||
|
|||
return ptz; |
|||
} |
|||
|
|||
public static async Task<ImagingClient> CreateImagingClientAsync(string host, string username, string password) |
|||
{ |
|||
var binding = CreateBinding(); |
|||
var device = await CreateDeviceClientAsync(host, username, password); |
|||
var caps = await device.GetCapabilitiesAsync(new CapabilityCategory[] { CapabilityCategory.Imaging }); |
|||
var imaging = new ImagingClient(binding, new EndpointAddress(new Uri(caps.Capabilities.Imaging.XAddr))); |
|||
|
|||
var time_shift = await GetDeviceTimeShift(device); |
|||
imaging.ChannelFactory.Endpoint.EndpointBehaviors.Clear(); |
|||
imaging.ChannelFactory.Endpoint.EndpointBehaviors.Add(new SoapSecurityHeaderBehavior(username, password, time_shift)); |
|||
|
|||
// Connectivity Test
|
|||
await imaging.OpenAsync(); |
|||
|
|||
return imaging; |
|||
} |
|||
|
|||
private static async Task<TimeSpan> GetDeviceTimeShift(DeviceClient device) |
|||
{ |
|||
var utc = (await device.GetSystemDateAndTimeAsync()).UTCDateTime; |
|||
var dt = new System.DateTime(utc.Date.Year, utc.Date.Month, utc.Date.Day, |
|||
utc.Time.Hour, utc.Time.Minute, utc.Time.Second); |
|||
return dt - System.DateTime.UtcNow; |
|||
} |
|||
} |
@ -0,0 +1,184 @@ |
|||
namespace EC.Helper.Onvif.PTZ; |
|||
|
|||
/// <remarks/>
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl")] |
|||
public partial class Capabilities |
|||
{ |
|||
private System.Xml.Linq.XElement[] anyField; |
|||
|
|||
private bool eFlipField; |
|||
|
|||
private bool eFlipFieldSpecified; |
|||
|
|||
private bool reverseField; |
|||
|
|||
private bool reverseFieldSpecified; |
|||
|
|||
private bool getCompatibleConfigurationsField; |
|||
|
|||
private bool getCompatibleConfigurationsFieldSpecified; |
|||
|
|||
private bool moveStatusField; |
|||
|
|||
private bool moveStatusFieldSpecified; |
|||
|
|||
private bool statusPositionField; |
|||
|
|||
private bool statusPositionFieldSpecified; |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAnyElementAttribute(Order = 0)] |
|||
public System.Xml.Linq.XElement[] Any |
|||
{ |
|||
get |
|||
{ |
|||
return this.anyField; |
|||
} |
|||
set |
|||
{ |
|||
this.anyField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool EFlip |
|||
{ |
|||
get |
|||
{ |
|||
return this.eFlipField; |
|||
} |
|||
set |
|||
{ |
|||
this.eFlipField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool EFlipSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.eFlipFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.eFlipFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool Reverse |
|||
{ |
|||
get |
|||
{ |
|||
return this.reverseField; |
|||
} |
|||
set |
|||
{ |
|||
this.reverseField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool ReverseSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.reverseFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.reverseFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool GetCompatibleConfigurations |
|||
{ |
|||
get |
|||
{ |
|||
return this.getCompatibleConfigurationsField; |
|||
} |
|||
set |
|||
{ |
|||
this.getCompatibleConfigurationsField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool GetCompatibleConfigurationsSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.getCompatibleConfigurationsFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.getCompatibleConfigurationsFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool MoveStatus |
|||
{ |
|||
get |
|||
{ |
|||
return this.moveStatusField; |
|||
} |
|||
set |
|||
{ |
|||
this.moveStatusField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool MoveStatusSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.moveStatusFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.moveStatusFieldSpecified = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlAttributeAttribute()] |
|||
public bool StatusPosition |
|||
{ |
|||
get |
|||
{ |
|||
return this.statusPositionField; |
|||
} |
|||
set |
|||
{ |
|||
this.statusPositionField = value; |
|||
} |
|||
} |
|||
|
|||
/// <remarks/>
|
|||
[System.Xml.Serialization.XmlIgnoreAttribute()] |
|||
public bool StatusPositionSpecified |
|||
{ |
|||
get |
|||
{ |
|||
return this.statusPositionFieldSpecified; |
|||
} |
|||
set |
|||
{ |
|||
this.statusPositionFieldSpecified = value; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,661 @@ |
|||
using EC.Helper.Onvif.Common; |
|||
|
|||
namespace EC.Helper.Onvif.PTZ; |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", ConfigurationName = "EC.Onvif.PTZ.PTZ")] |
|||
public interface PTZ |
|||
{ |
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetServiceCapabilities", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "Capabilities")] |
|||
System.Threading.Tasks.Task<Capabilities> GetServiceCapabilitiesAsync(); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetNodes", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<GetNodesResponse> GetNodesAsync(GetNodesRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetNode", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PTZNode")] |
|||
System.Threading.Tasks.Task<PTZNode> GetNodeAsync(string NodeToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetConfiguration", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PTZConfiguration")] |
|||
System.Threading.Tasks.Task<PTZConfiguration> GetConfigurationAsync(string PTZConfigurationToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetConfigurations", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<GetConfigurationsResponse> GetConfigurationsAsync(GetConfigurationsRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/SetConfiguration", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task SetConfigurationAsync(PTZConfiguration PTZConfiguration, bool ForcePersistence); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetConfigurationOptions", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PTZConfigurationOptions")] |
|||
System.Threading.Tasks.Task<PTZConfigurationOptions> GetConfigurationOptionsAsync(string ConfigurationToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/SendAuxiliaryCommand", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "AuxiliaryResponse")] |
|||
System.Threading.Tasks.Task<string> SendAuxiliaryCommandAsync(string ProfileToken, string AuxiliaryData); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetPresets", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<GetPresetsResponse> GetPresetsAsync(GetPresetsRequest request); |
|||
|
|||
// CODEGEN: Generating message contract since the operation has multiple return values.
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/SetPreset", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<SetPresetResponse> SetPresetAsync(SetPresetRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/RemovePreset", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task RemovePresetAsync(string ProfileToken, string PresetToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GotoPreset", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task GotoPresetAsync(string ProfileToken, string PresetToken, PTZSpeed Speed); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GotoHomePosition", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task GotoHomePositionAsync(string ProfileToken, PTZSpeed Speed); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/SetHomePosition", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task SetHomePositionAsync(string ProfileToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/ContinuousMove", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<ContinuousMoveResponse> ContinuousMoveAsync(ContinuousMoveRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/RelativeMove", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task RelativeMoveAsync(string ProfileToken, PTZVector Translation, PTZSpeed Speed); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetStatus", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PTZStatus")] |
|||
System.Threading.Tasks.Task<PTZStatus> GetStatusAsync(string ProfileToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/AbsoluteMove", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task AbsoluteMoveAsync(string ProfileToken, PTZVector Position, PTZSpeed Speed); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GeoMove", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task GeoMoveAsync(string ProfileToken, GeoLocation Target, PTZSpeed Speed, float AreaHeight, float AreaWidth); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/Stop", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task StopAsync(string ProfileToken, bool PanTilt, bool Zoom); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetPresetTours", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<GetPresetToursResponse> GetPresetToursAsync(GetPresetToursRequest request); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetPresetTour", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PresetTour")] |
|||
System.Threading.Tasks.Task<PresetTour> GetPresetTourAsync(string ProfileToken, string PresetTourToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetPresetTourOptions", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "Options")] |
|||
System.Threading.Tasks.Task<PTZPresetTourOptions> GetPresetTourOptionsAsync(string ProfileToken, string PresetTourToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/CreatePresetTour", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
[return: System.ServiceModel.MessageParameterAttribute(Name = "PresetTourToken")] |
|||
System.Threading.Tasks.Task<string> CreatePresetTourAsync(string ProfileToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/ModifyPresetTour", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task ModifyPresetTourAsync(string ProfileToken, PresetTour PresetTour); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/OperatePresetTour", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task OperatePresetTourAsync(string ProfileToken, string PresetTourToken, PTZPresetTourOperation Operation); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/RemovePresetTour", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task RemovePresetTourAsync(string ProfileToken, string PresetTourToken); |
|||
|
|||
[System.ServiceModel.OperationContractAttribute(Action = "http://www.onvif.org/ver20/ptz/wsdl/GetCompatibleConfigurations", ReplyAction = "*")] |
|||
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(ConfigurationEntity))] |
|||
[System.ServiceModel.ServiceKnownTypeAttribute(typeof(DeviceEntity))] |
|||
System.Threading.Tasks.Task<GetCompatibleConfigurationsResponse> GetCompatibleConfigurationsAsync(GetCompatibleConfigurationsRequest request); |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetNodes", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetNodesRequest |
|||
{ |
|||
public GetNodesRequest() |
|||
{ |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetNodesResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetNodesResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("PTZNode")] |
|||
public PTZNode[] PTZNode; |
|||
|
|||
public GetNodesResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetNodesResponse(PTZNode[] PTZNode) |
|||
{ |
|||
this.PTZNode = PTZNode; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetConfigurations", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetConfigurationsRequest |
|||
{ |
|||
public GetConfigurationsRequest() |
|||
{ |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetConfigurationsResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetConfigurationsResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("PTZConfiguration")] |
|||
public PTZConfiguration[] PTZConfiguration; |
|||
|
|||
public GetConfigurationsResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetConfigurationsResponse(PTZConfiguration[] PTZConfiguration) |
|||
{ |
|||
this.PTZConfiguration = PTZConfiguration; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresets", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetsRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string ProfileToken; |
|||
|
|||
public GetPresetsRequest() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetsRequest(string ProfileToken) |
|||
{ |
|||
this.ProfileToken = ProfileToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresetsResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetsResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("Preset")] |
|||
public PTZPreset[] Preset; |
|||
|
|||
public GetPresetsResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetsResponse(PTZPreset[] Preset) |
|||
{ |
|||
this.Preset = Preset; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "SetPreset", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class SetPresetRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string ProfileToken; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 1)] |
|||
public string PresetName; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 2)] |
|||
public string PresetToken; |
|||
|
|||
public SetPresetRequest() |
|||
{ |
|||
} |
|||
|
|||
public SetPresetRequest(string ProfileToken, string PresetName, string PresetToken) |
|||
{ |
|||
this.ProfileToken = ProfileToken; |
|||
this.PresetName = PresetName; |
|||
this.PresetToken = PresetToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "SetPresetResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class SetPresetResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string PresetToken; |
|||
|
|||
public SetPresetResponse() |
|||
{ |
|||
} |
|||
|
|||
public SetPresetResponse(string PresetToken) |
|||
{ |
|||
this.PresetToken = PresetToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "ContinuousMove", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class ContinuousMoveRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string ProfileToken; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 1)] |
|||
public PTZSpeed Velocity; |
|||
|
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 2)] |
|||
[System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] |
|||
public string Timeout; |
|||
|
|||
public ContinuousMoveRequest() |
|||
{ |
|||
} |
|||
|
|||
public ContinuousMoveRequest(string ProfileToken, PTZSpeed Velocity, string Timeout) |
|||
{ |
|||
this.ProfileToken = ProfileToken; |
|||
this.Velocity = Velocity; |
|||
this.Timeout = Timeout; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "ContinuousMoveResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class ContinuousMoveResponse |
|||
{ |
|||
public ContinuousMoveResponse() |
|||
{ |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresetTours", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetToursRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string ProfileToken; |
|||
|
|||
public GetPresetToursRequest() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetToursRequest(string ProfileToken) |
|||
{ |
|||
this.ProfileToken = ProfileToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetPresetToursResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetPresetToursResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("PresetTour")] |
|||
public PresetTour[] PresetTour; |
|||
|
|||
public GetPresetToursResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetPresetToursResponse(PresetTour[] PresetTour) |
|||
{ |
|||
this.PresetTour = PresetTour; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetCompatibleConfigurations", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetCompatibleConfigurationsRequest |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
public string ProfileToken; |
|||
|
|||
public GetCompatibleConfigurationsRequest() |
|||
{ |
|||
} |
|||
|
|||
public GetCompatibleConfigurationsRequest(string ProfileToken) |
|||
{ |
|||
this.ProfileToken = ProfileToken; |
|||
} |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
[System.ServiceModel.MessageContractAttribute(WrapperName = "GetCompatibleConfigurationsResponse", WrapperNamespace = "http://www.onvif.org/ver20/ptz/wsdl", IsWrapped = true)] |
|||
public partial class GetCompatibleConfigurationsResponse |
|||
{ |
|||
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://www.onvif.org/ver20/ptz/wsdl", Order = 0)] |
|||
[System.Xml.Serialization.XmlElementAttribute("PTZConfiguration")] |
|||
public PTZConfiguration[] PTZConfiguration; |
|||
|
|||
public GetCompatibleConfigurationsResponse() |
|||
{ |
|||
} |
|||
|
|||
public GetCompatibleConfigurationsResponse(PTZConfiguration[] PTZConfiguration) |
|||
{ |
|||
this.PTZConfiguration = PTZConfiguration; |
|||
} |
|||
} |
|||
|
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
public interface PTZChannel : PTZ, System.ServiceModel.IClientChannel |
|||
{ |
|||
} |
|||
|
|||
[System.Diagnostics.DebuggerStepThroughAttribute()] |
|||
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")] |
|||
public partial class PTZClient : System.ServiceModel.ClientBase<PTZ>, PTZ |
|||
{ |
|||
internal PTZClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : |
|||
base(binding, remoteAddress) |
|||
{ |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<Capabilities> GetServiceCapabilitiesAsync() |
|||
{ |
|||
return base.Channel.GetServiceCapabilitiesAsync(); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetNodesResponse> PTZ.GetNodesAsync(GetNodesRequest request) |
|||
{ |
|||
return base.Channel.GetNodesAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetNodesResponse> GetNodesAsync() |
|||
{ |
|||
GetNodesRequest inValue = new GetNodesRequest(); |
|||
return ((PTZ)(this)).GetNodesAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PTZNode> GetNodeAsync(string NodeToken) |
|||
{ |
|||
return base.Channel.GetNodeAsync(NodeToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PTZConfiguration> GetConfigurationAsync(string PTZConfigurationToken) |
|||
{ |
|||
return base.Channel.GetConfigurationAsync(PTZConfigurationToken); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetConfigurationsResponse> PTZ.GetConfigurationsAsync(GetConfigurationsRequest request) |
|||
{ |
|||
return base.Channel.GetConfigurationsAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetConfigurationsResponse> GetConfigurationsAsync() |
|||
{ |
|||
GetConfigurationsRequest inValue = new GetConfigurationsRequest(); |
|||
return ((PTZ)(this)).GetConfigurationsAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task SetConfigurationAsync(PTZConfiguration PTZConfiguration, bool ForcePersistence) |
|||
{ |
|||
return base.Channel.SetConfigurationAsync(PTZConfiguration, ForcePersistence); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PTZConfigurationOptions> GetConfigurationOptionsAsync(string ConfigurationToken) |
|||
{ |
|||
return base.Channel.GetConfigurationOptionsAsync(ConfigurationToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<string> SendAuxiliaryCommandAsync(string ProfileToken, string AuxiliaryData) |
|||
{ |
|||
return base.Channel.SendAuxiliaryCommandAsync(ProfileToken, AuxiliaryData); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetPresetsResponse> PTZ.GetPresetsAsync(GetPresetsRequest request) |
|||
{ |
|||
return base.Channel.GetPresetsAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetPresetsResponse> GetPresetsAsync(string ProfileToken) |
|||
{ |
|||
GetPresetsRequest inValue = new GetPresetsRequest(); |
|||
inValue.ProfileToken = ProfileToken; |
|||
return ((PTZ)(this)).GetPresetsAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<SetPresetResponse> SetPresetAsync(SetPresetRequest request) |
|||
{ |
|||
return base.Channel.SetPresetAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task RemovePresetAsync(string ProfileToken, string PresetToken) |
|||
{ |
|||
return base.Channel.RemovePresetAsync(ProfileToken, PresetToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task GotoPresetAsync(string ProfileToken, string PresetToken, PTZSpeed Speed) |
|||
{ |
|||
return base.Channel.GotoPresetAsync(ProfileToken, PresetToken, Speed); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task GotoHomePositionAsync(string ProfileToken, PTZSpeed Speed) |
|||
{ |
|||
return base.Channel.GotoHomePositionAsync(ProfileToken, Speed); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task SetHomePositionAsync(string ProfileToken) |
|||
{ |
|||
return base.Channel.SetHomePositionAsync(ProfileToken); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<ContinuousMoveResponse> PTZ.ContinuousMoveAsync(ContinuousMoveRequest request) |
|||
{ |
|||
return base.Channel.ContinuousMoveAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<ContinuousMoveResponse> ContinuousMoveAsync(string ProfileToken, PTZSpeed Velocity, string Timeout) |
|||
{ |
|||
ContinuousMoveRequest inValue = new ContinuousMoveRequest(); |
|||
inValue.ProfileToken = ProfileToken; |
|||
inValue.Velocity = Velocity; |
|||
inValue.Timeout = Timeout; |
|||
return ((PTZ)(this)).ContinuousMoveAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task RelativeMoveAsync(string ProfileToken, PTZVector Translation, PTZSpeed Speed) |
|||
{ |
|||
return base.Channel.RelativeMoveAsync(ProfileToken, Translation, Speed); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PTZStatus> GetStatusAsync(string ProfileToken) |
|||
{ |
|||
return base.Channel.GetStatusAsync(ProfileToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task AbsoluteMoveAsync(string ProfileToken, PTZVector Position, PTZSpeed Speed) |
|||
{ |
|||
return base.Channel.AbsoluteMoveAsync(ProfileToken, Position, Speed); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task GeoMoveAsync(string ProfileToken, GeoLocation Target, PTZSpeed Speed, float AreaHeight, float AreaWidth) |
|||
{ |
|||
return base.Channel.GeoMoveAsync(ProfileToken, Target, Speed, AreaHeight, AreaWidth); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task StopAsync(string ProfileToken, bool PanTilt, bool Zoom) |
|||
{ |
|||
return base.Channel.StopAsync(ProfileToken, PanTilt, Zoom); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetPresetToursResponse> PTZ.GetPresetToursAsync(GetPresetToursRequest request) |
|||
{ |
|||
return base.Channel.GetPresetToursAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetPresetToursResponse> GetPresetToursAsync(string ProfileToken) |
|||
{ |
|||
GetPresetToursRequest inValue = new GetPresetToursRequest(); |
|||
inValue.ProfileToken = ProfileToken; |
|||
return ((PTZ)(this)).GetPresetToursAsync(inValue); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PresetTour> GetPresetTourAsync(string ProfileToken, string PresetTourToken) |
|||
{ |
|||
return base.Channel.GetPresetTourAsync(ProfileToken, PresetTourToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<PTZPresetTourOptions> GetPresetTourOptionsAsync(string ProfileToken, string PresetTourToken) |
|||
{ |
|||
return base.Channel.GetPresetTourOptionsAsync(ProfileToken, PresetTourToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<string> CreatePresetTourAsync(string ProfileToken) |
|||
{ |
|||
return base.Channel.CreatePresetTourAsync(ProfileToken); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task ModifyPresetTourAsync(string ProfileToken, PresetTour PresetTour) |
|||
{ |
|||
return base.Channel.ModifyPresetTourAsync(ProfileToken, PresetTour); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task OperatePresetTourAsync(string ProfileToken, string PresetTourToken, PTZPresetTourOperation Operation) |
|||
{ |
|||
return base.Channel.OperatePresetTourAsync(ProfileToken, PresetTourToken, Operation); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task RemovePresetTourAsync(string ProfileToken, string PresetTourToken) |
|||
{ |
|||
return base.Channel.RemovePresetTourAsync(ProfileToken, PresetTourToken); |
|||
} |
|||
|
|||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] |
|||
System.Threading.Tasks.Task<GetCompatibleConfigurationsResponse> PTZ.GetCompatibleConfigurationsAsync(GetCompatibleConfigurationsRequest request) |
|||
{ |
|||
return base.Channel.GetCompatibleConfigurationsAsync(request); |
|||
} |
|||
|
|||
public System.Threading.Tasks.Task<GetCompatibleConfigurationsResponse> GetCompatibleConfigurationsAsync(string ProfileToken) |
|||
{ |
|||
GetCompatibleConfigurationsRequest inValue = new GetCompatibleConfigurationsRequest(); |
|||
inValue.ProfileToken = ProfileToken; |
|||
return ((PTZ)(this)).GetCompatibleConfigurationsAsync(inValue); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task OpenAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen)); |
|||
} |
|||
|
|||
public virtual System.Threading.Tasks.Task CloseAsync() |
|||
{ |
|||
return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose)); |
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
public static class Constants |
|||
{ |
|||
public static string WS_MULTICAST_ADDRESS { get; } = "239.255.255.250"; |
|||
public static int WS_MULTICAST_PORT { get; } = 3702; |
|||
|
|||
public static string WS_PROBE_MESSAGE { get; } = |
|||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" |
|||
+ "<e:Envelope xmlns:e=\"http://www.w3.org/2003/05/soap-envelope\"" |
|||
+ "xmlns:w=\"http://schemas.xmlsoap.org/ws/2004/08/addressing\"" |
|||
+ "xmlns:d=\"http://schemas.xmlsoap.org/ws/2005/04/discovery\"" |
|||
+ "xmlns:tds=\"https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl\"" |
|||
+ "xmlns:dn=\"http://www.onvif.org/ver10/network/wsdl\">" |
|||
+ "<e:Header>" |
|||
+ "<w:MessageID>uuid:{0}</w:MessageID>" |
|||
+ "<w:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To> " |
|||
+ "<w:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action>" |
|||
+ "</e:Header>" |
|||
+ "<e:Body>" |
|||
+ "<d:Probe><d:Types>dn:NetworkVideoTransmitter</d:Types></d:Probe>" |
|||
+ "</e:Body>" |
|||
+ "</e:Envelope>"; |
|||
|
|||
public static string PATTERN { get; } = @"^((onvif[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$"; |
|||
} |
@ -0,0 +1,180 @@ |
|||
using System.Net; |
|||
using System.Net.NetworkInformation; |
|||
using System.Net.Sockets; |
|||
using System.Text; |
|||
using System.Text.RegularExpressions; |
|||
using System.Xml; |
|||
using System.Xml.Serialization; |
|||
|
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
public class Discovery |
|||
{ |
|||
#region Discover
|
|||
|
|||
/// <summary>
|
|||
/// Discover new onvif devices on the network
|
|||
/// </summary>
|
|||
/// <param name="timeout">A timeout in seconds to wait for onvif devices</param>
|
|||
/// <param name="cancellationToken">A cancellation token</param>
|
|||
/// <returns>a list of <see cref="DiscoveryDevice"/></returns>
|
|||
/// <remarks>Use the <see cref="Discover(int, Action{DiscoveryDevice}, CancellationToken)"/>
|
|||
/// overload (with an action as a parameter) if you want to retrieve devices as they reply.</remarks>
|
|||
public async Task<IEnumerable<DiscoveryDevice>> DiscoverByAdapter(IEnumerable<NetworkInterface> adapterList, |
|||
int timeout, CancellationToken cancellationToken = default) |
|||
{ |
|||
List<DiscoveryDevice> deviceList = new(); |
|||
await Discover(adapterList, d => deviceList.Add(d), timeout, cancellationToken); |
|||
deviceList.Sort((a, b) => CastIp(a.Address).CompareTo(CastIp(b.Address))); |
|||
return deviceList; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Discover new onvif devices on the network
|
|||
/// </summary>
|
|||
/// <param name="timeout">A timeout in seconds to wait for onvif devices</param>
|
|||
/// <param name="cancellationToken">A cancellation token</param>
|
|||
/// <returns>a list of <see cref="DiscoveryDevice"/></returns>
|
|||
/// <remarks>Use the <see cref="Discover(int, Action{DiscoveryDevice}, CancellationToken)"/>
|
|||
/// overload (with an action as a parameter) if you want to retrieve devices as they reply.</remarks>
|
|||
public async Task<IEnumerable<DiscoveryDevice>> DiscoverAll(int timeout, CancellationToken cancellationToken = default) |
|||
{ |
|||
IEnumerable<NetworkInterface> adapterList = OnvifUdpClient.GetVaildNetworkAdapters(); |
|||
IEnumerable<DiscoveryDevice> deviceList = await DiscoverByAdapter(adapterList, timeout, cancellationToken); |
|||
return deviceList; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Discover new onvif devices on the network passing a callback
|
|||
/// to retrieve devices as they reply
|
|||
/// </summary>
|
|||
/// <param name="onDeviceDiscovered">A method that is called each time a new device replies.</param>
|
|||
/// <param name="timeout">A timeout in seconds to wait for onvif devices</param>
|
|||
/// <param name="cancellationToken">A cancellation token</param>
|
|||
/// <returns>The Task to be awaited</returns>
|
|||
private async Task Discover(IEnumerable<NetworkInterface> adapterList, Action<DiscoveryDevice> onDeviceDiscovered, |
|||
int timeout, CancellationToken cancellationToken = default) |
|||
{ |
|||
IEnumerable<OnvifUdpClient> clientList = OnvifUdpClient.CreateClientList(adapterList); |
|||
if (!clientList.Any()) |
|||
{ |
|||
throw new Exception("Missing valid NetworkInterfaces, UdpClients could not be created"); |
|||
} |
|||
Task[] discoveries = clientList.Select(client => Discover(client, onDeviceDiscovered, timeout, cancellationToken)).ToArray(); |
|||
await Task.WhenAll(discoveries); |
|||
} |
|||
|
|||
private async Task Discover(OnvifUdpClient client, Action<DiscoveryDevice> onDeviceDiscovered, int timeout, CancellationToken cancellationToken = default) |
|||
{ |
|||
Guid messageId = Guid.NewGuid(); |
|||
List<UdpReceiveResult> responseList = new(); |
|||
CancellationTokenSource cts = new(TimeSpan.FromSeconds(timeout)); |
|||
|
|||
try |
|||
{ |
|||
await OnvifUdpClient.SendProbe(client, messageId); |
|||
while (true) |
|||
{ |
|||
if (client.IsClosed) { return; } |
|||
if (cts.IsCancellationRequested || cancellationToken.IsCancellationRequested) { break; } |
|||
try |
|||
{ |
|||
UdpReceiveResult response = await client.ReceiveAsync().WithCancellation(cancellationToken).WithCancellation(cts.Token); |
|||
if (responseList.Exists(resp => resp.RemoteEndPoint.Address.Equals(response.RemoteEndPoint.Address))) { continue; } |
|||
responseList.Add(response); |
|||
DiscoveryDevice discoveredDevice = ProcessResponse(response, messageId); |
|||
if (discoveredDevice != null) |
|||
{ |
|||
await Task.Run(() => onDeviceDiscovered(discoveredDevice), cancellationToken); |
|||
} |
|||
} |
|||
catch (OperationCanceledException) |
|||
{ |
|||
// Either the user canceled the action or the timeout has fired
|
|||
} |
|||
catch (Exception) |
|||
{ |
|||
// we catch all exceptions !
|
|||
// Something might be bad in the response of a camera when call ReceiveAsync (BeginReceive in socket) fail
|
|||
} |
|||
} |
|||
} |
|||
finally |
|||
{ |
|||
client.Close(); |
|||
} |
|||
} |
|||
|
|||
#endregion Discover
|
|||
|
|||
#region Discover Helper
|
|||
|
|||
private DiscoveryDevice ProcessResponse(UdpReceiveResult response, Guid messageId) |
|||
{ |
|||
if (response.Buffer == null) { return null; } |
|||
string strResponse = Encoding.UTF8.GetString(response.Buffer); |
|||
XmlProbeReponse xmlResponse = DeserializeResponse(strResponse); |
|||
if (xmlResponse.Header.RelatesTo.Contains(messageId.ToString()) |
|||
&& xmlResponse.Body.ProbeMatches.Any() |
|||
&& !string.IsNullOrEmpty(xmlResponse.Body.ProbeMatches[0].Scopes)) |
|||
{ |
|||
return CreateDevice(xmlResponse.Body.ProbeMatches[0], response.RemoteEndPoint); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
private XmlProbeReponse DeserializeResponse(string xml) |
|||
{ |
|||
XmlSerializer serializer = new(typeof(XmlProbeReponse)); |
|||
XmlReaderSettings settings = new(); |
|||
using StringReader textReader = new(xml); |
|||
using XmlReader xmlReader = XmlReader.Create(textReader, settings); |
|||
return (XmlProbeReponse)serializer.Deserialize(xmlReader); |
|||
} |
|||
|
|||
private DiscoveryDevice CreateDevice(ProbeMatch probeMatch, IPEndPoint remoteEndpoint) |
|||
{ |
|||
string scopes = probeMatch.Scopes; |
|||
DiscoveryDevice discoveryDevice = new(); |
|||
discoveryDevice.Address = remoteEndpoint.Address.ToString(); |
|||
discoveryDevice.Model = Regex.Match(scopes, "(?<=hardware/).*?(?= )")?.Value; |
|||
discoveryDevice.Mfr = ParseMfrFromScopes(scopes); |
|||
discoveryDevice.XAdresses = ConvertToList(probeMatch.XAddrs); |
|||
discoveryDevice.Types = ConvertToList(probeMatch.Types); |
|||
return discoveryDevice; |
|||
} |
|||
|
|||
private string ParseMfrFromScopes(string scopes) |
|||
{ |
|||
string name = Regex.Match(scopes, "(?<=name/).*?(?= )")?.Value; |
|||
if (!string.IsNullOrEmpty(name)) { return name; } |
|||
string mfr = Regex.Match(scopes, "(?<=mfr/).*?(?= )")?.Value; |
|||
if (!string.IsNullOrEmpty(mfr)) { return mfr; } |
|||
return string.Empty; |
|||
} |
|||
|
|||
private List<string> ConvertToList(string spacedListString) |
|||
{ |
|||
string[] strings = spacedListString.Split(null); |
|||
List<string> list = new(); |
|||
strings.ToList().ForEach(str => list.Add(str.Trim())); |
|||
return list; |
|||
} |
|||
|
|||
private long CastIp(string ip) |
|||
{ |
|||
byte[] addressBytes = IPAddress.Parse(ip).GetAddressBytes(); |
|||
if (addressBytes.Length != 4) |
|||
{ |
|||
return 0; |
|||
throw new ArgumentException("Must be an IPv4 address"); |
|||
} |
|||
uint networkOrder = BitConverter.ToUInt32(addressBytes, 0); |
|||
return networkOrder; |
|||
//byte[] addressBytes = address.GetAddressBytes();
|
|||
//int networkOrder = BitConverter.ToInt32(addressBytes, 0);
|
|||
//return (uint)IPAddress.NetworkToHostOrder(networkOrder);
|
|||
} |
|||
|
|||
#endregion Discover Helper
|
|||
} |
@ -0,0 +1,30 @@ |
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
public class DiscoveryDevice |
|||
{ |
|||
/// <summary>
|
|||
/// The types of this onvif device. ex: NetworkVideoTransmitter
|
|||
/// </summary>
|
|||
public List<string> Types { get; internal set; } |
|||
|
|||
/// <summary>
|
|||
/// The XAddresses of this device, the url on which the device has the webservices.
|
|||
/// Normally in the form of: http://{IP}:{Port}/onvif/device_service
|
|||
/// </summary>
|
|||
public List<string> XAdresses { get; internal set; } |
|||
|
|||
/// <summary>
|
|||
/// The onvif device model
|
|||
/// </summary>
|
|||
public string Model { get; internal set; } |
|||
|
|||
/// <summary>
|
|||
/// The device manufacturer
|
|||
/// </summary>
|
|||
public string Mfr { get; internal set; } |
|||
|
|||
/// <summary>
|
|||
/// The device IP address
|
|||
/// </summary>
|
|||
public string Address { get; internal set; } |
|||
} |
@ -0,0 +1,20 @@ |
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
internal static class ExtensionMethods |
|||
{ |
|||
/// <summary>
|
|||
/// Used to provide cancellation possibility to any Async Methods returning a Task
|
|||
/// </summary>
|
|||
internal static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken) |
|||
{ |
|||
var tcs = new TaskCompletionSource<bool>(); |
|||
using (cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs)) |
|||
{ |
|||
if (task != await Task.WhenAny(task, tcs.Task)) |
|||
{ |
|||
throw new OperationCanceledException(cancellationToken); |
|||
} |
|||
} |
|||
return await task; |
|||
} |
|||
} |
@ -0,0 +1,136 @@ |
|||
using System.Net; |
|||
using System.Net.NetworkInformation; |
|||
using System.Net.Sockets; |
|||
using System.Text; |
|||
|
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
public class OnvifUdpClient |
|||
{ |
|||
private UdpClient client { get; set; } |
|||
|
|||
public bool IsClosed { get; set; } |
|||
|
|||
public OnvifUdpClient(IPEndPoint localpoint) |
|||
{ |
|||
client = new UdpClient(localpoint) |
|||
{ |
|||
EnableBroadcast = true |
|||
}; |
|||
} |
|||
|
|||
public async Task<int> SendProbeAsync(Guid messageId, IPEndPoint endPoint) |
|||
{ |
|||
byte[] datagram = NewProbeMessage(messageId); |
|||
return await client?.SendAsync(datagram, datagram.Length, endPoint); |
|||
} |
|||
|
|||
public async Task<UdpReceiveResult> ReceiveAsync() |
|||
{ |
|||
return await client.ReceiveAsync(); |
|||
} |
|||
|
|||
public void Close() |
|||
{ |
|||
client?.Close(); |
|||
IsClosed = true; |
|||
} |
|||
|
|||
public static byte[] NewProbeMessage(Guid messageId) |
|||
{ |
|||
if (messageId == Guid.Empty) |
|||
{ |
|||
throw new ArgumentException("messageId could not be Empty"); |
|||
} |
|||
var probeMessagewithguid = string.Format(Constants.WS_PROBE_MESSAGE, messageId.ToString()); |
|||
return Encoding.ASCII.GetBytes(probeMessagewithguid); |
|||
} |
|||
|
|||
#region CreateClient
|
|||
|
|||
public static OnvifUdpClient CreateClient(NetworkInterface adapter) |
|||
{ |
|||
if (!IsValidAdapter(adapter)) { return null; } |
|||
|
|||
OnvifUdpClient client = null; |
|||
IPInterfaceProperties adapterProperties = adapter.GetIPProperties(); |
|||
foreach (UnicastIPAddressInformation ua in adapterProperties.UnicastAddresses) |
|||
{ |
|||
if (ua.Address.AddressFamily != AddressFamily.InterNetwork) { continue; } |
|||
IPEndPoint myLocalEndPoint = new(ua.Address, 0); // port does not matter
|
|||
try |
|||
{ |
|||
client = new(myLocalEndPoint); |
|||
} |
|||
catch (SocketException) |
|||
{ |
|||
throw; |
|||
} |
|||
break; |
|||
} |
|||
|
|||
return client; |
|||
} |
|||
|
|||
public static IEnumerable<OnvifUdpClient> CreateClientList(IEnumerable<NetworkInterface> adapterList) |
|||
{ |
|||
List<OnvifUdpClient> clientList = new(); |
|||
foreach (NetworkInterface adapter in adapterList) |
|||
{ |
|||
OnvifUdpClient client = CreateClient(adapter); |
|||
if (client != null) { clientList.Add(client); } |
|||
} |
|||
return clientList; |
|||
} |
|||
|
|||
public static IEnumerable<OnvifUdpClient> CreateClientList() |
|||
{ |
|||
IEnumerable<NetworkInterface> adapterList = GetVaildNetworkAdapters(); |
|||
return CreateClientList(adapterList); |
|||
} |
|||
|
|||
#endregion CreateClient
|
|||
|
|||
#region ClientHelper
|
|||
|
|||
public static List<NetworkInterface> GetNetworkAdapters() |
|||
{ |
|||
NetworkInterface[] nifs = NetworkInterface.GetAllNetworkInterfaces(); |
|||
return new(nifs); |
|||
} |
|||
|
|||
public static List<NetworkInterface> GetVaildNetworkAdapters() |
|||
{ |
|||
NetworkInterface[] nifs = NetworkInterface.GetAllNetworkInterfaces(); |
|||
List<NetworkInterface> list = new(); |
|||
foreach (NetworkInterface nif in nifs) |
|||
{ |
|||
if (IsValidAdapter(nif)) { list.Add(nif); } |
|||
} |
|||
return list; |
|||
} |
|||
|
|||
public static bool IsValidAdapter(NetworkInterface adapter) |
|||
{ |
|||
// Only select interfaces that are Ethernet type and support IPv4 (important to minimize waiting time)
|
|||
if (adapter.NetworkInterfaceType != NetworkInterfaceType.Ethernet && |
|||
!adapter.NetworkInterfaceType.ToString().ToLower().StartsWith("wireless")) return false; |
|||
if (adapter.OperationalStatus == OperationalStatus.Down) { return false; } |
|||
if (!adapter.Supports(NetworkInterfaceComponent.IPv4)) { return false; } |
|||
return true; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 广播
|
|||
/// </summary>
|
|||
/// <param name="client"></param>
|
|||
/// <param name="messageId"></param>
|
|||
/// <returns></returns>
|
|||
public static async Task SendProbe(OnvifUdpClient client, Guid messageId) |
|||
{ |
|||
IPEndPoint multicastEndpoint = new(IPAddress.Parse(Constants.WS_MULTICAST_ADDRESS), Constants.WS_MULTICAST_PORT); |
|||
await client.SendProbeAsync(messageId, multicastEndpoint); |
|||
} |
|||
|
|||
#endregion ClientHelper
|
|||
} |
@ -0,0 +1,112 @@ |
|||
using System.Xml.Serialization; |
|||
|
|||
namespace EC.Helper.Onvif.RemoteDiscovery; |
|||
|
|||
/// <summary>
|
|||
/// The probe response
|
|||
/// </summary>
|
|||
[XmlRoot("Envelope", Namespace = "http://www.w3.org/2003/05/soap-envelope")] |
|||
public class XmlProbeReponse |
|||
{ |
|||
/// <summary>
|
|||
/// The Header of the probe response
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://www.w3.org/2003/05/soap-envelope")] |
|||
public Header Header { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The Body of the probe response
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://www.w3.org/2003/05/soap-envelope")] |
|||
public Body Body { get; set; } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The Header of the probe response
|
|||
/// </summary>
|
|||
public class Header |
|||
{ |
|||
/// <summary>
|
|||
/// The message id
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public string MessageID { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The message id that relates to
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public string RelatesTo { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// To
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public string To { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// App sequence
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string AppSequence { get; set; } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The Body of the probe response
|
|||
/// </summary>
|
|||
public class Body |
|||
{ |
|||
/// <summary>
|
|||
/// An array of probe matches
|
|||
/// </summary>
|
|||
[XmlArray(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public ProbeMatch[] ProbeMatches { get; set; } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// A probe match
|
|||
/// </summary>
|
|||
public class ProbeMatch |
|||
{ |
|||
/// <summary>
|
|||
/// The endpoint reference
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public EndpointReference EndpointReference { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The types
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string Types { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The scopes
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string Scopes { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The XAddrs
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string XAddrs { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// The metadata version
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2005/04/discovery")] |
|||
public string MetadataVersion { get; set; } |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The endpoint reference
|
|||
/// </summary>
|
|||
public class EndpointReference |
|||
{ |
|||
/// <summary>
|
|||
/// The address
|
|||
/// </summary>
|
|||
[XmlElement(Namespace = "http://schemas.xmlsoap.org/ws/2004/08/addressing")] |
|||
public string Address { get; set; } |
|||
} |
@ -0,0 +1,80 @@ |
|||
using System.Security.Cryptography; |
|||
using System.ServiceModel.Channels; |
|||
using System.Text; |
|||
using System.Xml; |
|||
|
|||
namespace EC.Helper.Onvif.Security; |
|||
|
|||
public class SoapSecurityHeader : MessageHeader |
|||
{ |
|||
private const string ns_wsu = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"; |
|||
private readonly string username; |
|||
private readonly string password; |
|||
private readonly TimeSpan time_shift; |
|||
|
|||
public override string Name { get; } = "Security"; |
|||
public override string Namespace { get; } = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; |
|||
|
|||
public SoapSecurityHeader(string username, string password, TimeSpan timeShift) |
|||
{ |
|||
this.username = username; |
|||
this.password = password; |
|||
time_shift = timeShift; |
|||
} |
|||
|
|||
protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) |
|||
{ |
|||
var nonce = GetNonce(); |
|||
var created = DateTime.UtcNow.Add(time_shift).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); |
|||
var nonce_str = Convert.ToBase64String(nonce); |
|||
string password_hash = PasswordDigest(nonce, created, password); |
|||
|
|||
writer.WriteStartElement("UsernameToken"); |
|||
|
|||
writer.WriteStartElement("Username"); |
|||
writer.WriteValue(username); |
|||
writer.WriteEndElement(); |
|||
|
|||
writer.WriteStartElement("Password"); |
|||
writer.WriteAttributeString("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"); |
|||
writer.WriteValue(password_hash); |
|||
writer.WriteEndElement(); |
|||
|
|||
writer.WriteStartElement("Nonce"); |
|||
writer.WriteAttributeString("EncodingType", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"); |
|||
writer.WriteValue(nonce_str); |
|||
writer.WriteEndElement(); |
|||
|
|||
writer.WriteStartElement("Created"); |
|||
writer.WriteXmlnsAttribute("", ns_wsu); |
|||
writer.WriteValue(created); |
|||
writer.WriteEndElement(); |
|||
|
|||
writer.WriteEndElement(); |
|||
} |
|||
|
|||
protected override void OnWriteStartHeader(XmlDictionaryWriter writer, MessageVersion messageVersion) |
|||
{ |
|||
writer.WriteStartElement("", Name, Namespace); |
|||
writer.WriteAttributeString("s", "mustUnderstand", "http://www.w3.org/2003/05/soap-envelope", "1"); |
|||
writer.WriteXmlnsAttribute("", Namespace); |
|||
} |
|||
|
|||
private string PasswordDigest(byte[] nonce, string created, string secret) |
|||
{ |
|||
byte[] buffer = new byte[nonce.Length + Encoding.ASCII.GetByteCount(created + secret)]; |
|||
|
|||
nonce.CopyTo(buffer, 0); |
|||
Encoding.ASCII.GetBytes(created + password).CopyTo(buffer, nonce.Length); |
|||
|
|||
return Convert.ToBase64String(SHA1.Create().ComputeHash(buffer)); |
|||
} |
|||
|
|||
private byte[] GetNonce() |
|||
{ |
|||
byte[] nonce = new byte[0x10]; |
|||
var generator = new RNGCryptoServiceProvider(); |
|||
generator.GetBytes(nonce); |
|||
return nonce; |
|||
} |
|||
} |
@ -0,0 +1,40 @@ |
|||
using System.ServiceModel.Channels; |
|||
using System.ServiceModel.Description; |
|||
using System.ServiceModel.Dispatcher; |
|||
|
|||
namespace EC.Helper.Onvif.Security; |
|||
|
|||
public class SoapSecurityHeaderBehavior : IEndpointBehavior |
|||
{ |
|||
private readonly string username; |
|||
private readonly string password; |
|||
private readonly TimeSpan time_shift; |
|||
|
|||
public SoapSecurityHeaderBehavior(string username, string password) : this(username, password, TimeSpan.FromMilliseconds(0)) |
|||
{ |
|||
} |
|||
|
|||
public SoapSecurityHeaderBehavior(string username, string password, TimeSpan timeShift) |
|||
{ |
|||
this.username = username; |
|||
this.password = password; |
|||
time_shift = timeShift; |
|||
} |
|||
|
|||
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) |
|||
{ |
|||
} |
|||
|
|||
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) |
|||
{ |
|||
clientRuntime.ClientMessageInspectors.Add(new SoapSecurityHeaderInspector(username, password, time_shift)); |
|||
} |
|||
|
|||
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) |
|||
{ |
|||
} |
|||
|
|||
public void Validate(ServiceEndpoint endpoint) |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,30 @@ |
|||
using System.ServiceModel; |
|||
using System.ServiceModel.Channels; |
|||
using System.ServiceModel.Dispatcher; |
|||
|
|||
namespace EC.Helper.Onvif.Security; |
|||
|
|||
public class SoapSecurityHeaderInspector : IClientMessageInspector |
|||
{ |
|||
private readonly string username; |
|||
private readonly string password; |
|||
private readonly TimeSpan time_shift; |
|||
|
|||
public SoapSecurityHeaderInspector(string username, string password, TimeSpan timeShift) |
|||
{ |
|||
this.username = username; |
|||
this.password = password; |
|||
time_shift = timeShift; |
|||
} |
|||
|
|||
public void AfterReceiveReply(ref Message reply, object correlationState) |
|||
{ |
|||
} |
|||
|
|||
public object BeforeSendRequest(ref Message request, IClientChannel channel) |
|||
{ |
|||
request.Headers.Add(new SoapSecurityHeader(username, password, time_shift)); |
|||
|
|||
return null; |
|||
} |
|||
} |
Loading…
Reference in new issue