using System;
using System.Runtime.InteropServices;
namespace NZSDK_CSharpSample
{
public partial class NZSDK : DynamicLibraryLoader
{
#region Constraints
public enum SDKKinds
{
RHINO = 0,
NRS,
NVR
}
public enum PtzDirection
{
LeftUp = 0,
Up,
RightUp,
Left,
Right,
LeftDown,
Down,
RightDown
}
public enum ZoomMethod
{
Tele = 0,
Wide
}
public enum ExportVideoFormat : int
{
Avi = 0,
Exe
}
public enum ExportImageFormat : int
{
Bmp = 0,
Png,
Jpg,
Tif
}
#endregion
#region Fields
IntPtr ptrHandle;
SDKKinds sdkKind;
#endregion
#region Constructors
public NZSDK(SDKKinds kind)
: base()
{
sdkKind = kind;
releaseFileName = "NZSDK.dll";
if (Load())
Create();
}
#endregion
#region Properties
public bool IsCreated
{
get
{
return (ptrHandle != IntPtr.Zero);
}
}
public SDKKinds SDKKind
{
get { return sdkKind; }
}
protected IntPtr SdkHandle
{
get
{
if (ptrHandle != IntPtr.Zero)
return ptrHandle;
switch (sdkKind)
{
case SDKKinds.RHINO:
ptrHandle = _NZCreateEx(SessionTypes.Live, Models.Rhino);
break;
case SDKKinds.NRS:
ptrHandle = _NZCreateEx(SessionTypes.Live, Models.Leopard);
break;
case SDKKinds.NVR:
ptrHandle = _NZVMSCreate();
break;
}
return ptrHandle;
}
}
#endregion
#region Private / Protected Methods
protected void Create()
{
Release();
switch (sdkKind)
{
case SDKKinds.RHINO:
ptrHandle = _NZCreateEx(SessionTypes.Live, Models.Rhino);
break;
case SDKKinds.NRS:
ptrHandle = _NZCreateEx(SessionTypes.Live, Models.Leopard);
break;
case SDKKinds.NVR:
ptrHandle = _NZVMSCreate();
break;
}
}
protected void Release()
{
if (ptrHandle == IntPtr.Zero)
return;
Disconnect();
switch (sdkKind)
{
case SDKKinds.RHINO:
case SDKKinds.NRS:
_NZDelete(ptrHandle);
break;
case SDKKinds.NVR:
_NZVMSDelete(ptrHandle);
break;
}
ptrHandle = IntPtr.Zero;
}
protected bool Command(Commands command)
{
return Command(command, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
protected bool Command(Commands command, IntPtr arg1)
{
return Command(command, arg1, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
protected bool Command(Commands command, IntPtr arg1, IntPtr arg2)
{
return Command(command, arg1, arg2, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
}
protected bool Command(Commands command, IntPtr arg1, IntPtr arg2, IntPtr arg3)
{
return Command(command, arg1, arg2, arg3, IntPtr.Zero, IntPtr.Zero);
}
protected bool Command(Commands command, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4)
{
return Command(command, arg1, arg2, arg3, arg4, IntPtr.Zero);
}
protected bool Command(Commands command, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5)
{
switch (sdkKind)
{
case SDKKinds.RHINO:
case SDKKinds.NRS:
return _NZCommand(SdkHandle, command, arg1, arg2, arg3, arg4, arg5);
case SDKKinds.NVR:
return _NZVMSCommand(SdkHandle, command, arg1, arg2, arg3, arg4, arg5);
}
return false;
}
#endregion
#region Public Methods
public bool Connect(string address, string port, string loginId, string password)
{
IntPtr ptrAddress = Marshal.StringToHGlobalUni(address);
IntPtr ptrLoginId = Marshal.StringToHGlobalUni(loginId);
IntPtr ptrPassword = Marshal.StringToHGlobalUni(password);
bool bResult = false;
switch (sdkKind)
{
case SDKKinds.RHINO:
case SDKKinds.NRS:
{
IntPtr ptrPort = Marshal.StringToHGlobalUni(port);
bResult = Command(Commands.Connect, ptrAddress, ptrPort, ptrLoginId, ptrPassword);
Marshal.FreeHGlobal(ptrPort);
}
break;
case SDKKinds.NVR:
bResult = Command(Commands.Connect, ptrAddress, new IntPtr(Int32.Parse(port)), ptrLoginId, ptrPassword);
break;
}
Marshal.FreeHGlobal(ptrAddress);
Marshal.FreeHGlobal(ptrLoginId);
Marshal.FreeHGlobal(ptrPassword);
return bResult;
}
public void Disconnect()
{
Command(Commands.Disconnect);
}
public bool GetDatas(VmsDataTypes type, ref string data)
{
IntPtr ptrLength = Marshal.AllocHGlobal(4);
Marshal.WriteInt32(ptrLength, 0);
GCHandle gch = GCHandle.Alloc(IntPtr.Size, GCHandleType.Pinned);
IntPtr ppUnmanagedIntegerArray = (IntPtr)gch.AddrOfPinnedObject();
bool result = Command(Commands.GetDatas, new IntPtr((int)type), ppUnmanagedIntegerArray, ptrLength);
int nLength = Marshal.ReadInt32(ptrLength);
IntPtr ptrBuffer = Marshal.ReadIntPtr(ppUnmanagedIntegerArray);
data = Marshal.PtrToStringAnsi(ptrBuffer);
_NZVMSReleaseData(ptrBuffer);
gch.Free();
Marshal.FreeHGlobal(ptrLength);
return result;
}
public bool OpenVideo(int channel, int streamNumber, IntPtr ptrWindowHandle)
{
return Command(Commands.OpenVideo, new IntPtr(channel), new IntPtr(streamNumber), new IntPtr(ptrWindowHandle == IntPtr.Zero ? 0 : 1), ptrWindowHandle);
}
public void CloseVideo(int channel, int streamNumber)
{
Command(Commands.CloseVideo, new IntPtr(channel), new IntPtr(streamNumber));
}
public void ViewResize(int channel, int streamNumber)
{
Command(Commands.ViewResize, new IntPtr(channel), new IntPtr(streamNumber));
}
public void ViewShowSelection(int channel, int streamNumber, bool visible)
{
Command(Commands.ViewShowSelection, new IntPtr(channel), new IntPtr(streamNumber), new IntPtr(Convert.ToInt32(visible)));
}
public void ViewShowName(int channel, int streamNumber, string name, int fontHeight)
{
IntPtr ptrName = Marshal.StringToHGlobalUni(name);
Command(Commands.ViewShowName, new IntPtr(channel), new IntPtr(streamNumber), ptrName, new IntPtr(fontHeight));
Marshal.FreeHGlobal(ptrName);
}
public void PanTiltControl(PtzDirection direction, int channel, int speed)
{
switch (direction)
{
case PtzDirection.LeftUp:
Command(Commands.PtzMoveLeftUp, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.Up:
Command(Commands.PtzMoveUp, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.RightUp:
Command(Commands.PtzMoveRightUp, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.Left:
Command(Commands.PtzMoveLeft, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.Right:
Command(Commands.PtzMoveRight, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.LeftDown:
Command(Commands.PtzMoveLeftDown, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.Down:
Command(Commands.PtzMoveDown, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case PtzDirection.RightDown:
Command(Commands.PtzMoveRightDown, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
}
}
public void ZoomControl(ZoomMethod method, int channel, int speed)
{
switch (method)
{
case ZoomMethod.Tele:
Command(Commands.PtzZoomTele, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
case ZoomMethod.Wide:
Command(Commands.PtzZoomWide, new IntPtr(channel), new IntPtr(1), new IntPtr(speed), new IntPtr(speed == 0 ? 1 : 0));
break;
}
}
public void SetPtzPreset(int channel, int preset)
{
Command(Commands.PtzSetPreset, new IntPtr(channel), new IntPtr(1), new IntPtr(preset));
}
public void MovePtzPreset(int channel, int preset)
{
Command(Commands.PtzMovePreset, new IntPtr(channel), new IntPtr(1), new IntPtr(preset));
}
public void StartPresetTour(int channel)
{
Command(Commands.PtzTourStart, new IntPtr(channel), new IntPtr(1));
}
public void StopPresetTour(int channel)
{
Command(Commands.PtzTourStop, new IntPtr(channel), new IntPtr(1));
}
public bool OpenAudio(int channel, int streamNumber, bool play)
{
return Command(Commands.OpenAudio, new IntPtr(channel), new IntPtr(streamNumber), new IntPtr(Convert.ToInt32(play)));
}
public void CloseAudio(int channel, int streamNumber)
{
Command(Commands.CloseAudio, new IntPtr(channel), new IntPtr(streamNumber));
}
public PtzPositionSpecification GetPtzPositionSpecification(int channel)
{
PtzPositionSpecification spec = new PtzPositionSpecification();
IntPtr ptrSpec = Marshal.AllocHGlobal(Marshal.SizeOf(spec));
bool result = Command(Commands.PtzGetPositionSpecification, new IntPtr(channel), new IntPtr(1), ptrSpec);
if (result)
spec = (PtzPositionSpecification)Marshal.PtrToStructure(ptrSpec, typeof(PtzPositionSpecification));
Marshal.FreeHGlobal(ptrSpec);
return spec;
}
public PtzPosition GetPtzPosition(int channel)
{
PtzPosition position = new PtzPosition();
IntPtr ptrPosition = Marshal.AllocHGlobal(Marshal.SizeOf(position));
bool result = Command(Commands.PtzGetPosition, new IntPtr(channel), new IntPtr(1), ptrPosition);
if (result)
position = (PtzPosition)Marshal.PtrToStructure(ptrPosition, typeof(PtzPosition));
Marshal.FreeHGlobal(ptrPosition);
return position;
}
public void SetPtzPosition(int channel, PtzPosition position)
{
IntPtr ptrPosition = Marshal.AllocHGlobal(Marshal.SizeOf(position));
Marshal.StructureToPtr(position, ptrPosition, true);
bool result = Command(Commands.PtzSetPosition, new IntPtr(channel), new IntPtr(1), ptrPosition);
Marshal.FreeHGlobal(ptrPosition);
}
public void OpenEvent(string channels)
{
IntPtr ptrChannels = Marshal.StringToHGlobalUni(channels);
Command(Commands.OpenEvent, ptrChannels);
Marshal.FreeHGlobal(ptrChannels);
}
public void CloseEvent()
{
Command(Commands.CloseEvent);
}
public bool GetStream(NZSDK.SessionTypes session, int nrsId, IntPtr ptrStream)
{
if (SDKKind != SDKKinds.NVR)
return false;
return Command(Commands.GetStream, new IntPtr(nrsId), new IntPtr((int)session), ptrStream);
}
public bool GetStream(IntPtr ptrStream)
{
if (SDKKind == SDKKinds.NVR)
return false;
return Command(Commands.GetStream, ptrStream);
}
public void ReleaseStream(IntPtr ptrStream)
{
Command(Commands.ReleaseStream, ptrStream);
}
public bool StartTalk(int channel, int streamNumber)
{
return Command(Commands.StartTalk, new IntPtr(channel), new IntPtr(streamNumber));
}
public void StopTalk(int channel, int streamNumber)
{
Command(Commands.StopTalk, new IntPtr(channel), new IntPtr(streamNumber));
}
public bool StartSendWave(int channel, int streamNumber, string waveFilePath)
{
IntPtr ptrFilePath = Marshal.StringToHGlobalUni(waveFilePath);
bool result = Command(Commands.SendWave, new IntPtr(channel), new IntPtr(streamNumber), ptrFilePath, new IntPtr(1));
Marshal.FreeHGlobal(ptrFilePath);
return result;
}
public void StopSendWave(int channel, int streamNumber)
{
IntPtr ptrFilePath = Marshal.StringToHGlobalUni(string.Empty);
Command(Commands.SendWave, new IntPtr(channel), new IntPtr(streamNumber), ptrFilePath, new IntPtr(0));
Marshal.FreeHGlobal(ptrFilePath);
}
public bool OpenPlaybackVideo(int deviceId, IntPtr ptrWindowHandle)
{
return Command(Commands.PlaybackOpenVideo, new IntPtr(deviceId), IntPtr.Zero, new IntPtr(ptrWindowHandle != IntPtr.Zero ? 1 : 0), ptrWindowHandle);
}
public void ClosePlaybackVideo(int deviceId)
{
Command(Commands.PlaybackCloseVideo, new IntPtr(deviceId));
}
public void PlaybackPause(int deviceId)
{
Command(Commands.PlaybackPause, new IntPtr(deviceId));
}
public bool PlaybackPlayForward(int deviceId, DateTime playTime, int speed, bool refresh)
{
string argument = String.Format("refresh={0}&speed={1}&method=forward&date={2}&time={3}",
refresh ? 1 : 0, speed, playTime.ToString("yyyy-MM-dd"), playTime.ToString("HH-mm-ss"));
IntPtr ptrArgument = Marshal.StringToHGlobalUni(argument);
bool result = Command(Commands.PlaybackPlay, new IntPtr(deviceId), IntPtr.Zero, ptrArgument);
Marshal.FreeHGlobal(ptrArgument);
return result;
}
public bool PlaybackPlayBackward(int deviceId, DateTime playTime, int speed, bool refresh)
{
string argument = String.Format("refresh={0}&speed={1}&method=backward&date={2}&time={3}",
refresh ? 1 : 0, speed, playTime.ToString("yyyy-MM-dd"), playTime.ToString("HH-mm-ss"));
IntPtr ptrArgument = Marshal.StringToHGlobalUni(argument);
bool result = Command(Commands.PlaybackPlay, new IntPtr(deviceId), IntPtr.Zero, ptrArgument);
Marshal.FreeHGlobal(ptrArgument);
return result;
}
public bool StartExportVideo(int deviceId, ExportVideoFormat format, DateTime fromTime, DateTime toTime, string path, IntPtr ptrHandler, IntPtr ptrHandlerParam)
{
string option = "\r\n";
option += String.Format("\t{0}\r\n", (int)format);
option += String.Format("\t{0}\r\n", fromTime.ToString("yyyyMMddHHmmss"));
option += String.Format("\t{0}\r\n", toTime.ToString("yyyyMMddHHmmss"));
option += String.Format("\t{0}\r\n", path);
option += "\t2104533975\r\n";
option += "\t60\r\n";
option += String.Format("\t{0}Camera_{0}_{1}_{2}\r\n",
deviceId, fromTime.ToString("yyyyMMddHHmmss"), toTime.ToString("yyyyMMddHHmmss"));
option += "\r\n";
IntPtr ptrOption = Marshal.StringToHGlobalUni(option);
bool result = Command(Commands.ExportVideo, ptrOption, ptrHandler, ptrHandlerParam);
Marshal.FreeHGlobal(ptrOption);
return result;
}
public void StopExportVideo()
{
Command(Commands.CancelExportVideo);
}
public bool ExportImage(int deviceId, ExportImageFormat format, DateTime fromTime, DateTime toTime, string path, IntPtr ptrHandler, IntPtr ptrHandlerParam)
{
string option = "\r\n";
option += String.Format("\t{0}\r\n", fromTime.ToString("yyyyMMddHHmmss"));
option += String.Format("\t{0}\r\n", toTime.ToString("yyyyMMddHHmmss"));
option += String.Format("\t{0}\r\n", path);
option += String.Format("\t{0}\r\n", format.ToString().ToLower());
option += String.Format("\t{0}Camera_{0}_{1}\r\n",
deviceId, fromTime.ToString("yyyyMMddHHmmss"));
option += "\r\n";
IntPtr ptrOption = Marshal.StringToHGlobalUni(option);
bool result = Command(Commands.ExportImage, ptrOption, ptrHandler, ptrHandlerParam);
Marshal.FreeHGlobal(ptrOption);
return result;
}
public override void Dispose()
{
Release();
base.Dispose();
}
#endregion
}
}