Browse Source

[feat] 对接测试完成

master
fajiao 1 year ago
parent
commit
6f67ede883
  1. 12
      EC.Util/CameraSDK/Common/CameraException.cs
  2. 20
      EC.Util/CameraSDK/Common/CameraStruct.cs
  3. 20
      EC.Util/CameraSDK/Common/ICameraSDK.cs
  4. 1512
      EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs
  5. 190
      EC.Util/CameraSDK/DaHua/DaHuaSDK.cs
  6. 25
      EC.Util/CameraSDK/HiK/HiKOriSDK.cs
  7. 49
      EC.Util/CameraSDK/HiK/HiKSDK.cs
  8. 221
      EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs
  9. 138
      EC.Util/CameraSDK/YuShi/YuShiSDK.cs
  10. 52
      EC.Util/EC.Util.csproj
  11. 2
      EC.Util/Port/SerialPortParam.cs
  12. BIN
      EC.Util/libs/dh-win64/dhnetsdk.dll
  13. 0
      EC.Util/libs/hk-win64/AudioRender.dll
  14. 0
      EC.Util/libs/hk-win64/HCCore.dll
  15. 0
      EC.Util/libs/hk-win64/HCNetSDK.dll
  16. 0
      EC.Util/libs/hk-win64/HCNetSDKCom/HCCoreDevCfg.dll
  17. 0
      EC.Util/libs/hk-win64/HCNetSDKCom/HCPreview.dll
  18. 0
      EC.Util/libs/hk-win64/HXVA.dll
  19. 0
      EC.Util/libs/hk-win64/HmMerge.dll
  20. 0
      EC.Util/libs/hk-win64/PlayCtrl.dll
  21. 0
      EC.Util/libs/hk-win64/SuperRender.dll
  22. 0
      EC.Util/libs/hk-win64/libcrypto-1_1-x64.dll
  23. 0
      EC.Util/libs/hk-win64/libssl-1_1-x64.dll
  24. BIN
      EC.Util/libs/ys-win64/NetDEVSDK.dll
  25. 1
      JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessage.cs
  26. 4
      JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessageHelper.cs
  27. 31
      JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
  28. 8
      JiLinApp.Docking/Alarm/AlarmCodeHelper.cs
  29. 28
      JiLinApp.Docking/FenceAlarm/Entity/SectorState.cs
  30. 12
      JiLinApp.Docking/FenceAlarm/Entity/UdpAlarmHostDevice.cs
  31. 31
      JiLinApp.Docking/FenceAlarm/Entity/UdpDatagramReceivedEventArgs.cs
  32. 2
      JiLinApp.Docking/FenceAlarm/Entity/UdpManagerConfig.cs
  33. 106
      JiLinApp.Docking/FenceAlarm/Service/Udp.cs
  34. 151
      JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs
  35. 4
      JiLinApp.Docking/JiLinApp.Docking.csproj
  36. 6
      JiLinApp.Docking/Ptz/DCamera.cs
  37. 4
      JiLinApp.Docking/Ptz/PelcoD.cs
  38. 4
      JiLinApp.Docking/Ptz/PelcoP.cs
  39. 166
      JiLinApp.Docking/Ptz/PtzCmd.cs
  40. 3
      JiLinApp.Docking/Ptz/PtzConfig.cs
  41. 74
      JiLinApp.Docking/VibrateAlarm/Entity/ClientMessage.cs
  42. 97
      JiLinApp.Docking/VibrateAlarm/Entity/DataMessage.cs
  43. 6
      JiLinApp.Docking/VibrateAlarm/Entity/DataRequest.cs
  44. 6
      JiLinApp.Docking/VibrateAlarm/Entity/SensorState.cs
  45. 2
      JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHostMessage.cs
  46. 12
      JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHostTable.cs
  47. 17
      JiLinApp.Docking/VibrateAlarm/Entity/TcpSectionTable.cs
  48. 20
      JiLinApp.Docking/VibrateAlarm/Entity/TcpSensorTable.cs
  49. 468
      JiLinApp.Docking/VibrateAlarm/Service/AsyncTcpServer.cs
  50. 15
      JiLinApp.Docking/VibrateAlarm/Service/TcpClientConnectedEventArgs.cs
  51. 15
      JiLinApp.Docking/VibrateAlarm/Service/TcpClientDisconnectedEventArgs.cs
  52. 22
      JiLinApp.Docking/VibrateAlarm/Service/TcpDatagramReceivedEventArgs.cs
  53. 856
      JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs
  54. 4410
      JiLinApp.Docking/config/alarmcode.json
  55. 10
      JiLinApp/Components/CameraRealPlay.xaml
  56. 29
      JiLinApp/Components/CameraRealPlay.xaml.cs
  57. 10
      JiLinApp/Components/HikRealPlay.xaml
  58. 1
      JiLinApp/Core/Global.cs
  59. 11
      JiLinApp/Core/LogUnit.cs
  60. 1
      JiLinApp/JiLinApp.csproj
  61. 2
      JiLinApp/Mvvm/ViewModelBase.cs
  62. 8
      JiLinApp/Pages/FenceServerManage/Main.xaml
  63. 9
      JiLinApp/Pages/FenceServerManage/Main.xaml.cs
  64. 2
      JiLinApp/Pages/Main/MainWindow.xaml
  65. 2
      JiLinApp/Pages/PtzManage/Main.xaml
  66. 139
      JiLinApp/Pages/PtzManage/Main.xaml.cs
  67. 10
      JiLinApp/Pages/PtzManage/MainViewModel.cs
  68. 5
      JiLinApp/Pages/VibrateServerManage/Main.xaml
  69. 11
      JiLinApp/Pages/VibrateServerManage/Main.xaml.cs
  70. 4
      JiLinApp/Pages/VibrateServerManage/MainViewModel.cs
  71. 6
      JiLinApp/Properties/AssemblyInfo.cs
  72. 13
      JiLinApp/config/config.json
  73. 3
      JiLinApp/config/log4net.config

12
EC.Util/CameraSDK/Common/CameraException.cs

@ -21,7 +21,7 @@ public class CameraException : Exception
protected class CameraExceptionObj
{
public CameraManufactor Manufactor { get; set; }
public CameraInfo? CameraInfo { get; set; }
public int Code { get; set; }
@ -30,27 +30,27 @@ public class CameraException : Exception
public override string? ToString()
{
StringBuilder builder = new();
builder.Append($"Manufactor:{Manufactor}, Code:{Code}");
builder.Append($"Ip:{CameraInfo?.Ip}, Manufactor:{CameraInfo?.GetManufactor}, Code:{Code}");
if (!string.IsNullOrEmpty(Msg)) builder.Append($", Msg:{Msg}");
return builder.ToString();
}
}
public static CameraException New(CameraManufactor manufactor, int code)
public static CameraException New(CameraInfo cameraInfo, int code)
{
CameraExceptionObj obj = new()
{
Manufactor = manufactor,
CameraInfo = cameraInfo,
Code = code
};
return new CameraException(obj.ToString());
}
public static CameraException New(CameraManufactor manufactor, int code, string msg)
public static CameraException New(CameraInfo cameraInfo, int code, string msg)
{
CameraExceptionObj obj = new()
{
Manufactor = manufactor,
CameraInfo = cameraInfo,
Code = code,
Msg = msg
};

20
EC.Util/CameraSDK/Common/CameraStruct.cs

@ -12,6 +12,14 @@ public class CameraInfo
/// </summary>
public int Manufactor { get; set; }
public CameraManufactor GetManufactor
{
get
{
return (CameraManufactor)Manufactor;
}
}
/// <summary>
/// ip 地址
/// </summary>
@ -37,8 +45,7 @@ public class CameraInfo
public static CameraInfo New(int manufactor, string ip, int port, string userName, string password)
{
CameraInfo info = new() { Manufactor = manufactor, Ip = ip, Port = port, UserName = userName, Password = password };
if (port <= 0)
throw new Exception("Camera manufactor not support.");
if (port <= 0) throw new Exception("Camera manufactor not support.");
return info;
}
@ -52,9 +59,8 @@ public class CameraInfo
CameraManufactor.YuShi => (int)CameraPort.YuShi,
_ => -1,
};
if (port <= 0) throw new Exception("Camera manufactor not support.");
info.Port = port;
if (port <= 0)
throw new Exception("Camera manufactor not support.");
return info;
}
}
@ -65,8 +71,8 @@ public class CameraInfo
public enum CameraManufactor : int
{
HiK = 1,
DaHua,
YuShi,
DaHua = 2,
YuShi = 3,
}
/// <summary>
@ -108,4 +114,4 @@ public class PtzInfo
{
return new PtzInfo(pan, tilt, zoom);
}
}
}

20
EC.Util/CameraSDK/Common/ICameraSDK.cs

@ -4,7 +4,7 @@ public abstract class ICameraSDK
{
#region Attr
protected CameraInfo CameraInfo { get; set; }
public CameraInfo CameraInfo { get; }
#endregion Attr
@ -40,7 +40,7 @@ public abstract class ICameraSDK
#endregion Base Method
#region Main Method
#region Ptz Method
/// <summary>
/// 获取 ptz
@ -54,5 +54,19 @@ public abstract class ICameraSDK
/// <returns></returns>
public abstract bool TryGetPtzInfo(out PtzInfo ptzInfo);
#endregion Main Method
public abstract bool PtzMove(int cmd, int stop, int speed);
public abstract bool PtzPreset(int cmd, int presetId);
#endregion Ptz Method
#region Video Method
public abstract void StartPlay(IntPtr hwnd);
public abstract void StopPlay();
public abstract bool IsPlaying();
#endregion Video Method
}

1512
EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs

File diff suppressed because it is too large

190
EC.Util/CameraSDK/DaHua/DaHuaSDK.cs

@ -0,0 +1,190 @@
using System.Runtime.InteropServices;
namespace EC.Util.CameraSDK;
public class DaHuaSDK : ICameraSDK
{
#region Attr
private IntPtr LoginId { get; set; } = IntPtr.Zero;
private IntPtr RealplayHandle { get; set; } = IntPtr.Zero;
#endregion Attr
public DaHuaSDK(CameraInfo cameraInfo) : base(cameraInfo)
{
}
#region Base Method
public override bool Init()
{
bool ret = ConnectSuccess();
if (ret) return true;
DaHuaOriSDK.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY stuInParam = new();
stuInParam.dwSize = (uint)Marshal.SizeOf(stuInParam);
stuInParam.szIP = CameraInfo.Ip;
stuInParam.nPort = CameraInfo.Port;
stuInParam.szUserName = CameraInfo.UserName;
stuInParam.szPassword = CameraInfo.Password;
stuInParam.emSpecCap = DaHuaOriSDK.EM_LOGIN_SPAC_CAP_TYPE.TCP;
stuInParam.pCapParam = IntPtr.Zero;
DaHuaOriSDK.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY stuOutParam = new();
stuOutParam.dwSize = (uint)Marshal.SizeOf(stuOutParam);
LoginId = DaHuaOriSDK.CLIENT_LoginWithHighLevelSecurity(ref stuInParam, ref stuOutParam);
ret = ConnectSuccess();
if (ret) DaHuaOriSDK.CLIENT_SetAutoReconnect(delegate (IntPtr lLoginID, IntPtr pchDVRIP, int nDVRPort, IntPtr dwUser)
{
LoginId = lLoginID;
}, IntPtr.Zero);
return ret;
}
public override bool Destory()
{
bool ret = ConnectSuccess();
if (!ret) return true;
ret = DaHuaOriSDK.CLIENT_Logout(LoginId);
if (ret) LoginId = IntPtr.Zero;
return ret;
}
public override bool ConnectSuccess()
{
return LoginId != IntPtr.Zero;
}
public override void BuildException()
{
uint errCode = (uint)DaHuaOriSDK.CLIENT_GetLastError();
if (errCode == 0) return;
errCode -= 0x80000000;
throw CameraException.New(CameraInfo, (int)errCode);
}
#endregion Base Method
#region Ptz Method
private static class GPIParams
{
public static int Size { get; private set; }
public static Type Type { get; private set; }
static GPIParams()
{
DaHuaOriSDK.DH_PTZ_LOCATION_INFO info = new();
Size = Marshal.SizeOf(info);
Type = info.GetType();
}
}
public override PtzInfo GetPtzInfo()
{
bool ret = ConnectSuccess();
if (!ret) return PtzInfo.Default;
DaHuaOriSDK.DH_PTZ_LOCATION_INFO entity = new();
int nBufLen = GPIParams.Size;
int pRetLen = 0;
IntPtr ptrBuf = Marshal.AllocHGlobal(GPIParams.Size);
Marshal.StructureToPtr(entity, ptrBuf, true);
try
{
ret = DaHuaOriSDK.CLIENT_QueryDevState(LoginId, (int)DaHuaOriSDK.EM_DEVICE_STATE.PTZ_LOCATION, ptrBuf, nBufLen, ref pRetLen, 3000);
if (!ret) { BuildException(); return PtzInfo.Default; }
object? objBuf = Marshal.PtrToStructure(ptrBuf, GPIParams.Type);
if (objBuf == null) return PtzInfo.Default;
entity = (DaHuaOriSDK.DH_PTZ_LOCATION_INFO)objBuf;
return PtzInfo.New(entity.nPTZPan, entity.nPTZTilt, entity.nPTZZoom);
}
finally
{
Marshal.FreeHGlobal(ptrBuf);
}
}
public override bool TryGetPtzInfo(out PtzInfo ptzInfo)
{
bool ret = ConnectSuccess();
if (!ret) { ptzInfo = PtzInfo.Default; return false; }
DaHuaOriSDK.DH_PTZ_LOCATION_INFO entity = new();
int nBufLen = GPIParams.Size;
int pRetLen = 0;
IntPtr ptrBuf = Marshal.AllocHGlobal(GPIParams.Size);
Marshal.StructureToPtr(entity, ptrBuf, true);
try
{
ret = DaHuaOriSDK.CLIENT_QueryDevState(LoginId, (int)DaHuaOriSDK.EM_DEVICE_STATE.PTZ_LOCATION, ptrBuf, nBufLen, ref pRetLen, 3000);
if (!ret) { BuildException(); ptzInfo = PtzInfo.Default; return false; }
object? objBuf = Marshal.PtrToStructure(ptrBuf, GPIParams.Type);
if (objBuf == null) { ptzInfo = PtzInfo.Default; return false; }
entity = (DaHuaOriSDK.DH_PTZ_LOCATION_INFO)objBuf;
ptzInfo = PtzInfo.New(entity.nPTZPan, entity.nPTZTilt, entity.nPTZZoom);
return true;
}
finally
{
Marshal.FreeHGlobal(ptrBuf);
}
}
public override bool PtzMove(int cmd, int stop, int speed)
{
//if (!ConnectSuccess()) return false;
//if (stop == 1) cmd = YuShiOriSDK.ALLSTOP;
//int channel = 1;
//int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed);
//return flag == YuShiOriSDK.TRUE;
if (!ConnectSuccess()) return false;
//DaHuaOriSDK.CLIENT_DHPTZControlEx2();
return true;
}
public override bool PtzPreset(int cmd, int presetId)
{
//if (!ConnectSuccess()) return false;
//int channel = 1;
//int flag = YuShiOriSDK.NETDEV_PTZPreset_Other(LoginId, channel, cmd, Array.Empty<byte>(), presetId);
//return flag == YuShiOriSDK.TRUE;
if (!ConnectSuccess()) return false;
return true;
}
#endregion Ptz Method
#region Video Method
public override void StartPlay(IntPtr hwnd)
{
if (!ConnectSuccess() || IsPlaying()) return;
int channel = 1;
RealplayHandle = DaHuaOriSDK.CLIENT_RealPlayEx(LoginId, channel, hwnd, DaHuaOriSDK.EM_RealPlayType.Realplay);
if (RealplayHandle == IntPtr.Zero) BuildException();
}
public override void StopPlay()
{
if (!IsPlaying()) return;
bool flag = DaHuaOriSDK.CLIENT_StopRealPlayEx(RealplayHandle);
RealplayHandle = IntPtr.Zero;
if (flag) BuildException();
}
public override bool IsPlaying()
{
return RealplayHandle != IntPtr.Zero;
}
#endregion Video Method
}

