forked from fajiao/OnvifServer-CSharp
fajiao
3 years ago
62 changed files with 33822 additions and 0 deletions
@ -0,0 +1,11 @@ |
|||
using Furion.DynamicApiController; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
|
|||
namespace EC.App.Core |
|||
{ |
|||
[ApiDescriptionSettings(false)] |
|||
[NonController] |
|||
public class ApiController : IDynamicApiController |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace EC.App.Core |
|||
{ |
|||
public class BLL : IBLL |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace EC.App.Core |
|||
{ |
|||
public interface IBLL |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace EC.App.Core |
|||
{ |
|||
public interface IService |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
namespace EC.App.Core |
|||
{ |
|||
public class Service : IService |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Furion" Version="2.20.7" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,47 @@ |
|||
namespace EC.Onvif.Camera |
|||
{ |
|||
public class Camera |
|||
{ |
|||
public Camera() |
|||
{ |
|||
} |
|||
|
|||
public Camera(string cameraIp, int port, string userName, string passWord) |
|||
{ |
|||
CameraCode = cameraIp; |
|||
CameraIp = cameraIp; |
|||
Port = port; |
|||
UserName = userName; |
|||
PassWord = passWord; |
|||
} |
|||
|
|||
public string CameraCode { get; set; } |
|||
public string CameraIp { get; set; } |
|||
public int Port { get; set; } |
|||
public string UserName { get; set; } |
|||
public string PassWord { get; set; } |
|||
public int CameraType { get; set; } |
|||
public bool IsPtz { get; set; } |
|||
|
|||
public string PTZUrl { get; set; } |
|||
|
|||
/// <summary>
|
|||
/// 是否登录
|
|||
/// </summary>
|
|||
public bool logined { get; set; } |
|||
|
|||
public bool isConnected { get; set; } |
|||
public bool dataLoaded { get; set; } |
|||
|
|||
public object device { get; set; } |
|||
|
|||
public object media { get; set; } |
|||
public object ptz { get; set; } |
|||
public object imaging { get; set; } |
|||
public object caps { get; set; } |
|||
public bool absolute_move { get; set; } |
|||
public bool relative_move { get; set; } |
|||
public bool continuous_move { get; set; } |
|||
public bool focus { get; set; } |
|||
} |
|||
} |
@ -0,0 +1,41 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.Onvif.Camera |
|||
{ |
|||
public class CameraManager |
|||
{ |
|||
private Dictionary<string, Camera> CameraList = new Dictionary<string, Camera>(); |
|||
|
|||
public bool Add(Camera camera) |
|||
{ |
|||
if (CameraList.ContainsKey(camera.CameraCode)) |
|||
{ |
|||
return false; |
|||
} |
|||
else |
|||
{ |
|||
CameraList.Add(camera.CameraCode, camera); |
|||
return true; |
|||
} |
|||
} |
|||
|
|||
public Camera GetCameraByCode(string cameraCode) |
|||
{ |
|||
if (CameraList.ContainsKey(cameraCode)) |
|||
{ |
|||
return CameraList[cameraCode]; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public void Remove(Camera camera) |
|||
{ |
|||
CameraList.Remove(camera.CameraCode); |
|||
} |
|||
|
|||
public void Remove(string cameraCode) |
|||
{ |
|||
CameraList.Remove(cameraCode); |
|||
} |
|||
} |
|||
} |
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,12 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="System.ServiceModel.Http" Version="4.8.1" /> |
|||
<PackageReference Include="System.ServiceModel.Security" Version="4.8.1" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,144 @@ |
|||
namespace EC.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,186 @@ |
|||
using EC.Onvif.Common; |
|||
|
|||
namespace EC.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,663 @@ |
|||
using EC.Onvif.Common; |
|||
|
|||
namespace EC.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,191 @@ |
|||
using EC.Onvif.Common; |
|||
using EC.Onvif.Device; |
|||
using EC.Onvif.Imaging; |
|||
using EC.Onvif.Media; |
|||
using EC.Onvif.PTZ; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Capabilities = EC.Onvif.Common.Capabilities; |
|||
|
|||
namespace EC.Onvif |
|||
{ |
|||
public class OnvifClient |
|||
{ |
|||
#region Attr
|
|||
|
|||
private string Hostname { get; set; } |
|||
|
|||
private string Username { get; set; } |
|||
|
|||
private string Password { get; set; } |
|||
|
|||
public static float atomDist { get; set; } = 0.01f; |
|||
|
|||
public static float atomSpeed { get; set; } = 0.1f; |
|||
|
|||
#endregion Attr
|
|||
|
|||
#region Client Attr
|
|||
|
|||
private DeviceClient Device { get; set; } |
|||
|
|||
private MediaClient Media { get; set; } |
|||
|
|||
private PTZClient PTZ { get; set; } |
|||
|
|||
private ImagingClient Imaging { get; set; } |
|||
|
|||
private Capabilities Caps { get; set; } |
|||
|
|||
private string profileToken { get; set; } |
|||
|
|||
#endregion Client Attr
|
|||
|
|||
public OnvifClient(string hostname, string username, string password) |
|||
{ |
|||
Hostname = hostname; |
|||
Username = username; |
|||
Password = password; |
|||
} |
|||
|
|||
public async Task InitAsync() |
|||
{ |
|||
try |
|||
{ |
|||
Device = await OnvifClientFactory.CreateDeviceClientAsync(Hostname, Username, Password); |
|||
Media = await OnvifClientFactory.CreateMediaClientAsync(Hostname, Username, Password); |
|||
PTZ = await OnvifClientFactory.CreatePTZClientAsync(Hostname, Username, Password); |
|||
var profiles = await Media.GetProfilesAsync(); |
|||
foreach (var profile in profiles.Profiles) |
|||
{ |
|||
if (string.IsNullOrEmpty(profileToken)) |
|||
{ |
|||
profileToken = profile.token; |
|||
break; |
|||
} |
|||
} |
|||
Caps = (await Device.GetCapabilitiesAsync(new CapabilityCategory[] { CapabilityCategory.All })).Capabilities; |
|||
} |
|||
catch (Exception) |
|||
{ |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
#region DeviceClient
|
|||
|
|||
public bool IsDeviceContected() |
|||
{ |
|||
return Device != null; |
|||
} |
|||
|
|||
#endregion DeviceClient
|
|||
|
|||
#region MediaClient
|
|||
|
|||
public bool IsMediaContected() |
|||
{ |
|||
var r = IsDeviceContected(); |
|||
return r; |
|||
} |
|||
|
|||
#endregion MediaClient
|
|||
|
|||
#region PTZClient
|
|||
|
|||
public bool IsPTZContected() |
|||
{ |
|||
var r = IsDeviceContected() && (PTZ != null) && !string.IsNullOrEmpty(profileToken); |
|||
return r; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
/// <returns></returns>
|
|||
public async Task AbsoluteMoveAsync(float pan, float tilt, float zoom) |
|||
{ |
|||
await PTZ.AbsoluteMoveAsync(profileToken, new PTZVector |
|||
{ |
|||
PanTilt = new Vector2D |
|||
{ |
|||
x = pan, |
|||
y = tilt |
|||
}, |
|||
Zoom = new Vector1D |
|||
{ |
|||
x = zoom |
|||
} |
|||
}, null); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 相对移动
|
|||
/// </summary>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
public async Task RelativeMoveAsync(float pan, float tilt, float zoom) |
|||
{ |
|||
await PTZ.RelativeMoveAsync(profileToken, new PTZVector |
|||
{ |
|||
PanTilt = new Vector2D |
|||
{ |
|||
x = pan, |
|||
y = tilt |
|||
}, |
|||
Zoom = new Vector1D |
|||
{ |
|||
x = zoom |
|||
} |
|||
}, null); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 持续移动
|
|||
/// </summary>
|
|||
/// <param name="pan">0~100</param>
|
|||
/// <param name="tilt">0~100</param>
|
|||
/// <param name="zoom">0~100</param>
|
|||
public async Task ContinuousMoveAsync(float pan, float tilt, float zoom) |
|||
{ |
|||
await PTZ.ContinuousMoveAsync(profileToken, new PTZSpeed |
|||
{ |
|||
PanTilt = new Vector2D |
|||
{ |
|||
x = pan, |
|||
y = tilt |
|||
}, |
|||
Zoom = new Vector1D |
|||
{ |
|||
x = zoom |
|||
} |
|||
}, null); |
|||
} |
|||
|
|||
public async Task StopMoveAsync() |
|||
{ |
|||
await PTZ.StopAsync(profileToken, true, true); |
|||
} |
|||
|
|||
public async Task<PTZStatus> GetStatusAsync() |
|||
{ |
|||
return await PTZ.GetStatusAsync(profileToken); |
|||
} |
|||
|
|||
#endregion PTZClient
|
|||
|
|||
#region ImagingClient
|
|||
|
|||
public bool IsImagingContected() |
|||
{ |
|||
var r = IsDeviceContected(); |
|||
return r; |
|||
} |
|||
|
|||
#endregion ImagingClient
|
|||
} |
|||
} |
@ -0,0 +1,117 @@ |
|||
using EC.Onvif.Common; |
|||
using EC.Onvif.Device; |
|||
using EC.Onvif.Imaging; |
|||
using EC.Onvif.Media; |
|||
using EC.Onvif.PTZ; |
|||
using EC.Onvif.Security; |
|||
using System; |
|||
using System.ServiceModel; |
|||
using System.ServiceModel.Channels; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.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,185 @@ |
|||
namespace EC.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,662 @@ |
|||
using EC.Onvif.Common; |
|||
|
|||
namespace EC.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,27 @@ |
|||
namespace EC.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,187 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Net; |
|||
using System.Net.NetworkInformation; |
|||
using System.Net.Sockets; |
|||
using System.Text; |
|||
using System.Text.RegularExpressions; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
using System.Xml; |
|||
using System.Xml.Serialization; |
|||
|
|||
namespace EC.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,33 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.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,25 @@ |
|||
using System; |
|||
using System.Threading; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.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,140 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Net; |
|||
using System.Net.NetworkInformation; |
|||
using System.Net.Sockets; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.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,113 @@ |
|||
using System.Xml.Serialization; |
|||
|
|||
namespace EC.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,82 @@ |
|||
using System; |
|||
using System.Security.Cryptography; |
|||
using System.ServiceModel.Channels; |
|||
using System.Text; |
|||
using System.Xml; |
|||
|
|||
namespace EC.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,42 @@ |
|||
using System; |
|||
using System.ServiceModel.Channels; |
|||
using System.ServiceModel.Description; |
|||
using System.ServiceModel.Dispatcher; |
|||
|
|||
namespace EC.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,32 @@ |
|||
using System; |
|||
using System.ServiceModel; |
|||
using System.ServiceModel.Channels; |
|||
using System.ServiceModel.Dispatcher; |
|||
|
|||
namespace EC.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; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,42 @@ |
|||
using System.Collections.Generic; |
|||
|
|||
namespace EC.App.Entity.Base |
|||
{ |
|||
public class DictBase<K, V> |
|||
{ |
|||
private Dictionary<K, V> Dict { get; } = new(); |
|||
|
|||
public DictBase() |
|||
{ } |
|||
|
|||
#region Operate
|
|||
|
|||
public bool TryAdd(K key, V value) |
|||
{ |
|||
return Dict.TryAdd(key, value); |
|||
} |
|||
|
|||
public bool Remove(K key) |
|||
{ |
|||
return Dict.Remove(key); |
|||
} |
|||
|
|||
public bool TryUpdate(K key, V value) |
|||
{ |
|||
Remove(key); |
|||
return TryAdd(key, value); |
|||
} |
|||
|
|||
public bool TryGet(K key, out V value) |
|||
{ |
|||
return Dict.TryGetValue(key, out value); |
|||
} |
|||
|
|||
public bool IsExist(K key) |
|||
{ |
|||
return Dict.ContainsKey(key); |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\BaseModule\EC.Onvif\EC.Onvif.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,9 @@ |
|||
using EC.App.Entity.Base; |
|||
using EC.Onvif; |
|||
|
|||
namespace EC.App.Entity.Onvif |
|||
{ |
|||
public class OnvifClientDict : DictBase<string, OnvifClient> |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\BaseModule\EC.App\EC.App.csproj" /> |
|||
<ProjectReference Include="..\..\BaseModule\EC.Onvif\EC.Onvif.csproj" /> |
|||
<ProjectReference Include="..\EC.App.ThatService\EC.App.ThatService.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,50 @@ |
|||
using EC.App.Entity.Onvif; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using EC.Onvif; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif |
|||
{ |
|||
public class CurdBLL : ICurdBLL |
|||
{ |
|||
private readonly OnvifClientService _ocService; |
|||
|
|||
public CurdBLL(OnvifClientService onvifClientService) |
|||
{ |
|||
_ocService = onvifClientService; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public async Task<bool> Add(string ip, string username, string password) |
|||
{ |
|||
bool flag = !_ocService.IsExist(ip); |
|||
if (!flag) { return false; } |
|||
OnvifClient onvifClient = new OnvifClient(ip, username, password); |
|||
await onvifClient.InitAsync(); |
|||
bool ret = _ocService.TryAdd(ip, onvifClient); |
|||
return ret; |
|||
} |
|||
|
|||
public bool Remove(string ip) |
|||
{ |
|||
bool ret = _ocService.Remove(ip); |
|||
return ret; |
|||
} |
|||
|
|||
public async Task<bool> Update(string ip, string username, string password) |
|||
{ |
|||
Remove(ip); |
|||
bool ret = await Add(ip, username, password); |
|||
return ret; |
|||
} |
|||
|
|||
public bool IsExist(string ip) |
|||
{ |
|||
bool ret = _ocService.IsExist(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
using EC.App.Entity.Onvif; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using EC.Onvif; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif |
|||
{ |
|||
public class DeviceBLL : IDeviceBLL |
|||
{ |
|||
private readonly OnvifClientService _ocService; |
|||
|
|||
public DeviceBLL(OnvifClientService onvifClientService) |
|||
{ |
|||
_ocService = onvifClientService; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public bool IsConnected(string ip) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
bool ret = flag && onvifClient.IsDeviceContected(); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
using EC.App.Entity.Onvif; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using EC.Onvif; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif |
|||
{ |
|||
public class ImagingBLL : IImagingBLL |
|||
{ |
|||
private readonly OnvifClientService _ocService; |
|||
|
|||
public ImagingBLL(OnvifClientService onvifClientService) |
|||
{ |
|||
_ocService = onvifClientService; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public bool IsConnected(string ip) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
bool ret = flag && onvifClient.IsImagingContected(); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif.Impl |
|||
{ |
|||
public interface ICurdBLL : IBLL, ISingleton |
|||
{ |
|||
#region Operate
|
|||
|
|||
Task<bool> Add(string ip, string username, string password); |
|||
|
|||
bool Remove(string ip); |
|||
|
|||
Task<bool> Update(string ip, string username, string password); |
|||
|
|||
bool IsExist(string ip); |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif.Impl |
|||
{ |
|||
public interface IDeviceBLL : IBLL, ISingleton |
|||
{ |
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
bool IsConnected(string ip); |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif.Impl |
|||
{ |
|||
public interface IImagingBLL : IBLL, ISingleton |
|||
{ |
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
bool IsConnected(string ip); |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif.Impl |
|||
{ |
|||
public interface IMediaBLL : IBLL, ISingleton |
|||
{ |
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
bool IsConnected(string ip); |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,61 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif.Impl |
|||
{ |
|||
public interface IPTZBLL : IBLL, ISingleton |
|||
{ |
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
bool IsConnected(string ip); |
|||
|
|||
#endregion Operate
|
|||
|
|||
#region Move
|
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
/// <returns></returns>
|
|||
Task<bool> AbsoluteMove(string ip, float pan, float tilt, float zoom); |
|||
|
|||
/// <summary>
|
|||
/// 相对移动
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
/// <returns></returns>
|
|||
Task<bool> RelativeMove(string ip, float pan, float tilt, float zoom); |
|||
|
|||
/// <summary>
|
|||
/// 持续移动
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <param name="pan"></param>
|
|||
/// <param name="tilt"></param>
|
|||
/// <param name="zoom"></param>
|
|||
/// <returns></returns>
|
|||
Task<bool> ContinuousMove(string ip, float pan, float tilt, float zoom); |
|||
|
|||
/// <summary>
|
|||
/// 停止移动
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
Task<bool> StopMove(string ip); |
|||
|
|||
#endregion Move
|
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
using EC.App.Entity.Onvif; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using EC.Onvif; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif |
|||
{ |
|||
public class MediaBLL : IMediaBLL |
|||
{ |
|||
private readonly OnvifClientService _ocService; |
|||
|
|||
public MediaBLL(OnvifClientService onvifClientService) |
|||
{ |
|||
_ocService = onvifClientService; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public bool IsConnected(string ip) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
bool ret = flag && onvifClient.IsMediaContected(); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,64 @@ |
|||
using EC.App.Entity.Onvif; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using EC.Onvif; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace EC.App.ThatBLL.Onvif |
|||
{ |
|||
public class PTZBLL : IPTZBLL |
|||
{ |
|||
private readonly OnvifClientService _ocService; |
|||
|
|||
public PTZBLL(OnvifClientService onvifClientService) |
|||
{ |
|||
_ocService = onvifClientService; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
public bool IsConnected(string ip) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
bool ret = flag && onvifClient.IsPTZContected(); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
|
|||
#region Move
|
|||
|
|||
public async Task<bool> AbsoluteMove(string ip, float pan, float tilt, float zoom) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
if (!flag) return false; |
|||
await onvifClient.AbsoluteMoveAsync(pan, tilt, zoom); |
|||
return true; |
|||
} |
|||
|
|||
public async Task<bool> RelativeMove(string ip, float pan, float tilt, float zoom) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
if (!flag) return false; |
|||
await onvifClient.RelativeMoveAsync(pan, tilt, zoom); |
|||
return true; |
|||
} |
|||
|
|||
public async Task<bool> ContinuousMove(string ip, float pan, float tilt, float zoom) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
if (!flag) return false; |
|||
await onvifClient.ContinuousMoveAsync(pan, tilt, zoom); |
|||
return true; |
|||
} |
|||
|
|||
public async Task<bool> StopMove(string ip) |
|||
{ |
|||
bool flag = _ocService.TryGet(ip, out OnvifClient onvifClient); |
|||
if (!flag) return false; |
|||
await onvifClient.StopMoveAsync(); |
|||
return true; |
|||
} |
|||
|
|||
#endregion Move
|
|||
} |
|||
} |
@ -0,0 +1,13 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\BaseModule\EC.App\EC.App.csproj" /> |
|||
<ProjectReference Include="..\..\BaseModule\EC.Onvif\EC.Onvif.csproj" /> |
|||
<ProjectReference Include="..\EC.App.Entity\EC.App.Entity.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,9 @@ |
|||
using EC.App.Core; |
|||
using Furion.DependencyInjection; |
|||
|
|||
namespace EC.App.ThatService.Onvif.Impl |
|||
{ |
|||
public interface IOnvifClientService : IService, ISingleton |
|||
{ |
|||
} |
|||
} |
@ -0,0 +1,44 @@ |
|||
using EC.App.ThatService.Onvif.Impl; |
|||
using EC.Onvif; |
|||
|
|||
namespace EC.App.Entity.Onvif |
|||
{ |
|||
public class OnvifClientService : IOnvifClientService |
|||
{ |
|||
private readonly OnvifClientDict _dict = new OnvifClientDict(); |
|||
|
|||
public OnvifClientService() |
|||
{ |
|||
} |
|||
|
|||
public bool TryAdd(string key, OnvifClient value) |
|||
{ |
|||
bool ret = _dict.TryAdd(key, value); |
|||
return ret; |
|||
} |
|||
|
|||
public bool Remove(string key) |
|||
{ |
|||
bool ret = _dict.Remove(key); |
|||
return ret; |
|||
} |
|||
|
|||
public bool TryUpdate(string key, OnvifClient value) |
|||
{ |
|||
bool ret = _dict.TryUpdate(key, value); |
|||
return ret; |
|||
} |
|||
|
|||
public bool TryGet(string key, out OnvifClient value) |
|||
{ |
|||
bool ret = _dict.TryGet(key, out value); |
|||
return ret; |
|||
} |
|||
|
|||
public bool IsExist(string key) |
|||
{ |
|||
bool ret = _dict.IsExist(key); |
|||
return ret; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,72 @@ |
|||
|
|||
Microsoft Visual Studio Solution File, Format Version 12.00 |
|||
# Visual Studio Version 17 |
|||
VisualStudioVersion = 17.0.32014.148 |
|||
MinimumVisualStudioVersion = 10.0.40219.1 |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnvifWebServer", "OnvifWebServer\OnvifWebServer.csproj", "{6932E7F3-56E3-4AA5-898C-1C814D53C5F6}" |
|||
EndProject |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OnvifSocketServer", "OnvifSocketServer\OnvifSocketServer.csproj", "{2CC43390-1870-475A-B2F1-5F66C17E27B5}" |
|||
EndProject |
|||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseModule", "BaseModule", "{8D6DAF0C-45FB-4650-8F4F-A63283D32F75}" |
|||
EndProject |
|||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BusinessModule", "BusinessModule", "{BE926C07-70B6-48E6-9A09-8089AC72DB52}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Onvif", "BaseModule\EC.Onvif\EC.Onvif.csproj", "{94728605-7159-40DD-861C-4D1B9E8DEA00}" |
|||
EndProject |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EC.App.Entity", "BusinessModule\EC.App.Entity\EC.App.Entity.csproj", "{2B89CB02-BA09-4140-A3BF-5A02109C080C}" |
|||
EndProject |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EC.App", "BaseModule\EC.App\EC.App.csproj", "{7AE950D5-1982-4D76-94F5-A38347AE8263}" |
|||
EndProject |
|||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EC.App.ThatBLL", "BusinessModule\EC.App.ThatBLL\EC.App.ThatBLL.csproj", "{D1528FA0-E88B-483A-932C-A682BDD4FF98}" |
|||
EndProject |
|||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.App.ThatService", "BusinessModule\EC.App.ThatService\EC.App.ThatService.csproj", "{EE03CCDB-A280-477B-86FF-B6918169FCDA}" |
|||
EndProject |
|||
Global |
|||
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
|||
Debug|Any CPU = Debug|Any CPU |
|||
Release|Any CPU = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
|||
{6932E7F3-56E3-4AA5-898C-1C814D53C5F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{6932E7F3-56E3-4AA5-898C-1C814D53C5F6}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{6932E7F3-56E3-4AA5-898C-1C814D53C5F6}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{6932E7F3-56E3-4AA5-898C-1C814D53C5F6}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{2CC43390-1870-475A-B2F1-5F66C17E27B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{2CC43390-1870-475A-B2F1-5F66C17E27B5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{2CC43390-1870-475A-B2F1-5F66C17E27B5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{2CC43390-1870-475A-B2F1-5F66C17E27B5}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{94728605-7159-40DD-861C-4D1B9E8DEA00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{94728605-7159-40DD-861C-4D1B9E8DEA00}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{94728605-7159-40DD-861C-4D1B9E8DEA00}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{94728605-7159-40DD-861C-4D1B9E8DEA00}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{2B89CB02-BA09-4140-A3BF-5A02109C080C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{2B89CB02-BA09-4140-A3BF-5A02109C080C}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{2B89CB02-BA09-4140-A3BF-5A02109C080C}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{2B89CB02-BA09-4140-A3BF-5A02109C080C}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{7AE950D5-1982-4D76-94F5-A38347AE8263}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{7AE950D5-1982-4D76-94F5-A38347AE8263}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{7AE950D5-1982-4D76-94F5-A38347AE8263}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{7AE950D5-1982-4D76-94F5-A38347AE8263}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{D1528FA0-E88B-483A-932C-A682BDD4FF98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{D1528FA0-E88B-483A-932C-A682BDD4FF98}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{D1528FA0-E88B-483A-932C-A682BDD4FF98}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{D1528FA0-E88B-483A-932C-A682BDD4FF98}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
{EE03CCDB-A280-477B-86FF-B6918169FCDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
|||
{EE03CCDB-A280-477B-86FF-B6918169FCDA}.Debug|Any CPU.Build.0 = Debug|Any CPU |
|||
{EE03CCDB-A280-477B-86FF-B6918169FCDA}.Release|Any CPU.ActiveCfg = Release|Any CPU |
|||
{EE03CCDB-A280-477B-86FF-B6918169FCDA}.Release|Any CPU.Build.0 = Release|Any CPU |
|||
EndGlobalSection |
|||
GlobalSection(SolutionProperties) = preSolution |
|||
HideSolutionNode = FALSE |
|||
EndGlobalSection |
|||
GlobalSection(NestedProjects) = preSolution |
|||
{94728605-7159-40DD-861C-4D1B9E8DEA00} = {8D6DAF0C-45FB-4650-8F4F-A63283D32F75} |
|||
{2B89CB02-BA09-4140-A3BF-5A02109C080C} = {BE926C07-70B6-48E6-9A09-8089AC72DB52} |
|||
{7AE950D5-1982-4D76-94F5-A38347AE8263} = {8D6DAF0C-45FB-4650-8F4F-A63283D32F75} |
|||
{D1528FA0-E88B-483A-932C-A682BDD4FF98} = {BE926C07-70B6-48E6-9A09-8089AC72DB52} |
|||
{EE03CCDB-A280-477B-86FF-B6918169FCDA} = {BE926C07-70B6-48E6-9A09-8089AC72DB52} |
|||
EndGlobalSection |
|||
GlobalSection(ExtensibilityGlobals) = postSolution |
|||
SolutionGuid = {94E890EB-BBFB-4C67-9A75-EF7217F2E82B} |
|||
EndGlobalSection |
|||
EndGlobal |
@ -0,0 +1,8 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk"> |
|||
|
|||
<PropertyGroup> |
|||
<OutputType>Exe</OutputType> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,12 @@ |
|||
using System; |
|||
|
|||
namespace OnvifSocketServer |
|||
{ |
|||
internal class Program |
|||
{ |
|||
static void Main(string[] args) |
|||
{ |
|||
Console.WriteLine("Hello World!"); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,90 @@ |
|||
using EC.App.Core; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
/// <summary>
|
|||
/// Onvif 增删改查
|
|||
/// </summary>
|
|||
[Route("onvif/[controller]")]
|
|||
[ApiDescriptionSettings("Onvif")] |
|||
public class CurdController : ApiController |
|||
{ |
|||
private readonly ICurdBLL _curdBLL; |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <param name="curdBLL"></param>
|
|||
public CurdController(ICurdBLL curdBLL) |
|||
{ |
|||
_curdBLL = curdBLL; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 添加 onvif
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <param name="username">用户名</param>
|
|||
/// <param name="password">密码</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> Add( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip, |
|||
[Required] string username, [Required] string password) |
|||
{ |
|||
bool ret = await _curdBLL.Add(ip, username, password); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 移除 onvif
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool Remove( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _curdBLL.Remove(ip); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 更新 onvif
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <param name="username">用户名</param>
|
|||
/// <param name="password">密码</param>
|
|||
/// <returns></returns>
|
|||
[HttpPost] |
|||
public async Task<bool> Update( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip, |
|||
[Required] string username, [Required] string password) |
|||
{ |
|||
bool ret = await _curdBLL.Update(ip, username, password); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 是否存在 onvif
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsExist( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _curdBLL.IsExist(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,44 @@ |
|||
using EC.App.Core; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
/// <summary>
|
|||
/// Onvif 设备参数控制
|
|||
/// </summary>
|
|||
[Route("onvif/[controller]")]
|
|||
[ApiDescriptionSettings("Onvif")] |
|||
public class DeviceController : ApiController |
|||
{ |
|||
private readonly IDeviceBLL _deviceBLL; |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <param name="deviceBLL"></param>
|
|||
public DeviceController(IDeviceBLL deviceBLL) |
|||
{ |
|||
this._deviceBLL = deviceBLL; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsConnected( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _deviceBLL.IsConnected(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,44 @@ |
|||
using EC.App.Core; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
/// <summary>
|
|||
/// Onvif 成像参数控制
|
|||
/// </summary>
|
|||
[Route("onvif/[controller]")]
|
|||
[ApiDescriptionSettings("Onvif")] |
|||
public class ImagingController : ApiController |
|||
{ |
|||
private readonly IImagingBLL _imagingBLL; |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <param name="imagingBLL"></param>
|
|||
public ImagingController(IImagingBLL imagingBLL) |
|||
{ |
|||
this._imagingBLL = imagingBLL; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsConnected( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _imagingBLL.IsConnected(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,44 @@ |
|||
using EC.App.Core; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
/// <summary>
|
|||
/// Onvif 媒体参数控制
|
|||
/// </summary>
|
|||
[Route("onvif/[controller]")]
|
|||
[ApiDescriptionSettings("Onvif")] |
|||
public class MediaController : ApiController |
|||
{ |
|||
private readonly IMediaBLL _mediaBLL; |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <param name="mediaBLL"></param>
|
|||
public MediaController(IMediaBLL mediaBLL) |
|||
{ |
|||
this._mediaBLL = mediaBLL; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsConnected( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _mediaBLL.IsConnected(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,110 @@ |
|||
using EC.App.Core; |
|||
using EC.App.ThatBLL.Onvif.Impl; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System.ComponentModel.DataAnnotations; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
/// <summary>
|
|||
/// Onvif 移动参数控制
|
|||
/// </summary>
|
|||
[Route("onvif/[controller]")]
|
|||
[ApiDescriptionSettings("Onvif")] |
|||
public class PTZController : ApiController |
|||
{ |
|||
private readonly IPTZBLL _ptzBLL; |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
/// <param name="ptzBLL"></param>
|
|||
public PTZController(IPTZBLL ptzBLL) |
|||
{ |
|||
this._ptzBLL = ptzBLL; |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
/// <summary>
|
|||
/// 是否连接
|
|||
/// </summary>
|
|||
/// <param name="ip"></param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public bool IsConnected( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = _ptzBLL.IsConnected(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
|
|||
#region Move
|
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <param name="pan">水平方向移动绝对点</param>
|
|||
/// <param name="tilt">垂直方向移动绝对点</param>
|
|||
/// <param name="zoom">变焦绝对点</param>
|
|||
/// <returns></returns>
|
|||
[HttpGet] |
|||
public async Task<bool> AbsoluteMove( |
|||
[DataValidation(ValidationTypes.IPv4)] string ip, |
|||
[Required] float pan, [Required] float tilt, [Required] float zoom) |
|||
{ |
|||
bool ret = await _ptzBLL.AbsoluteMove(ip, pan, tilt, zoom); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 绝对移动
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <param name="pan">水平方向移动绝对点</param>
|
|||
/// <param name="tilt">垂直方向移动绝对点</param>
|
|||
/// <param name="zoom">变焦绝对点</param>
|
|||
[HttpGet] |
|||
public async Task<bool> RelativeMove( |
|||
[DataValidation(ValidationTypes.IPv4)] string ip, |
|||
[Required] float pan, [Required] float tilt, [Required] float zoom) |
|||
{ |
|||
bool ret = await _ptzBLL.RelativeMove(ip, pan, tilt, zoom); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 持续移动
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
/// <param name="pan">水平方向移动绝对点</param>
|
|||
/// <param name="tilt">垂直方向移动绝对点</param>
|
|||
/// <param name="zoom">变焦绝对点</param>
|
|||
[HttpGet] |
|||
public async Task<bool> ContinuousMove( |
|||
[DataValidation(ValidationTypes.IPv4)] string ip, |
|||
[Required] float pan, [Required] float tilt, [Required] float zoom) |
|||
{ |
|||
bool ret = await _ptzBLL.ContinuousMove(ip, pan, tilt, zoom); |
|||
return ret; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 停止移动
|
|||
/// </summary>
|
|||
/// <param name="ip">IP地址</param>
|
|||
[HttpGet] |
|||
public async Task<bool> StopMove( |
|||
[Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
bool ret = await _ptzBLL.StopMove(ip); |
|||
return ret; |
|||
} |
|||
|
|||
#endregion Move
|
|||
} |
|||
} |
@ -0,0 +1,40 @@ |
|||
using EC.App.Core; |
|||
using Furion.DataValidation; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace OnvifWebServer.Controllers.Onvif |
|||
{ |
|||
[Route("test/[controller]")]
|
|||
[ApiDescriptionSettings("Test")] |
|||
public class TestController : ApiController |
|||
{ |
|||
public TestController() |
|||
{ |
|||
} |
|||
|
|||
#region Operate
|
|||
|
|||
[HttpGet] |
|||
public string TestString(string ip) |
|||
{ |
|||
return ip; |
|||
} |
|||
|
|||
[HttpGet] |
|||
public string TestValid([Required][DataValidation(ValidationTypes.IPv4)] string ip) |
|||
{ |
|||
return ip; |
|||
} |
|||
|
|||
[HttpGet] |
|||
public string TestException(string ip) |
|||
{ |
|||
throw new Exception("test"); |
|||
return ip; |
|||
} |
|||
|
|||
#endregion Operate
|
|||
} |
|||
} |
@ -0,0 +1,103 @@ |
|||
using Furion; |
|||
using Furion.DataValidation; |
|||
using Furion.DependencyInjection; |
|||
using Furion.UnifyResult; |
|||
using Furion.UnifyResult.Internal; |
|||
using Microsoft.AspNetCore.Http; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.AspNetCore.Mvc.Filters; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace OnvifWebServer.Extensions |
|||
{ |
|||
/// <summary>
|
|||
/// RESTful 风格返回值
|
|||
/// </summary>
|
|||
[SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))] |
|||
public class RESTfulResultProvider : IUnifyResultProvider |
|||
{ |
|||
/// <summary>
|
|||
/// 异常返回值
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
/// <param name="metadata"></param>
|
|||
/// <returns></returns>
|
|||
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) |
|||
{ |
|||
return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 成功返回值
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
/// <param name="data"></param>
|
|||
/// <returns></returns>
|
|||
public IActionResult OnSucceeded(ActionExecutedContext context, object data) |
|||
{ |
|||
return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 验证失败返回值
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
/// <param name="metadata"></param>
|
|||
/// <returns></returns>
|
|||
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) |
|||
{ |
|||
return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 特定状态码返回值
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
/// <param name="statusCode"></param>
|
|||
/// <param name="unifyResultSettings"></param>
|
|||
/// <returns></returns>
|
|||
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings) |
|||
{ |
|||
// 设置响应状态码
|
|||
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); |
|||
|
|||
switch (statusCode) |
|||
{ |
|||
// 处理 401 状态码
|
|||
case StatusCodes.Status401Unauthorized: |
|||
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "401 Unauthorized") |
|||
, App.GetOptions<JsonOptions>()?.JsonSerializerOptions); |
|||
break; |
|||
// 处理 403 状态码
|
|||
case StatusCodes.Status403Forbidden: |
|||
await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden") |
|||
, App.GetOptions<JsonOptions>()?.JsonSerializerOptions); |
|||
break; |
|||
|
|||
default: break; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 返回 RESTful 风格结果集
|
|||
/// </summary>
|
|||
/// <param name="statusCode"></param>
|
|||
/// <param name="succeeded"></param>
|
|||
/// <param name="data"></param>
|
|||
/// <param name="errors"></param>
|
|||
/// <returns></returns>
|
|||
private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default) |
|||
{ |
|||
return new RESTfulResult<object> |
|||
{ |
|||
StatusCode = statusCode, |
|||
Succeeded = succeeded, |
|||
Data = data, |
|||
Errors = errors, |
|||
Extras = UnifyContext.Take(), |
|||
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() |
|||
}; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,19 @@ |
|||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
|||
|
|||
<PropertyGroup> |
|||
<TargetFramework>net5.0</TargetFramework> |
|||
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages> |
|||
<GenerateDocumentationFile>True</GenerateDocumentationFile> |
|||
<AnalysisLevel>6.0</AnalysisLevel> |
|||
</PropertyGroup> |
|||
|
|||
<ItemGroup> |
|||
<PackageReference Include="Furion" Version="2.20.7" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\BaseModule\EC.App\EC.App.csproj" /> |
|||
<ProjectReference Include="..\BusinessModule\EC.App.ThatBLL\EC.App.ThatBLL.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
</Project> |
@ -0,0 +1,22 @@ |
|||
using Microsoft.AspNetCore.Hosting; |
|||
using Microsoft.Extensions.Hosting; |
|||
|
|||
namespace OnvifWebServer |
|||
{ |
|||
public class Program |
|||
{ |
|||
public static void Main(string[] args) |
|||
{ |
|||
CreateHostBuilder(args).Build().Run(); |
|||
} |
|||
|
|||
public static IHostBuilder CreateHostBuilder(string[] args) => |
|||
Host.CreateDefaultBuilder(args) |
|||
.ConfigureWebHostDefaults(webBuilder => |
|||
{ |
|||
webBuilder |
|||
.Inject() // Ìí¼ÓÕâÒ»ÐÐ
|
|||
.UseStartup<Startup>(); |
|||
}); |
|||
} |
|||
} |
@ -0,0 +1,29 @@ |
|||
{ |
|||
"$schema": "http://json.schemastore.org/launchsettings.json", |
|||
"iisSettings": { |
|||
"windowsAuthentication": false, |
|||
"anonymousAuthentication": true, |
|||
"iisExpress": { |
|||
"applicationUrl": "http://localhost:37315", |
|||
"sslPort": 44355 |
|||
} |
|||
}, |
|||
"profiles": { |
|||
"IIS Express": { |
|||
"commandName": "IISExpress", |
|||
"launchBrowser": true, |
|||
"environmentVariables": { |
|||
"ASPNETCORE_ENVIRONMENT": "Development" |
|||
} |
|||
}, |
|||
"OnvifWebServer": { |
|||
"commandName": "Project", |
|||
"dotnetRunMessages": "true", |
|||
"launchBrowser": true, |
|||
"applicationUrl": "https://localhost:5001;http://localhost:5000", |
|||
"environmentVariables": { |
|||
"ASPNETCORE_ENVIRONMENT": "Development" |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,48 @@ |
|||
using Microsoft.AspNetCore.Builder; |
|||
using Microsoft.AspNetCore.Hosting; |
|||
using Microsoft.Extensions.Configuration; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Hosting; |
|||
using OnvifWebServer.Extensions; |
|||
|
|||
namespace OnvifWebServer |
|||
{ |
|||
public class Startup |
|||
{ |
|||
public Startup(IConfiguration configuration) |
|||
{ |
|||
Configuration = configuration; |
|||
} |
|||
|
|||
public IConfiguration Configuration { get; } |
|||
|
|||
// This method gets called by the runtime. Use this method to add services to the container.
|
|||
public void ConfigureServices(IServiceCollection services) |
|||
{ |
|||
services.AddControllers().AddInject().AddUnifyResult<RESTfulResultProvider>(); // 添加 AddInject();
|
|||
} |
|||
|
|||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
|||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) |
|||
{ |
|||
if (env.IsDevelopment()) |
|||
{ |
|||
app.UseDeveloperExceptionPage(); |
|||
} |
|||
|
|||
app.UseHttpsRedirection(); |
|||
|
|||
app.UseRouting(); |
|||
|
|||
app.UseAuthorization(); |
|||
|
|||
// 添加这一行,如果是 MVC和API共存项目,无需添加 string.Empty
|
|||
app.UseInject(string.Empty); |
|||
|
|||
app.UseEndpoints(endpoints => |
|||
{ |
|||
endpoints.MapControllers(); |
|||
}); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,9 @@ |
|||
{ |
|||
"Logging": { |
|||
"LogLevel": { |
|||
"Default": "Information", |
|||
"Microsoft": "Warning", |
|||
"Microsoft.Hosting.Lifetime": "Information" |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
{ |
|||
"Logging": { |
|||
"LogLevel": { |
|||
"Default": "Information", |
|||
"Microsoft": "Warning", |
|||
"Microsoft.Hosting.Lifetime": "Information" |
|||
} |
|||
}, |
|||
"AllowedHosts": "*", |
|||
// https://dotnetchina.gitee.io/furion/docs/settings/appsettings |
|||
"AppSettings": { |
|||
"InjectSpecificationDocument": true // 是否生成 swagger |
|||
}, |
|||
"DynamicApiControllerSettings": { |
|||
"KeepName": true, // 是否保持原有名称不处理 |
|||
"KeepVerb": true, // 是否保留动作方法请求谓词 |
|||
"LowercaseRoute": false, //是否采用小写路由 |
|||
"UrlParameterization": true // 方法参数 |
|||
} |
|||
} |
Loading…
Reference in new issue