25
EC.Util/CameraSDK/HiK/HiKOriSDK.cs

@ -6,7 +6,7 @@ public static class HiKOriSDK
{
#region Lib Attr
public const string LibHcNetSDK = @"./libs/hik-win64/HCNetSDK.dll";
public const string LibHcNetSDK = @"./libs/hk-win64/HCNetSDK.dll";
#endregion Lib Attr
@ -42,6 +42,9 @@ public static class HiKOriSDK
public const int SERIALNO_LEN = 48; //序列号长度
public const int PtzSpeedMin = 1;
public const int PtzSpeedMax = 7;
#region 用于 NET_DVR_SetDVRConfig 和 NET_DVR_GetDVRConfig
public const int NET_DVR_SET_PTZPOS = 292; //云台设置PTZ位置
@ -70,10 +73,10 @@ public static class HiKOriSDK
#region SDK Struct
//NET_DVR_Login()参数结构
[StructLayoutAttribute(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_DEVICEINFO
{
[MarshalAsAttribute(
[MarshalAs(
UnmanagedType.ByValArray,
SizeConst = SERIALNO_LEN,
ArraySubType = UnmanagedType.I1
@ -89,10 +92,10 @@ public static class HiKOriSDK
}
//NET_DVR_Login_V30()参数结构
[StructLayoutAttribute(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_DEVICEINFO_V30
{
[MarshalAsAttribute(
[MarshalAs(
UnmanagedType.ByValArray,
SizeConst = SERIALNO_LEN,
ArraySubType = UnmanagedType.I1
@ -158,7 +161,7 @@ public static class HiKOriSDK
// byLanguageType 等于0 表示 老设备
// byLanguageType & 0x1表示支持中文
// byLanguageType & 0x2表示支持英文
[MarshalAsAttribute(
[MarshalAs(
UnmanagedType.ByValArray,
SizeConst = 9,
ArraySubType = UnmanagedType.I1
@ -167,7 +170,7 @@ public static class HiKOriSDK
}
//球机位置信息
[StructLayoutAttribute(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_PTZPOS
{
public ushort wAction; //获取时该字段无效
@ -177,7 +180,7 @@ public static class HiKOriSDK
}
//球机范围信息
[StructLayoutAttribute(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_PTZSCOPE
{
public ushort wPanPosMin; //水平参数min
@ -196,7 +199,7 @@ public static class HiKOriSDK
public const int PLAN_ID_LEN = 32;
//预览V40接口
[StructLayoutAttribute(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_PREVIEWINFO
{
public Int32 lChannel; //通道号
@ -207,7 +210,7 @@ public static class HiKOriSDK
public bool bPassbackRecord; //0-不启用录像回传,1启用录像回传
public byte byPreviewMode; //预览模式,0-正常预览,1-延迟预览
[MarshalAsAttribute(
[MarshalAs(
UnmanagedType.ByValArray,
SizeConst = STREAM_ID_LEN,
ArraySubType = UnmanagedType.I1
@ -220,7 +223,7 @@ public static class HiKOriSDK
public uint dwDisplayBufNum; //播放库播放缓冲区最大缓冲帧数,范围1-50,置0时默认为1
public byte byNPQMode; //NPQ是直连模式,还是过流媒体 0-直连 1-过流媒体
[MarshalAsAttribute(
[MarshalAs(
UnmanagedType.ByValArray,
SizeConst = 215,
ArraySubType = UnmanagedType.I1

49
EC.Util/CameraSDK/HiK/HiKSDK.cs

@ -8,7 +8,7 @@ public class HiKSDK : ICameraSDK
private int LoginId { get; set; } = -1;
private int realplayHandle { get; set; } = -1;
private int RealplayHandle { get; set; } = -1;
#endregion Attr
@ -50,12 +50,12 @@ public class HiKSDK : ICameraSDK
{
uint errCode = HiKOriSDK.NET_DVR_GetLastError();
if (errCode == 0) return;
throw CameraException.New(CameraManufactor.HiK, (int)errCode);
throw CameraException.New(CameraInfo, (int)errCode);
}
#endregion Base Method
#region Main Method
#region Ptz Method
private static class GPIParams
{
@ -121,34 +121,27 @@ public class HiKSDK : ICameraSDK
}
}
#endregion Main Method
#region Ptz Method
public void PtzMove(uint[] args)
public override bool PtzMove(int cmd, int stop, int speed)
{
bool ret = ConnectSuccess();
if (!ret || args == null || args.Length < 3) return;
if (!ConnectSuccess()) return false;
int lChannel = 1;
HiKOriSDK.NET_DVR_PTZControlWithSpeed_Other(LoginId, lChannel, args[0], args[1], args[2]);
return HiKOriSDK.NET_DVR_PTZControlWithSpeed_Other(LoginId, lChannel, (uint)cmd, (uint)stop, (uint)speed);
}
public void PtzPreset(uint[] args)
public override bool PtzPreset(int cmd, int presetId)
{
bool ret = ConnectSuccess();
if (!ret || args == null || args.Length < 2) return;
if (!ConnectSuccess()) return false;
int lChannel = 1;
HiKOriSDK.NET_DVR_PTZPreset_Other(LoginId, lChannel, args[0], args[1]);
return HiKOriSDK.NET_DVR_PTZPreset_Other(LoginId, lChannel, (uint)cmd, (uint)presetId);
}
#endregion Ptz Method
#region Video Method
public void StartPlay(IntPtr hwnd)
public override void StartPlay(IntPtr hwnd)
{
bool ret = ConnectSuccess();
if (!ret) return;
if (!ConnectSuccess() || IsPlaying()) return;
HiKOriSDK.NET_DVR_PREVIEWINFO previewInfo = new()
{
hPlayWnd = hwnd, //预览窗口
@ -161,17 +154,21 @@ public class HiKSDK : ICameraSDK
byPreviewMode = 0
};
IntPtr pUser = new(); //用户数据
realplayHandle = HiKOriSDK.NET_DVR_RealPlay_V40(LoginId, ref previewInfo, null, pUser);
if (realplayHandle < 0) BuildException();
RealplayHandle = HiKOriSDK.NET_DVR_RealPlay_V40(LoginId, ref previewInfo, null, pUser);
if (RealplayHandle < 0) BuildException();
}
public void StopPlay()
public override void StopPlay()
{
if (realplayHandle >= 0)
{
HiKOriSDK.NET_DVR_StopRealPlay(realplayHandle);
realplayHandle = -1;
}
if (!IsPlaying()) return;
bool flag = HiKOriSDK.NET_DVR_StopRealPlay(RealplayHandle);
RealplayHandle = -1;
if (!flag) BuildException();
}
public override bool IsPlaying()
{
return RealplayHandle >= 0;
}
#endregion Video Method

221
EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs

@ -0,0 +1,221 @@
using System.Runtime.InteropServices;
namespace EC.Util.CameraSDK;
public static class YuShiOriSDK
{
#region Lib Attr
public const string LibYsNetSDK = @"./libs/ys-win64/NetDEVSDK.dll";
#endregion Lib Attr
static YuShiOriSDK()
{
GlobalInit();
}
#region Global
public static bool InitSuccess { get; private set; }
public static bool GlobalInit()
{
if (InitSuccess) return true;
bool ret = NETDEV_Init();
InitSuccess = ret;
if (!ret) throw new Exception("YuShiOriSDK global init failure.");
return ret;
}
public static bool GlobalDestory()
{
if (!InitSuccess) return true;
bool ret = NETDEV_Cleanup();
if (ret) InitSuccess = false;
return ret;
}
#endregion Global
#region SDK Const
public const int TRUE = 1;
public const int FALSE = 0;
public const int PtzSpeedMin = 1;
public const int PtzSpeedMax = 9;
/* Common length */
public const int NETDEV_LEN_64 = 64;
public const int NETDEV_LEN_128 = 128;
public const int NETDEV_LEN_132 = 132;
public const int NETDEV_LEN_260 = 260;
/* NETDEV_PTZ_E */
public const int ZOOMTELE_STOP = 0x0301; /* Zoom in stop */
public const int ZOOMTELE = 0x0302; /* Zoom in */
public const int ZOOMWIDE_STOP = 0x0303; /* Zoom out stop */
public const int ZOOMWIDE = 0x0304; /* Zoom out */
public const int TILTUP = 0x0402; /* Tilt up */
public const int TILTDOWN = 0x0404; /* Tilt down */
public const int PANRIGHT = 0x0502; /* Pan right */
public const int PANLEFT = 0x0504; /* Pan left */
public const int LEFTUP = 0x0702; /* Move up left */
public const int LEFTDOWN = 0x0704; /* Move down left */
public const int RIGHTUP = 0x0802; /* Move up right */
public const int RIGHTDOWN = 0x0804; /* Move down right */
public const int ALLSTOP = 0x0901; /* All-stop command word */
public const int FOCUS_AND_IRIS_STOP = 0x0907; /* Focus & Iris-stop command word */
public const int MOVE_STOP = 0x0908; /* move stop command word */
public const int ZOOM_STOP = 0x0909; /* zoom stop command word */
/* NETDEV_PTZ_PRESETCMD_E */
public const int PRESET_SET = 0; /* Set preset */
public const int PRESET_CLE = 1; /* Clear preset */
public const int PRESET_GOTO = 2; /* Go to preset */
public enum NETDEV_LIVE_STREAM_INDEX_E : int
{
NETDEV_LIVE_STREAM_INDEX_MAIN = 0, /* Main stream */
NETDEV_LIVE_STREAM_INDEX_SUB = 1, /* Sub stream */
NETDEV_LIVE_STREAM_INDEX_THIRD = 2, /* Third stream */
NETDEV_LIVE_STREAM_INDEX_INVALID
}
public enum NETDEV_PROTOCAL_E : int
{
NETDEV_TRANSPROTOCAL_RTPUDP = 0, /* UDP */
NETDEV_TRANSPROTOCAL_RTPTCP = 1 /* TCP */
}
public enum NETDEV_PICTURE_FLUENCY_E
{
NETDEV_PICTURE_REAL = 0, /* Real-time first */
NETDEV_PICTURE_FLUENCY = 1, /* Fluency first */
NETDEV_PICTURE_BALANCE_NEW = 3, /* Balance */
NETDEV_PICTURE_RTMP_FLUENCY = 4, /* RTMP fluency first */
NETDEV_PICTURE_FLUENCY_INVALID = 0xff /* Invalid value */
}
#endregion SDK Const
#region SDK Struct
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_DEVICE_LOGIN_INFO_S
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_260)]
public string szIPAddr; /* IP地址/域名 */
public int dwPort; /* 端口号 */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_132)]
public string szUserName; /* 用户名 */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_128)]
public string szPassword; /* 密码 */
public int dwLoginProto; /* 登录协议, 参见NETDEV_LOGIN_PROTO_E */
public int dwDeviceType; /* 设备类型, 参见NETDEV_DEVICE_TYPE_E */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public byte[] byRes; /* Reserved */
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_SELOG_INFO_S
{
public int dwSELogCount;
public int dwSELogTime;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public byte[] byRes;
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_VIDEO_CHL_DETAIL_INFO_S
{
public int dwChannelID;
public int bPtzSupported; /* Whether ptz is supported */
public int enStatus; /* Channel status */
public int dwStreamNum; /* Number of streams */
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = NETDEV_LEN_64)]
public string szChnName; /* Device serial number */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public byte[] szReserve;
}
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PTZ_STATUS_S
{
public float fPanTiltX; /* 绝对水平坐标 Absolute horizontal coordinates*/
public float fPanTiltY; /* 绝对竖直坐标 Absolute vertical coordinates*/
public float fZoomX; /* 绝对聚焦倍数 Absolute multiples*/
public int enPanTiltStatus;/* 云台状态 PTZ Status*/
public int enZoomStatus; /* 聚焦状态 Focus Status*/
};
[StructLayout(LayoutKind.Sequential)]
public struct NETDEV_PREVIEWINFO_S
{
public int dwChannelID; /* ID Channel ID */
public int dwStreamType; /* #NETDEV_LIVE_STREAM_INDEX_E Stream type, see enumeration #NETDEV_LIVE_STREAM_INDEX_E */
public int dwLinkMode; /* #NETDEV_PROTOCAL_E Transport protocol, see enumeration #NETDEV_PROTOCAL_E */
public IntPtr hPlayWnd; /* Play window handle */
public int dwFluency; /* #NETDEV_PICTURE_FLUENCY_E image play fluency*/
public int dwStreamMode; /* #NETDEV_STREAM_MODE_E start stream mode see #NETDEV_STREAM_MODE_E*/
public int dwLiveMode; /* #NETDEV_PULL_STREAM_MODE_E Rev. Flow pattern */
public int dwDisTributeCloud; /* #NETDEV_DISTRIBUTE_CLOUD_SRV_E distribution */
public int dwallowDistribution; /* allow or no distribution*/
public int dwTransType; /* 传输类型,参见枚举# NETDEV_TRANS_TYPE_E */
public int dwStreamProtocol; /* 起流协议,参见枚举# NETDEV_START_STREAM_PROT_E */
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 236)]
public byte[] szReserve; /* Reserved */
}
#endregion SDK Struct
#region Common Method
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Init();
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Cleanup();
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_GetLastError();
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr NETDEV_Login_V30(ref NETDEV_DEVICE_LOGIN_INFO_S pstDevLoginInfo, ref NETDEV_SELOG_INFO_S pstSELogInfo);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_Logout(IntPtr lpUserID);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_QueryVideoChlDetailList(IntPtr lpUserID, ref int pdwChlCount, IntPtr pstVideoChlList);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool NETDEV_PTZGetStatus(IntPtr lpUserID, int dwChannelID, ref NETDEV_PTZ_STATUS_S pstPTZStaus);
//public boolean NETDEV_GetDevConfig(Pointer lpUserID, int dwChannelID, int dwCommand, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference pdwBytesReturned);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_PTZControl_Other(IntPtr lpUserID, int dwChannelID, int dwPTZCommand, int dwSpeed);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_PTZPreset_Other(IntPtr lpUserID, int dwChannelID, int dwPTZPresetCmd, byte[] szPresetName, int dwPresetID);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr NETDEV_RealPlay(IntPtr lpUserID, ref NETDEV_PREVIEWINFO_S pstPreviewInfo, IntPtr cbPlayDataCallBack, IntPtr lpUserData);
[DllImport(LibYsNetSDK, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int NETDEV_StopRealPlay(IntPtr lpRealHandle);
#endregion Common Method
}

138
EC.Util/CameraSDK/YuShi/YuShiSDK.cs

@ -0,0 +1,138 @@
namespace EC.Util.CameraSDK;
public class YuShiSDK : ICameraSDK
{
#region Attr
private IntPtr LoginId { get; set; } = IntPtr.Zero;
private IntPtr RealplayHandle { get; set; } = IntPtr.Zero;
#endregion Attr
public YuShiSDK(CameraInfo cameraInfo) : base(cameraInfo)
{
}
#region Base Method
public override bool Init()
{
bool ret = ConnectSuccess();
if (ret) return true;
YuShiOriSDK.NETDEV_DEVICE_LOGIN_INFO_S loginInfo = new();
loginInfo.szIPAddr = CameraInfo.Ip;
loginInfo.dwPort = CameraInfo.Port;
loginInfo.szUserName = CameraInfo.UserName;
loginInfo.szPassword = CameraInfo.Password;
YuShiOriSDK.NETDEV_SELOG_INFO_S logInfo = new();
LoginId = YuShiOriSDK.NETDEV_Login_V30(ref loginInfo, ref logInfo);
ret = ConnectSuccess();
return ret;
}
public override bool Destory()
{
bool ret = ConnectSuccess();
if (!ret) return true;
ret = YuShiOriSDK.NETDEV_Logout(LoginId);
if (ret) LoginId = IntPtr.Zero;
return ret;
}
public override bool ConnectSuccess()
{
return LoginId != IntPtr.Zero;
}
public override void BuildException()
{
int errCode = YuShiOriSDK.NETDEV_GetLastError();
if (errCode == 0) return;
throw CameraException.New(CameraInfo, errCode);
}
#endregion Base Method
#region Ptz Method
public override PtzInfo GetPtzInfo()
{
bool ret = ConnectSuccess();
if (!ret) return PtzInfo.Default;
YuShiOriSDK.NETDEV_PTZ_STATUS_S entity = new();
ret = YuShiOriSDK.NETDEV_PTZGetStatus(LoginId, 1, ref entity);
if (!ret) { BuildException(); return PtzInfo.Default; }
return PtzInfo.New(entity.fPanTiltX, entity.fPanTiltY, entity.fZoomX);
}
public override bool TryGetPtzInfo(out PtzInfo ptzInfo)
{
bool ret = ConnectSuccess();
if (!ret) { ptzInfo = PtzInfo.Default; return false; }
YuShiOriSDK.NETDEV_PTZ_STATUS_S entity = new();
ret = YuShiOriSDK.NETDEV_PTZGetStatus(LoginId, 1, ref entity);
if (!ret) { BuildException(); ptzInfo = PtzInfo.Default; return false; }
ptzInfo = PtzInfo.New(entity.fPanTiltX, entity.fPanTiltY, entity.fZoomX);
return true;
}
public override bool PtzMove(int cmd, int stop, int speed)
{
if (!ConnectSuccess()) return false;
if (stop == 1) cmd = YuShiOriSDK.ALLSTOP;
int channel = 1;
int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed);
return flag == YuShiOriSDK.TRUE;
}
public override bool PtzPreset(int cmd, int presetId)
{
if (!ConnectSuccess()) return false;
int channel = 1;
int flag = YuShiOriSDK.NETDEV_PTZPreset_Other(LoginId, channel, cmd, Array.Empty<byte>(), presetId);
return flag == YuShiOriSDK.TRUE;
}
#endregion Ptz Method
#region Video Method
public override void StartPlay(IntPtr hwnd)
{
if (!ConnectSuccess() || IsPlaying()) return;
YuShiOriSDK.NETDEV_PREVIEWINFO_S stPreviewInfo = new()
{
hPlayWnd = hwnd,
dwChannelID = 1,
dwStreamType = 0, // YuShiOriSDK.NETDEV_LIVE_STREAM_INDEX_E
dwLinkMode = 1, // YuShiOriSDK.NETDEV_PROTOCAL_E
dwFluency = 0, // YuShiOriSDK.NETDEV_PICTURE_FLUENCY_E
};
RealplayHandle = YuShiOriSDK.NETDEV_RealPlay(LoginId, ref stPreviewInfo, IntPtr.Zero, IntPtr.Zero);
if (RealplayHandle == IntPtr.Zero) BuildException();
}
public override void StopPlay()
{
if (!IsPlaying()) return;
int flag = YuShiOriSDK.NETDEV_StopRealPlay(RealplayHandle);
RealplayHandle = IntPtr.Zero;
if (flag == YuShiOriSDK.FALSE) BuildException();
}
public override bool IsPlaying()
{
return RealplayHandle != IntPtr.Zero;
}
#endregion Video Method
}

52
EC.Util/EC.Util.csproj

@ -7,54 +7,62 @@
</PropertyGroup>
<ItemGroup>
<None Remove="libs\hik-win64\AudioRender.dll" />
<None Remove="libs\hik-win64\HCCore.dll" />
<None Remove="libs\hik-win64\HCNetSDK.dll" />
<None Remove="libs\hik-win64\HCNetSDKCom\HCCoreDevCfg.dll" />
<None Remove="libs\hik-win64\HCNetSDKCom\HCPreview.dll" />
<None Remove="libs\hik-win64\HmMerge.dll" />
<None Remove="libs\hik-win64\HXVA.dll" />
<None Remove="libs\hik-win64\libcrypto-1_1-x64.dll" />
<None Remove="libs\hik-win64\libssl-1_1-x64.dll" />
<None Remove="libs\hik-win64\PlayCtrl.dll" />
<None Remove="libs\hik-win64\SuperRender.dll" />
<None Remove="libs\dh-win64\dhnetsdk.dll" />
<None Remove="libs\hk-win64\AudioRender.dll" />
<None Remove="libs\hk-win64\HCCore.dll" />
<None Remove="libs\hk-win64\HCNetSDK.dll" />
<None Remove="libs\hk-win64\HCNetSDKCom\HCCoreDevCfg.dll" />
<None Remove="libs\hk-win64\HCNetSDKCom\HCPreview.dll" />
<None Remove="libs\hk-win64\HmMerge.dll" />
<None Remove="libs\hk-win64\HXVA.dll" />
<None Remove="libs\hk-win64\libcrypto-1_1-x64.dll" />
<None Remove="libs\hk-win64\libssl-1_1-x64.dll" />
<None Remove="libs\hk-win64\PlayCtrl.dll" />
<None Remove="libs\hk-win64\SuperRender.dll" />
<None Remove="libs\ys-win64\NetDEVSDK.dll" />
</ItemGroup>
<ItemGroup>
<Content Include="libs\hik-win64\HXVA.dll">
<Content Include="libs\dh-win64\dhnetsdk.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hk-win64\HXVA.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="libs\hik-win64\AudioRender.dll">
<Content Include="libs\hk-win64\AudioRender.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hk-win64\HCCore.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\HCCore.dll">
<Content Include="libs\hk-win64\HCNetSDK.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\HCNetSDK.dll">
<Content Include="libs\hk-win64\HCNetSDKCom\HCCoreDevCfg.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\HCNetSDKCom\HCCoreDevCfg.dll">
<Content Include="libs\hk-win64\HCNetSDKCom\HCPreview.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\HCNetSDKCom\HCPreview.dll">
<Content Include="libs\hk-win64\HmMerge.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\HmMerge.dll">
<Content Include="libs\hk-win64\libcrypto-1_1-x64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\libcrypto-1_1-x64.dll">
<Content Include="libs\hk-win64\libssl-1_1-x64.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\libssl-1_1-x64.dll">
<Content Include="libs\hk-win64\PlayCtrl.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\PlayCtrl.dll">
<Content Include="libs\hk-win64\SuperRender.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="libs\hik-win64\SuperRender.dll">
<Content Include="libs\ys-win64\NetDEVSDK.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>

2
EC.Util/Port/SerialPortParam.cs

@ -42,7 +42,7 @@ public class SerialPortParam
/// </summary>
public int ReceivedBytesThreshold { get; set; }
#endregion fields
#endregion Fields
public SerialPortParam()
{

BIN
EC.Util/libs/dh-win64/dhnetsdk.dll

Binary file not shown.

0
EC.Util/libs/hik-win64/AudioRender.dll → EC.Util/libs/hk-win64/AudioRender.dll

0
EC.Util/libs/hik-win64/HCCore.dll → EC.Util/libs/hk-win64/HCCore.dll

0
EC.Util/libs/hik-win64/HCNetSDK.dll → EC.Util/libs/hk-win64/HCNetSDK.dll

0
EC.Util/libs/hik-win64/HCNetSDKCom/HCCoreDevCfg.dll → EC.Util/libs/hk-win64/HCNetSDKCom/HCCoreDevCfg.dll

0
EC.Util/libs/hik-win64/HCNetSDKCom/HCPreview.dll → EC.Util/libs/hk-win64/HCNetSDKCom/HCPreview.dll

0
EC.Util/libs/hik-win64/HXVA.dll → EC.Util/libs/hk-win64/HXVA.dll

0
EC.Util/libs/hik-win64/HmMerge.dll → EC.Util/libs/hk-win64/HmMerge.dll

0
EC.Util/libs/hik-win64/PlayCtrl.dll → EC.Util/libs/hk-win64/PlayCtrl.dll

0
EC.Util/libs/hik-win64/SuperRender.dll → EC.Util/libs/hk-win64/SuperRender.dll

0
EC.Util/libs/hik-win64/libcrypto-1_1-x64.dll → EC.Util/libs/hk-win64/libcrypto-1_1-x64.dll

0
EC.Util/libs/hik-win64/libssl-1_1-x64.dll → EC.Util/libs/hk-win64/libssl-1_1-x64.dll

BIN
EC.Util/libs/ys-win64/NetDEVSDK.dll

Binary file not shown.

1
JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessage.cs

@ -10,6 +10,7 @@ public class AlarmMessage
public int warnLevel;
/** (必填)报警内容*/
public string warnContent;
public int ChannelNum;
/** 处置方式*/
public int dealWay;
/** (必填)处置状态(1-未处理,2-已处理)*/

4
JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessageHelper.cs

@ -8,13 +8,14 @@ public static class AlarmMessageHelper
{
public static AlarmMessage ToAlarmMessage(this TcpAlarmHostMessage msg)
{
AlarmCode code = AlarmCodeHelper.Get(msg.AlarmId);
AlarmCode code = AlarmCodeHelper.Get(msg.CID);
AlarmMessage obj = new()
{
labelCode = Convert.ToString(msg.DeviceID),
warnType = 3,
warnLevel = code.Level,
warnContent = code.Content,
ChannelNum = Convert.ToInt32(msg.ChannelNum),
dealStatus = 1,
createTime = Convert.ToDateTime(msg.AlarmTime),
kind = 2,
@ -31,6 +32,7 @@ public static class AlarmMessageHelper
warnType = 4,
warnLevel = code.Level,
warnContent = code.Content,
ChannelNum = msg.ChannelNum,
dealStatus = 1,
createTime = Convert.ToDateTime(msg.AlarmTime),
kind = 2,

31
JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs

@ -48,7 +48,18 @@ public class AlarmMqttService : IAlarmService
public void Start()
{
Server.StartAsync().Wait();
ClientConnServer();
}
public void Close()
{
Client.DisconnectAsync().Wait();
Server.StopAsync().Wait();
}
private void ClientConnServer()
{
if (Client.IsConnected) return;
MqttClientOptions mqttClientOptions = new MqttClientOptionsBuilder()
.WithTcpServer("127.0.0.1", Config.Port)
.WithClientId(Config.ClientId)
@ -57,19 +68,25 @@ public class AlarmMqttService : IAlarmService
Client.ConnectAsync(mqttClientOptions, CancellationToken.None);
}
public void Close()
{
Client.DisconnectAsync().Wait();
Server.StopAsync().Wait();
}
public void SendAlarmMessage(AlarmMessage msg)
{
MqttApplicationMessage mqttMsg = new MqttApplicationMessageBuilder()
.WithTopic(Config.TransmitTopic)
.WithPayload(JsonUtil.ToJson(msg))
.Build();
Client.PublishAsync(mqttMsg, CancellationToken.None).Wait();
MqttClientPublishResult? result = null;
while (result == null || !result.IsSuccess)
{
try
{
result = Client.PublishAsync(mqttMsg, CancellationToken.None).Result;
}
catch (Exception)
{
ClientConnServer();
Thread.Sleep(100);
}
}
}
#endregion Base

8
JiLinApp.Docking/Alarm/AlarmCodeHelper.cs

@ -10,7 +10,7 @@ public class AlarmCodeHelper
private static readonly List<int> LevelList;
private static readonly List<string> TypeList;
#endregion fields
#endregion Fields
static AlarmCodeHelper()
{
@ -18,10 +18,8 @@ public class AlarmCodeHelper
string jsonStr = r.ReadToEnd();
List<AlarmCode> list = JsonConvert.DeserializeObject<List<AlarmCode>>(jsonStr) ?? new();
AlarmCodeDict = list.ToDictionary(item => item.Id, item => item);
LevelList = list.GroupBy(item => item.Level)
.Select(it => it.First().Level).ToList();
TypeList = list.GroupBy(item => item.Type)
.Select(it => it.First().Type).ToList();
LevelList = list.GroupBy(item => item.Level).Select(it => it.First().Level).ToList();
TypeList = list.GroupBy(item => item.Type).Select(it => it.First().Type).ToList();
}
public static void Init()

28
JiLinApp.Docking/FenceAlarm/Entity/SectorState.cs

@ -2,7 +2,9 @@
public class SectorState
{
public int id { get; set; }//防区号
#region Fields
public int Id { get; set; }//防区号
/*0使
1
2
@ -11,13 +13,13 @@ public class SectorState
5线
6线(线线)
*/
public int state { get; set; }//防区状态
public int State { get; set; }//防区状态
public string stateStr
public string StateStr
{
get
{
switch (state)
switch (State)
{
case 0: return "防区未使用";
case 1: return "防区撤防";
@ -26,7 +28,7 @@ public class SectorState
case 4: return "防区报警";
case 5: return "无线防区欠压";
case 6: return "防区掉线";
default: return "未知状态:" + state;
default: return "未知状态:" + State;
}
}
}
@ -39,13 +41,13 @@ public class SectorState
4
5线
*/
public int type { get; set; }//防区类型,特殊参数需单独查询
public int Type { get; set; }//防区类型,特殊参数需单独查询
public string typeStr
public string TypeStr
{
get
{
switch (type)
switch (Type)
{
case 0: return "普通防区";
case 1: return "张力防区";
@ -53,15 +55,17 @@ public class SectorState
case 3: return "振动光纤";
case 4: return "泄漏电缆";
case 5: return "网络或总线多子防区模块";
default: return "未知类型:" + type;
default: return "未知类型:" + Type;
}
}
}
#endregion Fields
public SectorState(int id, byte data)
{
this.id = id;
state = data & 0x0F;
type = data >> 4;
Id = id;
State = data & 0x0F;
Type = data >> 4;
}
}

12
JiLinApp.Docking/FenceAlarm/Entity/UdpAlarmHostDevice.cs

@ -4,11 +4,13 @@ public class UdpAlarmHostDevice
{
public int deviceID { get; set; }//设备唯一ID
public string IP { get; set; }//设备IP
public string Ip { get; set; }//设备Ip
public int groupID { get; set; }//分组号,报警主机可划入不同组
public int Port { get; set; } //设备端口
public int userID { get; set; }//用户ID,指主机名称,有多台主机可以通过此名称区分
public int GroupID { get; set; }//分组号,报警主机可划入不同组
public int UserID { get; set; }//用户ID,指主机名称,有多台主机可以通过此名称区分
/*0x00:
0x04: ()
0x02:()
@ -139,8 +141,8 @@ public class UdpAlarmHostDevice
public UdpAlarmHostDevice()
{
deviceID = 0;
groupID = 0;
userID = 0;
GroupID = 0;
UserID = 0;
deviceState = -1;
deviceWorkState = 0;
cellState = 0;

31
JiLinApp.Docking/FenceAlarm/Entity/UdpDatagramReceivedEventArgs.cs

@ -0,0 +1,31 @@
using System.Net;
namespace JiLinApp.Docking.FenceAlarm;
/// <summary>
/// 接收到数据报文事件参数
/// </summary>
/// <typeparam name="T">报文类型</typeparam>
public class UdpDatagramReceivedEventArgs<T> : EventArgs
{
/// <summary>
/// 客户端
/// </summary>
public IPEndPoint Ipep { get; private set; }
/// <summary>
/// 报文
/// </summary>
public T Datagram { get; private set; }
/// <summary>
/// 接收到数据报文事件参数
/// </summary>
/// <param name="tcpClient">客户端</param>
/// <param name="datagram">报文</param>
public UdpDatagramReceivedEventArgs(IPEndPoint ipep, T datagram)
{
Ipep = ipep ?? throw new ArgumentNullException(nameof(ipep));
Datagram = datagram;
}
}

2
JiLinApp.Docking/FenceAlarm/Entity/UdpManagerConfig.cs

@ -6,7 +6,5 @@ public class UdpManagerConfig
public int ServerPort { get; set; }
public int DevicePort { get; set; }
public int DeviceHeartKeep { get; set; }
}

106
JiLinApp.Docking/FenceAlarm/Service/Udp.cs

@ -6,33 +6,38 @@ namespace JiLinApp.Docking.FenceAlarm;
public class Udp
{
private BackgroundWorker back = null;
#region Fields
private BackgroundWorker BackWorker { get; }
/// <summary>
/// 用于UDP发送的网络服务类
/// 用于UDP接收的网络服务类
/// </summary>
private UdpClient udpcSend = null;
private UdpClient RecvUdp { get; }
/// <summary>
/// 用于UDP接收的网络服务类
/// 用于UDP发送的网络服务类
/// </summary>
private UdpClient udpcRecv;
private UdpClient SendUdp { get; }
#endregion Fields
public delegate void UDPReceive(string IP, byte[] str);//
#region Ctors
public event UDPReceive myUDPReceive;//
public Udp(int port) : this("0.0.0.0", port)
{
}
public Udp(string ip, int port)
{
IPEndPoint localIpep = new IPEndPoint(
IPAddress.Parse(ip), port); // 本机IP和监听端口号
udpcRecv = new UdpClient(localIpep);
udpcSend = new UdpClient();
back = new BackgroundWorker();
back.WorkerSupportsCancellation = true;
back.DoWork += back_DoWork;
back.RunWorkerAsync();
RecvUdp = new(new IPEndPoint(IPAddress.Parse(ip), port));
SendUdp = new(new IPEndPoint(IPAddress.Any, 0));
BackWorker = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
BackWorker.DoWork += Back_DoWork;
BackWorker.RunWorkerAsync();
}
~Udp()
@ -40,45 +45,64 @@ public class Udp
Stop();
}
#endregion Ctors
#region Server
public void Stop()
{
if (back != null)
{
back.CancelAsync();
back = null;
}
if (udpcRecv != null)
{
udpcRecv.Close();
udpcRecv = null;
}
if (udpcSend != null)
{
udpcSend.Close();
udpcSend = null;
}
BackWorker?.CancelAsync();
RecvUdp?.Close();
SendUdp?.Close();
}
public bool SendMessage(byte[] sendbytes, string IP, int port)
#endregion Server
#region Receive
public delegate void UDPReceive(IPEndPoint ipep, byte[] str);
public event UDPReceive DatagramReceived;
private void RaiseDatagramReceived(IPEndPoint ipep, byte[] datagram)
{
IPEndPoint remoteIpep = new IPEndPoint(
IPAddress.Parse(IP), port); // 发送到的IP地址和端口号
int result = udpcSend.Send(sendbytes, sendbytes.Length, remoteIpep);
return result >= sendbytes.Length;
DatagramReceived?.Invoke(ipep, datagram);
}
private void back_DoWork(object sender, DoWorkEventArgs e)
#endregion Receive
#region Send
public bool SendMessage(string ip, int port, byte[] byteMsg)
{
IPEndPoint ipep = new(IPAddress.Parse(ip), port); // 发送到的IP地址和端口号
int result = SendUdp.Send(byteMsg, byteMsg.Length, ipep);
bool flag = result >= byteMsg.Length;
Console.WriteLine("Send ok: {0}", flag);
return flag;
}
public bool SendMessage(IPEndPoint ipep, byte[] byteMsg)
{
int result = SendUdp.Send(byteMsg, byteMsg.Length, ipep);
return result >= byteMsg.Length;
}
#endregion Send
private void Back_DoWork(object? sender, DoWorkEventArgs e)
{
IPEndPoint remoteIpep = new IPEndPoint(IPAddress.Any, 0);
while (!back.CancellationPending)
IPEndPoint remoteIpep = new(IPAddress.Any, 0);
while (BackWorker != null && !BackWorker.CancellationPending)
{
try
{
byte[] bytRecv = udpcRecv.Receive(ref remoteIpep);
myUDPReceive(remoteIpep.Address.ToString(), bytRecv);
byte[] bytRecv = RecvUdp.Receive(ref remoteIpep);
DatagramReceived(remoteIpep, bytRecv);
}
catch
{
throw;
}
}
}

151
JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs

@ -1,4 +1,5 @@
using System.Timers;
using System.Net;
using System.Timers;
using Timer = System.Timers.Timer;
namespace JiLinApp.Docking.FenceAlarm;
@ -8,12 +9,10 @@ public class UdpManager
#region Fields
private Udp myUdp = null;
private int udp_sendPort = -1;
private int udp_ReceivePort = -1;
private int keep_alive = -1;
private int udp_ReceivePort { get; set; } = -1;
private int keep_alive { get; set; } = -1;
private Timer PtzCheckTimer = new();
private List<UdpAlarmHostDevice> deviceList = new();
private List<UdpAlarmHostDevice> deviceList { get; set; } = new();
#endregion Fields
@ -72,7 +71,7 @@ public class UdpManager
if (state == null || state.sectorList == null) return null;
foreach (SectorState p1 in state.sectorList)
{
if (p1.id == channel) return p1;
if (p1.Id == channel) return p1;
}
return null;
}
@ -83,10 +82,9 @@ public class UdpManager
{
string s_IP = config.ServerIp;
int s_Port = config.ServerPort;
int d_Port = config.DevicePort;
int d_Keep = config.DeviceHeartKeep;
return AlarmHostLogin(s_IP, s_Port, d_Port, d_Keep);
return AlarmHostLogin(s_IP, s_Port, d_Keep);
}
public bool StopServer()
@ -94,18 +92,17 @@ public class UdpManager
return AlarmHostLoginOut();
}
private bool AlarmHostLogin(string IP, int Port, int device_port, int keep_alive)
private bool AlarmHostLogin(string ip, int port, int keep_alive)
{
if (myUdp != null) AlarmHostLoginOut();
this.udp_ReceivePort = Port;
this.udp_sendPort = device_port;
this.udp_ReceivePort = port;
this.keep_alive = keep_alive;
try
{
//启动UDP协议
myUdp = new Udp(IP, udp_ReceivePort);
myUdp.myUDPReceive += myUDPReceive;
myUdp = new Udp(udp_ReceivePort);
myUdp.DatagramReceived += myUDPReceive;
}
catch (Exception ex)
{
@ -124,7 +121,7 @@ public class UdpManager
PtzCheckTimer.Enabled = false;
if (myUdp != null)
{
myUdp.myUDPReceive -= myUDPReceive;
myUdp.DatagramReceived -= myUDPReceive;
myUdp.Stop();
myUdp = null;
}
@ -149,31 +146,33 @@ public class UdpManager
public event UDPAlarmCancelEvent OnUdpAlarmCancel;
private void myUDPReceive(string Ip, byte[] str)
private void myUDPReceive(IPEndPoint ipep, byte[] str)
{
//解码
byte[] msg = AlarmEncode.decodeMessage(str);
string ip = ipep.Address.ToString();
Console.WriteLine("Receive protocol:" + msg[4]);
//解析
switch (msg[4])
{
case 0x01: //心跳数据
analysisHeartMessage(Ip, msg);
AnalysisHeartMessage(ipep, msg);
break;
case 0x02://报警信息
AnalysisAlarmMessage(Ip, msg);
AnalysisAlarmMessage(ip, msg);
break;
case 0x03://防区信息
analysisAllSectorMessage(Ip, msg);
AnalysisAllSectorMessage(ipep, msg);
break;
case 0x04://张力防区信息
analysisSectorMessage(Ip, msg);
AnalysisSectorMessage(ipep, msg);
break;
case 0x05://报警主机最大防区信息
analysisMaxSectorMessage(Ip, msg);
AnalysisMaxSectorMessage(ipep, msg);
break;
case 0x08://返回报警主机设置参数回服务器,无需解析
@ -182,36 +181,37 @@ public class UdpManager
default:
break;
}
Console.WriteLine("消息类型:" + msg[4]);
sendOK(Ip);
SendOK(ipep);
}
private void sendOK(string IP)
private void SendOK(IPEndPoint ipep)
{
if (myUdp == null) return;
//byte[] bytes = new byte[] { 0x08, 0x12, 0xF0, 0xFA, 0x8F, 0x7F, 0x2E, 0x0D };
byte[] bytes = new byte[] { 0x08, 0x12, 0xF0, 0xFA, 0x8F, 0x06, 0x6B, 0x0D };
myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), IP, udp_sendPort);
bool flag = myUdp.SendMessage(ipep.Address.ToString(), ipep.Port, AlarmEncode.encodeMessage(bytes));
//bool flag = myUdp.SendMessage(ipep, AlarmEncode.encodeMessage(bytes));
}
private void analysisHeartMessage(string IP, byte[] msg)
private void AnalysisHeartMessage(IPEndPoint ipep, byte[] msg)
{
string ip = ipep.Address.ToString();
int deviceID = ByteToInt(msg, 5);
UdpAlarmHostDevice device = getDevice(deviceID);
if (device == null)
{
device = new UdpAlarmHostDevice();
device.deviceID = deviceID;
device.userID = ByteToInt(msg, 13);
device.IP = IP;
device.deviceOnlineState = 1;
device.keep_live = keep_alive;
device = new()
{
deviceID = deviceID,
deviceOnlineState = 1,
keep_live = keep_alive
};
deviceList.Add(device);
}
device.deviceID = deviceID;
device.IP = IP;
device.groupID = ByteToInt(msg, 9);
device.userID = ByteToInt(msg, 13);
device.Ip = ip;
device.Port = ipep.Port;
device.GroupID = ByteToInt(msg, 9);
device.UserID = ByteToInt(msg, 13);
if (device.deviceState != msg[17])
{
if (OnUdpAlarmDeviceState != null)
@ -351,6 +351,7 @@ public class UdpManager
0x02,bytes2[0],bytes2[1],0x00,
0x00,0x04,0x03,0x01
};
//byte[] encodeMsg = AlarmEncode.encodeMessage(msg);
AnalysisAlarmMessage("127.0.0.1", msg);
}
@ -519,22 +520,25 @@ public class UdpManager
return (num1 * 10 + num2).ToString();
}
private void analysisAllSectorMessage(string IP, byte[] msg)
private void AnalysisAllSectorMessage(IPEndPoint ipep, byte[] msg)
{
string ip = ipep.Address.ToString();
int deviceID = ByteToInt(msg, 5);
UdpAlarmHostDevice device = getDevice(deviceID);
if (device == null)
{
device = new UdpAlarmHostDevice();
device.deviceID = deviceID;
device.IP = IP;
device.deviceOnlineState = 1;
device.keep_live = keep_alive;
device = new()
{
deviceID = deviceID,
deviceOnlineState = 1,
keep_live = keep_alive
};
deviceList.Add(device);
}
device.IP = IP;
device.groupID = ByteToInt(msg, 9);
device.userID = ByteToInt(msg, 13);
device.Ip = ip;
device.Port = ipep.Port;
device.GroupID = ByteToInt(msg, 9);
device.UserID = ByteToInt(msg, 13);
if (device.sectorList == null)
{
@ -554,19 +558,19 @@ public class UdpManager
{
for (int i = 0; i < list.Count; i++)
{
if (list[i].id == state.id)
if (list[i].Id == state.Id)
{
//设备离线
if (list[i].state != state.state)
if (list[i].State != state.State)
{
reportSectorState(deviceId, state.id, state.state);
reportSectorState(deviceId, state.Id, state.State);
}
list[i] = state; //防区存在,更新
return;
}
}
list.Add(state);//防区不存在,添加
reportSectorState(deviceId, state.id, state.state);
reportSectorState(deviceId, state.Id, state.State);
}
private void reportSectorState(int deviceId, int channel, int state)
@ -610,27 +614,30 @@ public class UdpManager
}
}
private void analysisSectorMessage(string IP, byte[] msg)
private void AnalysisSectorMessage(IPEndPoint ipep, byte[] msg)
{
//东北没有张力防区,暂不解析
}
private void analysisMaxSectorMessage(string IP, byte[] msg)
private void AnalysisMaxSectorMessage(IPEndPoint ipep, byte[] msg)
{
string ip = ipep.Address.ToString();
int deviceID = ByteToInt(msg, 5);
UdpAlarmHostDevice device = getDevice(deviceID);
if (device == null)
{
device = new UdpAlarmHostDevice();
device.deviceID = deviceID;
device.IP = IP;
device.deviceOnlineState = 1;
device.keep_live = keep_alive;
device = new()
{
deviceID = deviceID,
deviceOnlineState = 1,
keep_live = keep_alive
};
deviceList.Add(device);
}
device.IP = IP;
device.groupID = ByteToInt(msg, 9);
device.userID = ByteToInt(msg, 13);
device.Ip = ip;
device.Port = ipep.Port;
device.GroupID = ByteToInt(msg, 9);
device.UserID = ByteToInt(msg, 13);
device.maxSectorNum = msg[17] * 256 + msg[18];
}
@ -661,7 +668,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x60 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -676,7 +683,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x62 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -691,7 +698,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x63 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -706,7 +713,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x64 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -721,7 +728,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x61 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -736,7 +743,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0x80, new byte[] { 0x65 });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -752,7 +759,7 @@ public class UdpManager
{
byte[] content = getBCDTime(time);
byte[] bytes = AlarmEncode.getSendMessage(0x8D, content);
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -767,7 +774,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0xA0, null);
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -782,7 +789,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0xC0, new byte[] { (byte)(channel / 256), (byte)(channel % 256) });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -797,7 +804,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0xC1, new byte[] { (byte)(channel / 256), (byte)(channel % 256) });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -812,7 +819,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0xC2, new byte[] { (byte)(channel / 256), (byte)(channel % 256) });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{
@ -827,7 +834,7 @@ public class UdpManager
if (checkDevice(device, ref error))
{
byte[] bytes = AlarmEncode.getSendMessage(0xC3, new byte[] { (byte)(channel / 256), (byte)(channel % 256) });
return myUdp.SendMessage(AlarmEncode.encodeMessage(bytes), device.IP, udp_sendPort);
return myUdp.SendMessage(device.Ip, device.Port, AlarmEncode.encodeMessage(bytes));
}
else
{

4
JiLinApp.Docking/JiLinApp.Docking.csproj

@ -6,6 +6,10 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NewLife.Core" Version="10.2.2023.401" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EC.Util\EC.Util.csproj" />
</ItemGroup>

6
JiLinApp.Docking/Ptz/DCamera.cs

@ -1,6 +1,4 @@
using System;
namespace JiLinApp.Docking.Ptz;
namespace JiLinApp.Docking.Ptz;
public class DCamera
{
@ -13,7 +11,7 @@ public class DCamera
#endregion Data3
#endregion fields
#endregion Fields
#region BaseMethod

4
JiLinApp.Docking/Ptz/PelcoD.cs

@ -1,6 +1,4 @@
using System;
namespace JiLinApp.Docking.Ptz;
namespace JiLinApp.Docking.Ptz;
public class PelcoD
{

4
JiLinApp.Docking/Ptz/PelcoP.cs

@ -1,6 +1,4 @@
using System;
namespace JiLinApp.Docking.Ptz;
namespace JiLinApp.Docking.Ptz;
/// <summary>
/// dot.NET Implementation of Pelco P Protocol

166
JiLinApp.Docking/Ptz/PtzCmd.cs

@ -10,7 +10,8 @@ public class PtzCmd
{
"PelcoD" => PtzControlType.PelcoD,
"PelcoP" => PtzControlType.PelcoP,
"HikSdk" => PtzControlType.HikSdk,
"DCamera" => PtzControlType.PelcoP,
"CameraSdk" => PtzControlType.CameraSdk,
_ => PtzControlType.None
};
}
@ -36,7 +37,10 @@ public class PtzCmd
_ => PtzCmdType.None
};
}
}
public class PtzComCmd
{
/// <summary>
/// GetPelcoDCmd
/// GetPelcoPCmd
@ -125,62 +129,174 @@ public class PtzCmd
};
return cmd;
}
}
public static void HikPtzMove(ref HiKSDK sdk, PtzCmdType cmdType, uint[] args)
public class PtzCameraCmd
{
public static void PtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args)
{
if (sdk == null || args == null) return;
uint[] arr = new uint[args.Length + 1];
args.CopyTo(arr, 1);
switch (sdk.CameraInfo.GetManufactor)
{
case CameraManufactor.HiK:
HikPtzMove(sdk, cmdType, args);
break;
case CameraManufactor.DaHua:
DaHuaPtzMove(sdk, cmdType, args);
break;
case CameraManufactor.YuShi:
YuShiPtzMove(sdk, cmdType, args);
break;
default:
break;
}
}
public static void HikPtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args)
{
int stop = args[0], presetId = args[0];
int speed = (HiKOriSDK.PtzSpeedMin + HiKOriSDK.PtzSpeedMax) / 2;
switch (cmdType)
{
case PtzCmdType.Left:
sdk.PtzMove(HiKOriSDK.PAN_LEFT, stop, speed);
break;
case PtzCmdType.Right:
sdk.PtzMove(HiKOriSDK.PAN_RIGHT, stop, speed);
break;
case PtzCmdType.Top:
sdk.PtzMove(HiKOriSDK.TILT_UP, stop, speed);
break;
case PtzCmdType.Down:
sdk.PtzMove(HiKOriSDK.TILT_DOWN, stop, speed);
break;
case PtzCmdType.LeftTop:
sdk.PtzMove(HiKOriSDK.UP_LEFT, stop, speed);
break;
case PtzCmdType.LeftDown:
sdk.PtzMove(HiKOriSDK.DOWN_LEFT, stop, speed);
break;
case PtzCmdType.RightTop:
sdk.PtzMove(HiKOriSDK.UP_RIGHT, stop, speed);
break;
case PtzCmdType.RightDown:
sdk.PtzMove(HiKOriSDK.DOWN_RIGHT, stop, speed);
break;
case PtzCmdType.AutoStart:
sdk.PtzMove(HiKOriSDK.PAN_AUTO, stop, speed);
break;
case PtzCmdType.PresetGoto:
sdk.PtzPreset(HiKOriSDK.GOTO_PRESET, presetId);
break;
default:
break;
}
}
private static void DaHuaPtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args)
{
int stop = args[0], presetId = args[0];
int speed = (DaHuaOriSDK.PtzSpeedMin + DaHuaOriSDK.PtzSpeedMax) / 2;
switch (cmdType)
{
case PtzCmdType.Left:
arr[0] = HiKOriSDK.PAN_LEFT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.LEFT_CONTROL, stop, speed);
break;
case PtzCmdType.Right:
arr[0] = HiKOriSDK.PAN_RIGHT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHT_CONTROL, stop, speed);
break;
case PtzCmdType.Top:
arr[0] = HiKOriSDK.TILT_UP;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.UP_CONTROL, stop, speed);
break;
case PtzCmdType.Down:
arr[0] = HiKOriSDK.TILT_DOWN;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.DOWN_CONTROL, stop, speed);
break;
case PtzCmdType.LeftTop:
arr[0] = HiKOriSDK.UP_LEFT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.LEFTTOP, stop, speed);
break;
case PtzCmdType.LeftDown:
arr[0] = HiKOriSDK.DOWN_LEFT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.LEFTDOWN, stop, speed);
break;
case PtzCmdType.RightTop:
arr[0] = HiKOriSDK.UP_RIGHT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHTTOP, stop, speed);
break;
case PtzCmdType.RightDown:
arr[0] = HiKOriSDK.DOWN_RIGHT;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHTDOWN, stop, speed);
break;
case PtzCmdType.AutoStart:
arr[0] = HiKOriSDK.PAN_AUTO;
sdk.PtzMove(arr);
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.HORSECTORSCAN, stop, speed);
break;
case PtzCmdType.PresetGoto:
sdk.PtzPreset((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.GOTOPRESET, presetId);
break;
default:
break;
}
}
public static void YuShiPtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args)
{
int stop = args[0], presetId = args[0];
int speed = (YuShiOriSDK.PtzSpeedMax + YuShiOriSDK.PtzSpeedMin) / 2;
switch (cmdType)
{
case PtzCmdType.Left:
sdk.PtzMove(YuShiOriSDK.PANLEFT, stop, speed);
break;
case PtzCmdType.Right:
sdk.PtzMove(YuShiOriSDK.PANRIGHT, stop, speed);
break;
case PtzCmdType.Top:
sdk.PtzMove(YuShiOriSDK.TILTUP, stop, speed);
break;
case PtzCmdType.Down:
sdk.PtzMove(YuShiOriSDK.TILTDOWN, stop, speed);
break;
case PtzCmdType.LeftTop:
sdk.PtzMove(YuShiOriSDK.LEFTUP, stop, speed);
break;
case PtzCmdType.LeftDown:
sdk.PtzMove(YuShiOriSDK.LEFTDOWN, stop, speed);
break;
case PtzCmdType.RightTop:
sdk.PtzMove(YuShiOriSDK.RIGHTUP, stop, speed);
break;
case PtzCmdType.RightDown:
sdk.PtzMove(YuShiOriSDK.RIGHTDOWN, stop, speed);
break;
case PtzCmdType.PresetGoto:
arr[0] = HiKOriSDK.GOTO_PRESET;
sdk.PtzPreset(arr);
sdk.PtzPreset(YuShiOriSDK.PRESET_GOTO, presetId);
break;
default:
@ -194,7 +310,7 @@ public enum PtzControlType
PelcoD,
PelcoP,
DCamera,
HikSdk,
CameraSdk,
None,
}

3
JiLinApp.Docking/Ptz/PtzConfig.cs

@ -30,7 +30,8 @@ public class PtzControlTypeConfigHelper
{
"PelcoD" => PtzControlType.PelcoD,
"PelcoP" => PtzControlType.PelcoP,
"HikSdk" => PtzControlType.HikSdk,
"DCamera" => PtzControlType.DCamera,
"CameraSdk" => PtzControlType.CameraSdk,
_ => PtzControlType.None
};
}

74
JiLinApp.Docking/VibrateAlarm/Entity/ClientMessage.cs

@ -5,16 +5,34 @@ namespace JiLinApp.Docking.VibrateAlarm;
public class ClientMessage
{
public TcpClient client { get; set; }
#region Fields
public TcpAlarmHostTable host { get; set; }
public TcpClient Client { get; set; }
public string IP
public TcpAlarmHostTable Host { get; set; }
public List<byte> DataList { get; } = new();
public Hashtable SectionTable { get; } = new();
public List<byte> SensorList { get; set; }
public bool SensorListEmpty
{
get
{
if (host != null) return host.ip;
if (client != null) return client.Client.RemoteEndPoint.ToString().Split(':')[0];
return SensorList == null || SensorList.Count == 0;
}
}
public ReaderWriterLockSlim SensorListLock { get; } = new();
public string Ip
{
get
{
if (Host != null) return Host.Ip;
if (Client != null) return Client.Client.RemoteEndPoint.ToString().Split(':')[0];
return "";
}
}
@ -23,49 +41,43 @@ public class ClientMessage
{
get
{
if (host != null) return host.port;
if (client != null) return client.Client.RemoteEndPoint.ToString().Split(':')[1];
if (Host != null) return Host.Port;
if (Client != null) return Client.Client.RemoteEndPoint.ToString().Split(':')[1];
return "-1";
}
}
public List<byte> list { get; set; }
public Hashtable sectioTable { get; set; }
#endregion Fields
public ClientMessage()
{
list = new List<byte>();
host = null;
sectioTable = new Hashtable();
}
public List<byte[]> getMessageList()
public void AddData(byte[] bytes)
{
DataList.AddRange(bytes);
}
public List<byte[]> GetMessageList()
{
List<byte[]> msglist = new List<byte[]>();
while (list.Count >= 19)
List<byte[]> msglist = new();
while (DataList.Count >= 19)
{
if (list[0] == 0xAA && list[1] == 0xAA)
if (DataList[0] == 0xAA && DataList[1] == 0xAA)
{
int num = list[17];
if (list.Count < 19 + num)
{
break;
}
else
int num = DataList[17];
if (DataList.Count < 19 + num) break;
byte[] bytes = new byte[num + 19];
for (int i = 0; i < bytes.Length; i++)
{
byte[] bytes = new byte[num + 19];
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = list[i];
}
msglist.Add(bytes);
list.RemoveRange(0, num + 19);
bytes[i] = DataList[i];
}
msglist.Add(bytes);
DataList.RemoveRange(0, num + 19);
}
else
{
list.RemoveAt(0);
DataList.RemoveAt(0);
}
}
return msglist;

97
JiLinApp.Docking/VibrateAlarm/Entity/DataMessage.cs

@ -4,86 +4,77 @@ namespace JiLinApp.Docking.VibrateAlarm;
public class DataMessage
{
private byte headA = 0xAA;
private byte headB = 0xAA; //(1)帧头
public int deviceID { get; set; } //(2)设备ID
public string sendIP { get; set; } //(3)原地址
public int sendPort { get; set; }//(3)原地址
public string receiveIP { get; set; }//(4)目标地址
public int receivePort { get; set; }//(4)目标地址
public byte frameNum { get; set; }//(5)帧编号
public byte functionNum { get; set; }//(6)功能码
public byte dataLen { get; set; }//(7)传输数据长度
public byte[] data { get; set; }//(8)传输数据
private byte HeadA = 0xAA;
private byte HeadB = 0xAA; //(1)帧头
public int DeviceId { get; set; } //(2)设备ID
public string SendIp { get; set; } //(3)原地址
public int SendPort { get; set; }//(3)原地址
public string ReceiveIp { get; set; }//(4)目标地址
public int ReceivePort { get; set; }//(4)目标地址
public byte FrameNum { get; set; }//(5)帧编号
public byte FunctionNum { get; set; }//(6)功能码
public byte DataLen { get; set; }//(7)传输数据长度
public byte[] Data { get; set; }//(8)传输数据
public byte CRC { get; set; }//(9)CRC8
public void decode(byte[] bytes)
public void Decode(byte[] bytes)
{
deviceID = bytes[2];
sendIP = bytes[3].ToString() + "." + bytes[4].ToString() + "." + bytes[5].ToString() + "." + bytes[6].ToString();
sendPort = bytes[8] * 256 + bytes[7];
receiveIP = bytes[9].ToString() + "." + bytes[10].ToString() + "." + bytes[11].ToString() + "." + bytes[12].ToString();
receivePort = bytes[13] * 256 + bytes[14];
frameNum = bytes[15];
functionNum = bytes[16];
dataLen = bytes[17];
data = new byte[dataLen];
for (int i = 0; i < dataLen; i++)
DeviceId = bytes[2];
SendIp = bytes[3].ToString() + "." + bytes[4].ToString() + "." + bytes[5].ToString() + "." + bytes[6].ToString();
SendPort = bytes[8] * 256 + bytes[7];
ReceiveIp = bytes[9].ToString() + "." + bytes[10].ToString() + "." + bytes[11].ToString() + "." + bytes[12].ToString();
ReceivePort = bytes[14] * 256 + bytes[13];
FrameNum = bytes[15];
FunctionNum = bytes[16];
DataLen = bytes[17];
Data = new byte[DataLen];
for (int i = 0; i < DataLen; i++)
{
data[i] = bytes[18 + i];
Data[i] = bytes[18 + i];
}
CRC = bytes[18 + dataLen];
CRC = bytes[18 + DataLen];
}
public byte[] encode()
public byte[] Encode()
{
byte[] bytes = new byte[19 + dataLen];
byte[] bytes = new byte[19 + DataLen];
bytes[0] = bytes[1] = 0xAA;
bytes[2] = (byte)deviceID;
bytes[2] = (byte)DeviceId;
string[] strs = sendIP.Split('.');
string[] strs = SendIp.Split('.');
bytes[3] = byte.Parse(strs[0]);
bytes[4] = byte.Parse(strs[1]);
bytes[5] = byte.Parse(strs[2]);
bytes[6] = byte.Parse(strs[3]);
bytes[7] = (byte)(sendPort % 256);
bytes[8] = (byte)(sendPort / 256);
bytes[7] = (byte)(SendPort % 256);
bytes[8] = (byte)(SendPort / 256);
string[] strs2 = receiveIP.Split('.');
string[] strs2 = ReceiveIp.Split('.');
bytes[9] = byte.Parse(strs2[0]);
bytes[10] = byte.Parse(strs2[1]);
bytes[11] = byte.Parse(strs2[2]);
bytes[12] = byte.Parse(strs2[3]);
bytes[13] = (byte)(receivePort % 256);
bytes[14] = (byte)(receivePort / 256);
bytes[15] = frameNum;
bytes[16] = functionNum;
bytes[17] = dataLen;
for (int i = 0; i < dataLen; i++)
bytes[13] = (byte)(ReceivePort % 256);
bytes[14] = (byte)(ReceivePort / 256);
bytes[15] = FrameNum;
bytes[16] = FunctionNum;
bytes[17] = DataLen;
for (int i = 0; i < DataLen; i++)
{
bytes[18 + i] = data[i];
bytes[18 + i] = Data[i];
}
bytes[bytes.Length - 1] = CRC8.CRC(bytes, 0, bytes.Length - 1);
Console.WriteLine("发送指令:" + ToHexString(bytes));
return bytes;
}
private string ToHexString(byte[] bytes)
public static string ToHexString(byte[] bytes)
{
string hexString = string.Empty;
if (bytes != null)
if (bytes == null) return string.Empty;
StringBuilder builder = new();
for (int i = 0; i < bytes.Length; i++)
{
StringBuilder strB = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
strB.Append(bytes[i].ToString("X2") + " ");
}
hexString = strB.ToString();
builder.Append(bytes[i].ToString("X2") + " ");
}
return hexString;
return builder.ToString();
}
}

6
JiLinApp.Docking/VibrateAlarm/Entity/DataRequest.cs

@ -2,13 +2,11 @@
public class DataRequest
{
public DataMessage request { get; set; }
public DataMessage Request { get; set; }
public DataMessage responce { get; set; }
public DataMessage Responce { get; set; }
public DataRequest()
{
responce = null;
request = null;
}
}

6
JiLinApp.Docking/VibrateAlarm/Entity/SectionState.cs → JiLinApp.Docking/VibrateAlarm/Entity/SensorState.cs

@ -1,6 +1,6 @@
namespace JiLinApp.Docking.VibrateAlarm;
public class SectionState
public class SensorState
{
public int deviceID { get; set; }
@ -39,7 +39,7 @@ public class SectionState
}
}
public SectionState(int id, int chan, int state)
public SensorState(int id, int chan, int state)
{
deviceID = id;
channel = chan.ToString();
@ -47,7 +47,7 @@ public class SectionState
alarm = state / 2 % 2;
}
public SectionState(int id, int chan, int on, int a)
public SensorState(int id, int chan, int on, int a)
{
deviceID = id;
channel = chan.ToString();

2
JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHostMessage.cs

@ -5,8 +5,8 @@ namespace JiLinApp.Docking.VibrateAlarm;
public class TcpAlarmHostMessage
{
public int Id { get; set; }
public string AlarmId { get; set; }//CID代码
public string AlarmTime { get; set; }//报警时间
public string CID { get; set; }//CID代码
/*设备信息*/
public int DeviceID { get; set; }//设备唯一ID

12
JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHostTable.cs

@ -2,15 +2,15 @@
public class TcpAlarmHostTable
{
public int id { get; set; }
public int Id { get; set; }
public string name { get; set; }
public string Name { get; set; }
public string lat { get; set; }
public string Ip { get; set; }
public string lng { get; set; }
public string Port { get; set; }
public string ip { get; set; }
public string Lat { get; set; }
public string port { get; set; }
public string Lng { get; set; }
}

17
JiLinApp.Docking/VibrateAlarm/Entity/TcpSectionTable.cs

@ -1,17 +0,0 @@
namespace JiLinApp.Docking.VibrateAlarm;
public class TcpSectionTable
{
public int id { get; set; }
public int deviceID { get; set; }
public string name { get; set; }
public string lat { get; set; }
public string lng { get; set; }
public string channel { get; set; }
public string mode { get; set; }
public string sensitivity { get; set; }
}

20
JiLinApp.Docking/VibrateAlarm/Entity/TcpSensorTable.cs

@ -0,0 +1,20 @@
namespace JiLinApp.Docking.VibrateAlarm;
public class TcpSensorTable
{
public int Id { get; set; }
public int DeviceId { get; set; }
public string Name { get; set; }
public string Lat { get; set; }
public string Lng { get; set; }
public string Channel { get; set; }
public string Mode { get; set; }
public string Sensitivity { get; set; }
}

468
JiLinApp.Docking/VibrateAlarm/Service/AsyncTcpServer.cs

@ -10,101 +10,89 @@ public class AsyncTcpServer : IDisposable
{
#region Fields
private TcpListener _listener;
private ConcurrentDictionary<string, TcpClientState> _clients;
private bool _disposed = false;
private TcpListener Listener { get; set; }
private ConcurrentDictionary<string, TcpClientState> Clients { get; }
#region Properties
/// <summary>
/// 监听的IP地址
/// </summary>
public IPAddress Address { get; private set; }
/// <summary>
/// 监听的端口
/// </summary>
public int Port { get; private set; }
/// <summary>
/// 通信使用的编码
/// </summary>
public Encoding Encoding { get; set; }
public bool Disposed { get; private set; }
#endregion Properties
#endregion Fields
#region Ctors
private byte[] inOptionValues;
private byte[] InOptionValues { get; set; }
/// <summary>
/// 异步TCP服务器
/// </summary>
/// <param name="listenPort">监听的端口</param>
public AsyncTcpServer(int listenPort)
: this(IPAddress.Any, listenPort)
/// <param name="port">监听的端口</param>
public AsyncTcpServer(int port) : this(IPAddress.Any, port)
{
uint dummy = 0;
inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
}
/// <summary>
/// 异步TCP服务器
/// </summary>
/// <param name="localEP">监听的终结点</param>
public AsyncTcpServer(IPEndPoint localEP)
: this(localEP.Address, localEP.Port)
/// <param name="ipep">监听的终结点</param>
public AsyncTcpServer(IPEndPoint ipep) : this(ipep.Address, ipep.Port)
{
uint dummy = 0;
inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
}
/// <summary>
/// 异步TCP服务器
/// </summary>
/// <param name="localIPAddress">监听的IP地址</param>
/// <param name="listenPort">监听的端口</param>
public AsyncTcpServer(IPAddress localIPAddress, int listenPort)
/// <param name="address">监听的IP地址</param>
/// <param name="port">监听的端口</param>
public AsyncTcpServer(IPAddress address, int port)
{
uint dummy = 0;
inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)1000).CopyTo(inOptionValues, Marshal.SizeOf(dummy) * 2);
Address = localIPAddress;
Port = listenPort;
InOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(InOptionValues, 0);
BitConverter.GetBytes((uint)1000).CopyTo(InOptionValues, Marshal.SizeOf(dummy));
BitConverter.GetBytes((uint)1000).CopyTo(InOptionValues, Marshal.SizeOf(dummy) * 2);
Address = address;
Port = port;
Encoding = Encoding.Default;
Listener = new(address, port);
Clients = new();
Listener.AllowNatTraversal(true);
}
_clients = new ConcurrentDictionary<string, TcpClientState>();
_listener = new TcpListener(Address, Port);
_listener.AllowNatTraversal(true);
~AsyncTcpServer()
{
Stop();
}
#endregion Ctors
#region Properties
/// <summary>
/// 服务器是否正在运行
/// </summary>
public bool IsRunning { get; private set; }
/// <summary>
/// 监听的IP地址
/// </summary>
public IPAddress Address { get; private set; }
/// <summary>
/// 监听的端口
/// </summary>
public int Port { get; private set; }
/// <summary>
/// 通信使用的编码
/// </summary>
public Encoding Encoding { get; set; }
#endregion Properties
#region Server
/// <summary>
/// 启动服务器
/// </summary>
/// <returns>异步TCP服务器</returns>
public AsyncTcpServer Start()
public void Start()
{
return Start(30);
Start(30);
}
/// <summary>
@ -112,216 +100,194 @@ public class AsyncTcpServer : IDisposable
/// </summary>
/// <param name="backlog">服务器所允许的挂起连接序列的最大长度</param>
/// <returns>异步TCP服务器</returns>
public AsyncTcpServer Start(int backlog)
public void Start(int backlog)
{
if (IsRunning) return this;
IsRunning = true;
_listener.Start(backlog);
ContinueAcceptTcpClient(_listener);
return this;
if (IsRunning()) return;
try
{
Listener.Start(backlog);
AcceptTcpClient(Listener);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 停止服务器
/// </summary>
/// <returns>异步TCP服务器</returns>
public AsyncTcpServer Stop()
public void Stop()
{
if (!IsRunning) return this;
if (!IsRunning()) return;
try
{
_listener.Stop();
foreach (var client in _clients.Values)
{
client.TcpClient.Client.Disconnect(false);
}
_clients.Clear();
Listener.Stop();
}
catch (ObjectDisposedException ex)
catch (Exception)
{
Console.WriteLine("对象注销错误:" + ex.Message);
throw;
}
catch (SocketException ex)
finally
{
Console.WriteLine("socket错误:" + ex.Message);
foreach (var client in Clients.Values)
{
client.TcpClient.Client.Disconnect(false);
}
Clients.Clear();
}
IsRunning = false;
}
return this;
public bool IsRunning()
{
return Listener != null && Listener.Server.IsBound;
}
private void ContinueAcceptTcpClient(TcpListener tcpListener)
public ICollection<TcpClientState> GetAllClient()
{
try
{
tcpListener.BeginAcceptTcpClient(new AsyncCallback(HandleTcpClientAccepted), tcpListener);
}
catch (ObjectDisposedException ex)
{
Console.WriteLine("对象注销错误:" + ex.Message);
}
catch (SocketException ex)
{
Console.WriteLine("socket错误:" + ex.Message);
}
return Clients.Values;
}
#endregion Server
#region Receive
private void HandleTcpClientAccepted(IAsyncResult ar)
private void AcceptTcpClient(TcpListener listener)
{
if (!IsRunning) return;
listener.BeginAcceptTcpClient(HandleTcpClientAccepted, listener);
}
TcpListener tcpListener;
TcpClient tcpClient;
private void ReadBuffer(TcpClientState internalClient, NetworkStream networkStream)
{
networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient);
}
private void HandleTcpClientAccepted(IAsyncResult ar)
{
if (!IsRunning()) return;
TcpListener? listener;
TcpClient? client;
try
{
tcpListener = (TcpListener)ar.AsyncState;
tcpClient = tcpListener.EndAcceptTcpClient(ar);
tcpClient.Client.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null);
listener = ar.AsyncState as TcpListener;
client = listener?.EndAcceptTcpClient(ar);
client?.Client.IOControl(IOControlCode.KeepAliveValues, InOptionValues, null);
}
catch (ObjectDisposedException ex)
catch (Exception)
{
Console.WriteLine("对象注销错误:" + ex.Message);
return;
throw;
}
if (!tcpClient.Connected) return;
if (listener == null || client == null || !client.Connected) return;
byte[] buffer = new byte[tcpClient.ReceiveBufferSize];
TcpClientState internalClient = new TcpClientState(tcpClient, buffer);
byte[] buffer = new byte[client.ReceiveBufferSize];
TcpClientState internalClient = new(client, buffer);
// add client connection to cache
string tcpClientKey = internalClient.TcpClient.Client.RemoteEndPoint.ToString();
_clients.AddOrUpdate(tcpClientKey, internalClient, (n, o) => { return internalClient; });
RaiseClientConnected(tcpClient);
string clientKey = client.Client.RemoteEndPoint?.ToString() ?? "";
if (clientKey == "") return;
Clients.AddOrUpdate(clientKey, internalClient, (n, o) => { return internalClient; });
RaiseClientConnected(client);
// begin to read data
NetworkStream networkStream = internalClient.NetworkStream;
ContinueReadBuffer(internalClient, networkStream);
// keep listening to accept next connection
ContinueAcceptTcpClient(tcpListener);
}
private void HandleDatagramReceived(IAsyncResult ar)
{
if (!IsRunning) return;
try
{
TcpClientState internalClient = (TcpClientState)ar.AsyncState;
if (!internalClient.TcpClient.Connected) return;
NetworkStream networkStream = internalClient.NetworkStream;
int numberOfReadBytes = 0;
try
{
// if the remote host has shutdown its connection,
// read will immediately return with zero bytes.
numberOfReadBytes = networkStream.EndRead(ar);
}
catch (Exception ex)
{
Console.WriteLine("错误:" + ex.Message);
numberOfReadBytes = 0;
}
if (numberOfReadBytes == 0)
{
// connection has been closed
TcpClientState internalClientToBeThrowAway;
string tcpClientKey = internalClient.TcpClient.Client.RemoteEndPoint.ToString();
_clients.TryRemove(tcpClientKey, out internalClientToBeThrowAway);
RaiseClientDisconnected(internalClient.TcpClient);
return;
}
// received byte and trigger event notification
byte[] receivedBytes = new byte[numberOfReadBytes];
Buffer.BlockCopy(internalClient.Buffer, 0, receivedBytes, 0, numberOfReadBytes);
RaiseDatagramReceived(internalClient, receivedBytes);
// continue listening for tcp datagram packets
ContinueReadBuffer(internalClient, networkStream);
ReadBuffer(internalClient, networkStream);
}
catch (InvalidOperationException ex)
catch (Exception)
{
Console.WriteLine("错误:" + ex.Message);
Clients.TryRemove(clientKey, out _);
RaiseClientDisconnected(internalClient.TcpClient);
return;
}
// keep listening to accept next connection
AcceptTcpClient(listener);
}
private void ContinueReadBuffer(TcpClientState internalClient, NetworkStream networkStream)
private void HandleDatagramReceived(IAsyncResult ar)
{
if (!IsRunning()) return;
TcpClientState? internalClient = ar.AsyncState as TcpClientState;
if (internalClient == null) return;
string clientKey = internalClient.TcpClient.Client.RemoteEndPoint?.ToString() ?? "";
if (clientKey == "") return;
if (!internalClient.TcpClient.Connected)
{
// connection has been closed
Clients.TryRemove(clientKey, out _);
RaiseClientDisconnected(internalClient.TcpClient);
}
NetworkStream networkStream;
int readBytesNum;
try
{
networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient);
networkStream = internalClient.NetworkStream;
// if the remote host has shutdown its connection,
// read will immediately return with zero bytes.
readBytesNum = networkStream.EndRead(ar);
}
catch (ObjectDisposedException ex)
catch (Exception)
{
Console.WriteLine("对象注销错误:" + ex.Message);
throw;
}
if (readBytesNum == 0)
{
// connection has been closed
Clients.TryRemove(clientKey, out _);
RaiseClientDisconnected(internalClient.TcpClient);
return;
}
// received byte and trigger event notification
byte[] receivedBytes = new byte[readBytesNum];
Buffer.BlockCopy(internalClient.Buffer, 0, receivedBytes, 0, readBytesNum);
RaiseDatagramReceived(internalClient, receivedBytes);
// continue listening for tcp datagram packets
ReadBuffer(internalClient, networkStream);
}
#endregion Receive
#region Events
#region Register Events
/// <summary>
/// 接收到数据报文事件
/// 与客户端的连接已建立事件
/// </summary>
public event EventHandler<TcpDatagramReceivedEventArgs<byte[]>> DatagramReceived;
private void RaiseDatagramReceived(TcpClientState sender, byte[] datagram)
{
if (DatagramReceived != null)
{
DatagramReceived(this, new TcpDatagramReceivedEventArgs<byte[]>(sender, datagram));
}
}
public event EventHandler<TcpClientConnectedEventArgs>? ClientConnected;
/// <summary>
/// 与客户端的连接已建立事件
/// 与客户端的连接已断开事件
/// </summary>
public event EventHandler<TcpClientConnectedEventArgs> ClientConnected;
public event EventHandler<TcpClientDisconnectedEventArgs>? ClientDisconnected;
/// <summary>
/// 与客户端的连接已断开事件
/// 接收到数据报文事件
/// </summary>
public event EventHandler<TcpClientDisconnectedEventArgs> ClientDisconnected;
public event EventHandler<TcpDatagramReceivedEventArgs<byte[]>>? DatagramReceived;
private void RaiseClientConnected(TcpClient tcpClient)
private void RaiseClientConnected(TcpClient client)
{
if (ClientConnected != null)
{
ClientConnected(this, new TcpClientConnectedEventArgs(tcpClient));
}
ClientConnected?.Invoke(this, new TcpClientConnectedEventArgs(client));
}
private void RaiseClientDisconnected(TcpClient tcpClient)
private void RaiseClientDisconnected(TcpClient client)
{
if (ClientDisconnected != null)
{
ClientDisconnected(this, new TcpClientDisconnectedEventArgs(tcpClient));
}
ClientDisconnected?.Invoke(this, new TcpClientDisconnectedEventArgs(client));
}
#endregion Events
#region Send
private void GuardRunning()
private void RaiseDatagramReceived(TcpClientState sender, byte[] datagram)
{
if (!IsRunning)
throw new InvalidProgramException("This TCP server has not been started yet.");
DatagramReceived?.Invoke(this, new TcpDatagramReceivedEventArgs<byte[]>(sender, datagram));
}
#endregion Register Events
#region Send
/// <summary>
/// 发送报文至指定的客户端
/// </summary>
@ -329,25 +295,19 @@ public class AsyncTcpServer : IDisposable
/// <param name="datagram">报文</param>
public void Send(TcpClient tcpClient, byte[] datagram)
{
GuardRunning();
if (tcpClient == null)
throw new ArgumentNullException("tcpClient");
if (datagram == null)
throw new ArgumentNullException("datagram");
if (!IsRunning()) return;
if (tcpClient == null || !tcpClient.Connected || datagram == null) return;
try
{
NetworkStream stream = tcpClient.GetStream();
if (stream.CanWrite)
{
stream.BeginWrite(datagram, 0, datagram.Length, HandleDatagramWritten, tcpClient);
stream.Write(datagram, 0, datagram.Length);
}
}
catch (ObjectDisposedException ex)
catch (Exception)
{
Console.WriteLine("对象注销错误:" + ex.Message);
throw;
}
}
@ -367,76 +327,43 @@ public class AsyncTcpServer : IDisposable
/// <param name="datagram">报文</param>
public void SendToAll(byte[] datagram)
{
GuardRunning();
foreach (var client in _clients.Values)
if (!IsRunning()) return;
foreach (var client in Clients.Values)
{
Send(client.TcpClient, datagram);
}
}
public ICollection<TcpClientState> GetAllClient()
{
return _clients.Values;
}
/// <summary>
/// 发送报文至所有客户端
/// </summary>
/// <param name="datagram">报文</param>
public void SendToAll(string datagram)
{
GuardRunning();
if (!IsRunning()) return;
SendToAll(Encoding.GetBytes(datagram));
}
private void HandleDatagramWritten(IAsyncResult ar)
{
try
{
((TcpClient)ar.AsyncState).GetStream().EndWrite(ar);
}
catch (ObjectDisposedException ex)
{
Console.WriteLine("对象注销错误:" + ex.Message);
}
catch (InvalidOperationException ex)
{
Console.WriteLine("错误:" + ex.Message);
}
catch (IOException ex)
{
Console.WriteLine("错误:" + ex.Message);
}
}
/// <summary>
/// 发送报文至指定的客户端
/// </summary>
/// <param name="tcpClient">客户端</param>
/// <param name="datagram">报文</param>
public void SyncSend(TcpClient tcpClient, byte[] datagram)
public void SendAsync(TcpClient tcpClient, byte[] datagram)
{
GuardRunning();
if (tcpClient == null)
throw new ArgumentNullException("tcpClient");
if (datagram == null)
throw new ArgumentNullException("datagram");
if (!IsRunning()) return;
if (tcpClient == null || !tcpClient.Connected || datagram == null) return;
try
{
NetworkStream stream = tcpClient.GetStream();
if (stream.CanWrite)
{
stream.Write(datagram, 0, datagram.Length);
stream.BeginWrite(datagram, 0, datagram.Length, HandleDatagramWritten, tcpClient);
}
}
catch (ObjectDisposedException ex)
catch (Exception)
{
Console.WriteLine("对象注销错误:" + ex.Message);
throw;
}
}
@ -445,22 +372,21 @@ public class AsyncTcpServer : IDisposable
/// </summary>
/// <param name="tcpClient">客户端</param>
/// <param name="datagram">报文</param>
public void SyncSend(TcpClient tcpClient, string datagram)
public void SendAsync(TcpClient tcpClient, string datagram)
{
SyncSend(tcpClient, Encoding.GetBytes(datagram));
SendAsync(tcpClient, Encoding.GetBytes(datagram));
}
/// <summary>
/// 发送报文至所有客户端
/// </summary>
/// <param name="datagram">报文</param>
public void SyncSendToAll(byte[] datagram)
public void SendToAllAsync(byte[] datagram)
{
GuardRunning();
foreach (var client in _clients.Values)
if (!IsRunning()) return;
foreach (var client in Clients.Values)
{
SyncSend(client.TcpClient, datagram);
SendAsync(client.TcpClient, datagram);
}
}
@ -468,11 +394,15 @@ public class AsyncTcpServer : IDisposable
/// 发送报文至所有客户端
/// </summary>
/// <param name="datagram">报文</param>
public void SyncSendToAll(string datagram)
public void SendToAllAsync(string datagram)
{
GuardRunning();
if (!IsRunning()) return;
SendToAllAsync(Encoding.GetBytes(datagram));
}
SyncSendToAll(Encoding.GetBytes(datagram));
private void HandleDatagramWritten(IAsyncResult ar)
{
(ar.AsyncState as TcpClient)?.GetStream().EndWrite(ar);
}
#endregion Send
@ -495,26 +425,10 @@ public class AsyncTcpServer : IDisposable
/// <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool disposing)
{
if (!_disposed)
if (!Disposed)
{
if (disposing)
{
try
{
Stop();
if (_listener != null)
{
_listener = null;
}
}
catch (SocketException ex)
{
Console.WriteLine("socket错误:" + ex.Message);
}
}
_disposed = true;
if (disposing) Stop();
Disposed = true;
}
}

15
JiLinApp.Docking/VibrateAlarm/Service/TcpClientConnectedEventArgs.cs

@ -7,20 +7,17 @@ namespace JiLinApp.Docking.VibrateAlarm;
/// </summary>
public class TcpClientConnectedEventArgs : EventArgs
{
/// <summary>
/// 客户端
/// </summary>
public TcpClient TcpClient { get; private set; }
/// <summary>
/// 与客户端的连接已建立事件参数
/// </summary>
/// <param name="tcpClient">客户端</param>
public TcpClientConnectedEventArgs(TcpClient tcpClient)
{
if (tcpClient == null)
throw new ArgumentNullException("tcpClient");
TcpClient = tcpClient;
TcpClient = tcpClient ?? throw new ArgumentNullException(nameof(tcpClient));
}
/// <summary>
/// 客户端
/// </summary>
public TcpClient TcpClient { get; private set; }
}

15
JiLinApp.Docking/VibrateAlarm/Service/TcpClientDisconnectedEventArgs.cs

@ -7,20 +7,17 @@ namespace JiLinApp.Docking.VibrateAlarm;
/// </summary>
public class TcpClientDisconnectedEventArgs : EventArgs
{
/// <summary>
/// 客户端
/// </summary>
public TcpClient TcpClient { get; private set; }
/// <summary>
/// 与客户端的连接已断开事件参数
/// </summary>
/// <param name="tcpClient">客户端</param>
public TcpClientDisconnectedEventArgs(TcpClient tcpClient)
{
if (tcpClient == null)
throw new ArgumentNullException("tcpClient");
TcpClient = tcpClient;
TcpClient = tcpClient ?? throw new ArgumentNullException(nameof(tcpClient));
}
/// <summary>
/// 客户端
/// </summary>
public TcpClient TcpClient { get; private set; }
}

22
JiLinApp.Docking/VibrateAlarm/Service/TcpDatagramReceivedEventArgs.cs

@ -6,17 +6,6 @@
/// <typeparam name="T">报文类型</typeparam>
public class TcpDatagramReceivedEventArgs<T> : EventArgs
{
/// <summary>
/// 接收到数据报文事件参数
/// </summary>
/// <param name="tcpClient">客户端</param>
/// <param name="datagram">报文</param>
public TcpDatagramReceivedEventArgs(TcpClientState tcpClient, T datagram)
{
TcpClient = tcpClient;
Datagram = datagram;
}
/// <summary>
/// 客户端
/// </summary>
@ -26,4 +15,15 @@ public class TcpDatagramReceivedEventArgs<T> : EventArgs
/// 报文
/// </summary>
public T Datagram { get; private set; }
/// <summary>
/// 接收到数据报文事件参数
/// </summary>
/// <param name="tcpClient">客户端</param>
/// <param name="datagram">报文</param>
public TcpDatagramReceivedEventArgs(TcpClientState tcpClient, T datagram)
{
TcpClient = tcpClient ?? throw new ArgumentNullException(nameof(tcpClient));
Datagram = datagram;
}
}

856
JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs

File diff suppressed because it is too large

4410
JiLinApp.Docking/config/alarmcode.json

File diff suppressed because it is too large

10
JiLinApp/Components/CameraRealPlay.xaml

@ -0,0 +1,10 @@
<Window x:Class="JiLinApp.Components.CameraRealPlay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="RealPlay" Height="430" Width="640" ShowInTaskbar=" False">
<Image Name="player">
</Image>
</Window>

29
JiLinApp/Components/HikRealPlay.xaml.cs → JiLinApp/Components/CameraRealPlay.xaml.cs

@ -7,25 +7,20 @@ using System.Windows.Interop;
namespace JiLinApp.Components;
/// <summary>
/// HikRealPlay.xaml 的交互逻辑
/// CameraRealPlay.xaml 的交互逻辑
/// </summary>
public partial class HikRealPlay : Window
public partial class CameraRealPlay : Window
{
#region
private HiKSDK hikSdk { get; }
private ICameraSDK CameraSdk { get; }
#endregion
public HikRealPlay(HiKSDK hikSdk)
public CameraRealPlay(ICameraSDK cameraSdk)
{
InitializeComponent();
this.hikSdk = hikSdk;
}
~HikRealPlay()
{
StopPlay();
CameraSdk = cameraSdk;
}
#region Base
@ -33,15 +28,16 @@ public partial class HikRealPlay : Window
public void StartPlay()
{
IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(player)).Handle;
hikSdk.StartPlay(hwnd);
CameraSdk.StartPlay(hwnd);
}
public void StopPlay()
{
hikSdk.StopPlay();
CameraSdk.StopPlay();
}
#endregion
private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000;
private const int WS_MINIMIZEBOX = 0x20000;
@ -84,5 +80,14 @@ public partial class HikRealPlay : Window
SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED);
}
public bool IsClosed { get; private set; }
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
IsClosed = true;
StopPlay();
}
#endregion
}

10
JiLinApp/Components/HikRealPlay.xaml

@ -1,10 +0,0 @@
<Window x:Class="JiLinApp.Components.HikRealPlay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="HikRealPlay" Height="430" Width="640" ShowInTaskbar="False">
<Image Name="player">
</Image>
</Window>

1
JiLinApp/Core/Global.cs

@ -45,6 +45,7 @@ public static class Global
public static void Init()
{
LogUnit.Init();
AlarmCodeHelper.Init();
}
}

11
JiLinApp/Core/LogUnit.cs

@ -1,5 +1,7 @@
using log4net;
using log4net.Config;
using System;
using System.IO;
namespace JiLinApp.Core;
@ -9,8 +11,13 @@ public static class LogUnit
static LogUnit()
{
log4net.Config.XmlConfigurator.Configure();
logger = LogManager.GetLogger("root");
string fileName = Path.Combine("config", "log4net.Config");
XmlConfigurator.Configure(new FileInfo(fileName));
logger = LogManager.GetLogger(typeof(LogUnit));
}
public static void Init()
{
}
public static void Debug(string msg)

1
JiLinApp/JiLinApp.csproj

@ -20,7 +20,6 @@
<PackageReference Include="MaterialDesignThemes" Version="4.8.0">
<TreatAsUsed>true</TreatAsUsed>
</PackageReference>
<PackageReference Include="NewLife.Core" Version="10.2.2023.301" />
<PackageReference Include="Prism.DryIoc" Version="8.1.97" />
</ItemGroup>
<ItemGroup>

2
JiLinApp/Mvvm/ViewModelBase.cs

@ -11,7 +11,7 @@ public abstract class AbstractViewModelBase : BindableBase
protected IRegionManager _region { get; set; }
protected IEventAggregator _ea { get; set; }
#endregion fields
#endregion Fields
public AbstractViewModelBase(IRegionManager region, IEventAggregator ea)
{

8
JiLinApp/Pages/FenceServerManage/Main.xaml

@ -27,15 +27,9 @@
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Margin="5">
<TextBox Name="ServerIp" materialDesign:HintAssist.Hint="服务地址" Text="127.0.0.1" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="5">
<TextBox Name="ServerPort" materialDesign:HintAssist.Hint="服务端口" Text="5080" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
<TextBox Name="ServerPort" materialDesign:HintAssist.Hint="本地端口" Text="23039" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Margin="5">
<TextBox Name="DevicePort" materialDesign:HintAssist.Hint="设备端口" Text="5080" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" Margin="5">
<TextBox Name="DeviceHeartKeep" materialDesign:HintAssist.Hint="设备心跳间隔" Text="10" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1">

9
JiLinApp/Pages/FenceServerManage/Main.xaml.cs

@ -1,5 +1,4 @@
using JiLinApp.Core;
using JiLinApp.Docking.FenceAlarm;
using JiLinApp.Docking.FenceAlarm;
using System;
using System.Windows;
using System.Windows.Controls;
@ -32,8 +31,8 @@ public partial class Main : UserControl
MainViewModel vm = DataContext as MainViewModel;
vm.SetView(this);
//Manager.OnUdpAlarmDeviceState += vm.OnUdpAlarmDeviceState;
//Manager.OnUdpAlarmSectionState += vm.OnUdpAlarmSectionState;
Manager.OnUdpAlarmDeviceState += vm.OnUdpAlarmDeviceState;
Manager.OnUdpAlarmSectionState += vm.OnUdpAlarmSectionState;
Manager.OnUdpAlarmEvent += vm.OnUdpAlarmEvent;
}
}
@ -62,9 +61,7 @@ public partial class Main : UserControl
{
UdpManagerConfig config = new()
{
ServerIp = ServerIp.Text,
ServerPort = int.Parse(ServerPort.Text),
DevicePort = int.Parse(DevicePort.Text),
DeviceHeartKeep = int.Parse(DeviceHeartKeep.Text)
};
Manager.StartServer(config);

2
JiLinApp/Pages/Main/MainWindow.xaml

@ -35,7 +35,7 @@
</TabItem.Header>
<fenceManage:Main materialDesign:ColorZoneAssist.Mode="PrimaryLight" Margin="10"></fenceManage:Main>
</TabItem>
<TabItem Width="auto" Margin="5 0 5 0" IsEnabled="False">
<TabItem Width="auto" Margin="5 0 5 0" Visibility="Hidden">
<TabItem.Header>
<StackPanel Width="auto" Height="auto">
<materialDesign:PackIcon Width="24" Height="24" HorizontalAlignment="Center" Kind="CogOutline" />

2
JiLinApp/Pages/PtzManage/Main.xaml

@ -161,7 +161,7 @@
</StackPanel>
</Grid>
<StackPanel Grid.Column="2">
<StackPanel Grid.Column="2">
<ComboBox Name="PresetId" materialDesign:HintAssist.Hint="预置点Id" Width="200" SelectedIndex="0" Style="{StaticResource MaterialDesignOutlinedComboBox}">
</ComboBox>
<Button Name="GotoBtn" Content="前往预置点" Width="120" Margin="0 10 0 0" Click="GotoBtn_Click" Style="{StaticResource MaterialDesignRaisedLightButton}" />

139
JiLinApp/Pages/PtzManage/Main.xaml.cs

@ -1,6 +1,7 @@
using EC.Util.CameraSDK;
using EC.Util.Port;
using ImTools;
using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Components;
using JiLinApp.Core;
using JiLinApp.Docking.Ptz;
@ -29,7 +30,7 @@ public partial class Main : UserControl
private YcSerialPort Port { get; set; }
private ConcurrentDictionary<string, HiKSDK> HikMap { get; } = new();
private ConcurrentDictionary<string, ICameraSDK> CameraSdkMap { get; } = new();
#endregion Fields
@ -58,7 +59,7 @@ public partial class Main : UserControl
}
// 解析海康相机
TaskUtil.RunCatch(() => Dispatcher.Invoke(LoadHikCamera));
TaskUtil.RunCatch(() => Dispatcher.Invoke(LoadCameraList));
// 初始化云台控制类型
foreach (var cfg in Global.AppConfig.ptzCtrlTypes)
@ -70,6 +71,10 @@ public partial class Main : UserControl
for (int i = 1; i <= 5; i++)
{
CameraId.Items.Add(new ComboBoxItem { Content = i });
}
for (int i = 1; i <= 6; i++)
{
PresetId.Items.Add(new ComboBoxItem { Content = i });
}
@ -157,22 +162,22 @@ public partial class Main : UserControl
case PtzControlType.PelcoP:
if (!IsConnect()) break;
byte cameraId = byte.Parse(CameraId.Text);
byte[] cmd = PtzCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
break;
case PtzControlType.DCamera:
if (!IsConnect()) break;
cmd = PtzCmd.GetCmd(ctrlType, cmdType);
cmd = PtzComCmd.GetCmd(ctrlType, cmdType);
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
break;
case PtzControlType.HikSdk:
case PtzControlType.CameraSdk:
string cameraIp = CameraIp.Text;
HikMap.TryGetValue(cameraIp, out HiKSDK hikSdk);
if (hikSdk == null) break;
uint stop = 0, speed = 4;
PtzCmd.HikPtzMove(ref hikSdk, cmdType, new uint[] { stop, speed });
CameraSdkMap.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
if (cameraSdk == null) break;
int stop = 0;
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { stop });
break;
default: break;
@ -190,17 +195,24 @@ public partial class Main : UserControl
if (!IsConnect()) break;
cmdType = PtzCmd.GetCmdType("Stop");
byte cameraId = byte.Parse(CameraId.Text);
byte[] cmd = PtzCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId });
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
break;
case PtzControlType.DCamera:
if (!IsConnect()) break;
cmdType = PtzCmd.GetCmdType("Stop");
cmd = PtzComCmd.GetCmd(ctrlType, cmdType);
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
break;
case PtzControlType.HikSdk:
case PtzControlType.CameraSdk:
string cameraIp = CameraIp.Text;
HikMap.TryGetValue(cameraIp, out HiKSDK hikSdk);
if (hikSdk == null) break;
CameraSdkMap.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
if (cameraSdk == null) break;
cmdType = PtzCmd.GetCmdType(((Button)sender).Name.Replace("Btn", ""));
uint stop = 1, speed = 4;
PtzCmd.HikPtzMove(ref hikSdk, cmdType, new uint[] { stop, speed });
int stop = 1;
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { stop });
break;
default: break;
@ -219,15 +231,15 @@ public partial class Main : UserControl
case PtzControlType.PelcoP:
if (!IsConnect()) break;
byte cameraId = byte.Parse(CameraId.Text);
byte[] cmd = PtzCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId, presetId });
byte[] cmd = PtzComCmd.GetCmd(ctrlType, cmdType, new object[] { cameraId, presetId });
if (cmd != null && cmd.Length > 0) Port.SendHex(cmd);
break;
case PtzControlType.HikSdk:
case PtzControlType.CameraSdk:
string cameraIp = CameraIp.Text;
HikMap.TryGetValue(cameraIp, out HiKSDK hikSdk);
if (hikSdk == null) break;
PtzCmd.HikPtzMove(ref hikSdk, cmdType, new uint[] { presetId });
CameraSdkMap.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
if (cameraSdk == null) break;
PtzCameraCmd.PtzMove(cameraSdk, cmdType, new int[] { presetId });
break;
default: break;
@ -236,6 +248,17 @@ public partial class Main : UserControl
private void TestBtn_Click(object sender, RoutedEventArgs e)
{
AlarmMessage alarm = new();
alarm.ChannelNum = Convert.ToInt32(PresetId.Text);
if (PresetId.Text == "5")
{
PresetId.Text = "6";
}
else
{
PresetId.Text = "5";
}
GotoPresetInvoke(null);
}
private void ControlType_SelectionChanged(object sender, SelectionChangedEventArgs e)
@ -248,11 +271,12 @@ public partial class Main : UserControl
{
case PtzControlType.PelcoD:
case PtzControlType.PelcoP:
case PtzControlType.DCamera:
CameraId.IsEnabled = true;
CameraIp.IsEnabled = false;
break;
case PtzControlType.HikSdk:
case PtzControlType.CameraSdk:
CameraId.IsEnabled = false;
CameraIp.IsEnabled = true;
break;
@ -274,11 +298,12 @@ public partial class Main : UserControl
{
case PtzControlType.PelcoD:
case PtzControlType.PelcoP:
case PtzControlType.DCamera:
CameraId.IsEnabled = true;
CameraIp.IsEnabled = false;
break;
case PtzControlType.HikSdk:
case PtzControlType.CameraSdk:
CameraId.IsEnabled = false;
CameraIp.IsEnabled = true;
break;
@ -294,55 +319,87 @@ public partial class Main : UserControl
#region InvokeEvent
public void GotoPreset()
public void GotoPresetInvoke(AlarmMessage alarm)
{
if (Global.AppConfig.TransmitAlarm.RealPlay)
Dispatcher.Invoke(() =>
{
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ControlTypeName.Text);
if (ctrlType == PtzControlType.HikSdk) ShowLiveVideo();
}
GotoBtn_Click(null, null);
// 切换至下一预置点
int index = PresetId.SelectedIndex;
index = (index + 1) % PresetId.Items.Count;
PresetId.SelectedIndex = index;
if (Global.AppConfig.TransmitAlarm.RealPlay)
{
PtzControlType ctrlType = PtzControlTypeConfigHelper.GetControlType(ControlTypeName.Text);
if (ctrlType == PtzControlType.CameraSdk) ShowLiveVideo();
}
if (alarm != null)
{
if (alarm.ChannelNum <= 5)
{
PresetId.Text = "5";
}
else
{
PresetId.Text = "6";
}
// 切换至下一预置点
//int index = PresetId.SelectedIndex;
//index = (index + 1) % PresetId.Items.Count;
//PresetId.SelectedIndex = index;
GotoBtn_Click(null, null);
}
});
}
private ConcurrentDictionary<string, CameraRealPlay> RealPlayDict { get; } = new();
public void ShowLiveVideo()
{
string cameraIp = CameraIp.Text;
HikMap.TryGetValue(cameraIp, out HiKSDK hikSdk);
if (hikSdk == null) return;
HikRealPlay realPlay = new(hikSdk);
realPlay.Owner = Window.GetWindow(this);
CameraSdkMap.TryGetValue(cameraIp, out ICameraSDK cameraSdk);
if (cameraSdk == null) return;
RealPlayDict.TryGetValue(cameraIp, out CameraRealPlay realPlay);
if (realPlay == null || realPlay.IsClosed)
{
realPlay = new(cameraSdk);
realPlay.Owner = Window.GetWindow(this);
RealPlayDict[cameraIp] = realPlay;
}
realPlay.Show();
realPlay.HideMinButton();
realPlay.StartPlay();
//切换至下一相机
int index = CameraIp.SelectedIndex;
index = (index + 1) % CameraIp.Items.Count;
CameraIp.SelectedIndex = index;
}
#endregion InvokeEvent
#region HikMap
private void LoadHikCamera()
private void LoadCameraList()
{
List<CameraInfo> cameraList = Global.AppConfig.CameraList;
foreach (var item in cameraList)
{
string ip = item.Ip;
if (HikMap.ContainsKey(ip)) continue;
HikMap[ip] = null;
if (CameraSdkMap.ContainsKey(ip)) continue;
CameraSdkMap[ip] = null;
CameraIp.Items.Add(new ComboBoxItem { Content = ip });
CameraInfo info = new();
info.Copy(item);
Task.Run(() =>
{
HiKSDK sdk = new(info);
ICameraSDK sdk = (info.GetManufactor) switch
{
CameraManufactor.HiK => new HiKSDK(info),
CameraManufactor.DaHua => new DaHuaSDK(info),
CameraManufactor.YuShi => new YuShiSDK(info),
_ => throw new NotSupportedException(),
};
try
{
bool ret = sdk.Init();
if (!ret) sdk.BuildException();
HikMap[ip] = sdk;
CameraSdkMap[ip] = sdk;
}
catch (Exception ex)
{

10
JiLinApp/Pages/PtzManage/MainViewModel.cs

@ -41,14 +41,16 @@ public class MainViewModel : ViewModelBase
internal void ShakeTcpAlarmReact(TcpAlarmHostMessage msg)
{
AlarmService.SendAlarmMessage(msg.ToAlarmMessage());
View.GotoPreset();
AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarmMessage(alarm);
View.GotoPresetInvoke(alarm);
}
internal void FenceUdpAlarmReact(UdpAlarmHostMessage msg)
{
AlarmService.SendAlarmMessage(msg.ToAlarmMessage());
View.GotoPreset();
AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarmMessage(alarm);
View.GotoPresetInvoke(alarm);
}
#endregion InvokeEvent

5
JiLinApp/Pages/VibrateServerManage/Main.xaml

@ -27,10 +27,7 @@
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" Margin="5">
<TextBox Name="ServerIp" materialDesign:HintAssist.Hint="服务地址" Text="127.0.0.1" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" Margin="5">
<TextBox Name="ServerPort" materialDesign:HintAssist.Hint="服务端口" Text="5080" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
<TextBox Name="ServerPort" materialDesign:HintAssist.Hint="本地端口" Text="9000" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" Margin="5">
<TextBox Name="DeviceHeartKeep" materialDesign:HintAssist.Hint="设备心跳间隔" Text="10" Width="200" Style="{StaticResource MaterialDesignOutlinedTextBox}" />

11
JiLinApp/Pages/VibrateServerManage/Main.xaml.cs

@ -31,9 +31,9 @@ public partial class Main : UserControl
MainViewModel vm = DataContext as MainViewModel;
vm.SetView(this);
//Manager.OnTcpDeviceMessage += vm.OnTcpDeviceMessage;
//Manager.OnTcpSectionMessage += vm.OnTcpSectionMessage;
Manager.OnTcpSectionAlarmOn += vm.OnTcpSectionAlarmOn;
Manager.OnTcpDeviceMessage += vm.OnTcpDeviceMessage;
Manager.OnTcpSensorMessage += vm.OnTcpSectionMessage;
Manager.OnTcpSensorAlarm += vm.OnTcpSectionAlarm;
}
}
@ -63,11 +63,10 @@ public partial class Main : UserControl
{
TcpManagerConfig config = new()
{
ServerIp = ServerIp.Text,
ServerPort = int.Parse(ServerPort.Text),
DeviceHeartKeep = int.Parse(DeviceHeartKeep.Text)
};
Manager.StartServer(config);
Manager.Start(config);
}
catch (Exception ex)
{
@ -84,7 +83,7 @@ public partial class Main : UserControl
{
try
{
Manager.StopServer();
Manager.Stop();
}
catch (Exception)
{

4
JiLinApp/Pages/VibrateServerManage/MainViewModel.cs

@ -29,11 +29,11 @@ public class MainViewModel : ViewModelBase
{
}
internal void OnTcpSectionMessage(TcpAlarmHostTable host, TcpSectionTable section, string msg)
internal void OnTcpSectionMessage(TcpAlarmHostTable host, TcpSensorTable section, string msg)
{
}
internal void OnTcpSectionAlarmOn(TcpAlarmHostMessage msg)
internal void OnTcpSectionAlarm(TcpAlarmHostMessage msg)
{
_ea.GetEvent<ShakeTcpAlarmSendEvent>().Publish(msg);
}

6
JiLinApp/Properties/AssemblyInfo.cs

@ -3,7 +3,6 @@ using System.Runtime.InteropServices;
// 在此类的 SDK 样式项目中,现在,在此文件中早前定义的几个程序集属性将在生成期间自动添加,并使用在项目属性中定义的值进行填充。有关包含的属性以及如何定制此过程的详细信息,请参阅
// https://aka.ms/assembly-info-properties
// 将 ComVisible 设置为 false 会使此程序集中的类型对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,请将该类型的 ComVisible
// 属性设置为 true。
@ -11,7 +10,4 @@ using System.Runtime.InteropServices;
// 如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID。
[assembly: Guid("5cabd53f-59c8-426a-b4c6-233bf6dceaed")]
// 指定log4net 的配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "./config/log4net.config", Watch = true)]
[assembly: Guid("5cabd53f-59c8-426a-b4c6-233bf6dceaed")]

13
JiLinApp/config/config.json

@ -1,8 +1,12 @@
{
"base": {
"console": false
"console": true
},
"ptzCtrlTypes": [
{
"type": "CameraSdk",
"Name": "协议HDY"
},
{
"type": "PelcoD",
"Name": "协议Pd"
@ -14,27 +18,26 @@
{
"type": "DCamera",
"Name": "协议D"
},
{
"type": "HikSdk",
"Name": "协议H"
}
],
"cameraList": [
{
"manufactor": 1,
"ip": "192.168.1.65",
"port": "8000",
"username": "admin",
"password": "hk123456"
},
{
"manufactor": 1,
"ip": "192.168.1.65",
"port": "8000",
"username": "admin",
"password": "hk123456"
},
{
"manufactor": 1,
"ip": "192.168.1.65",
"port": "8000",
"username": "admin",

3
JiLinApp/config/log4net.config

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<root>
<level value="Info" />

Loading…
Cancel
Save