Browse Source

commit mqtt topic & perfect alarm forms

master
fajiao 2 years ago
parent
commit
8a2a82a45c
  1. 2
      EC.Util/CameraSDK/Common/ICameraSDK.cs
  2. 22
      EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs
  3. 27
      EC.Util/CameraSDK/DaHua/DaHuaSDK.cs
  4. 7
      EC.Util/CameraSDK/HiK/HiKOriSDK.cs
  5. 6
      EC.Util/CameraSDK/HiK/HiKSDK.cs
  6. 8
      EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs
  7. 3
      EC.Util/CameraSDK/YuShi/YuShiSDK.cs
  8. 13
      JiLinApp.Biz/TransmitAlarm/Common/Config.cs
  9. 207
      JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
  10. 27
      JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs
  11. 36
      JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs
  12. 5
      JiLinApp.Docking/FenceAlarm/Entity/SectorState.cs
  13. 1
      JiLinApp.Docking/FenceAlarm/Entity/UdpAlarmHostMessage.cs
  14. 129
      JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs
  15. 11
      JiLinApp.Docking/FenceAlarm/Service/UdpServer.cs
  16. 133
      JiLinApp.Docking/Ptz/PtzCmd.cs
  17. 42
      JiLinApp.Docking/VibrateAlarm/Entity/ClientMessage.cs
  18. 47
      JiLinApp.Docking/VibrateAlarm/Entity/SensorState.cs
  19. 8
      JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHost.cs
  20. 1
      JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHostMessage.cs
  21. 2
      JiLinApp.Docking/VibrateAlarm/Service/AsyncTcpServer.cs
  22. 244
      JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs
  23. 10
      JiLinApp.Docking/config/alarmcode.json
  24. 127
      JiLinApp/Components/CameraRealPlay.xaml
  25. 52
      JiLinApp/Components/CameraRealPlay.xaml.cs
  26. 40
      JiLinApp/Components/Core/NativeHost.cs
  27. 26
      JiLinApp/Components/Core/WpfUtil.cs
  28. 85
      JiLinApp/Pages/FenceServerManage/Main.xaml.cs
  29. 36
      JiLinApp/Pages/FenceServerManage/MainViewModel.cs
  30. 14
      JiLinApp/Pages/Main/Core/MessageEvent.cs
  31. 102
      JiLinApp/Pages/PtzManage/Main.xaml
  32. 48
      JiLinApp/Pages/PtzManage/Main.xaml.cs
  33. 13
      JiLinApp/Pages/PtzManage/MainViewModel.cs
  34. 80
      JiLinApp/Pages/VibrateServerManage/Main.xaml.cs
  35. 35
      JiLinApp/Pages/VibrateServerManage/MainViewModel.cs
  36. 12
      JiLinApp/config/config.json

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

@ -36,7 +36,7 @@ public abstract class ICameraSDK
/// <summary> /// <summary>
/// 构建异常 /// 构建异常
/// </summary> /// </summary>
public abstract void BuildException(); internal abstract void BuildException();
#endregion Base Method #endregion Base Method

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

@ -622,67 +622,67 @@ public static class DaHuaOriSDK
/// Up /// Up
/// 上 /// 上
/// </summary> /// </summary>
UP_CONTROL = 0, UP = 0,
/// <summary> /// <summary>
/// Down /// Down
/// 下 /// 下
/// </summary> /// </summary>
DOWN_CONTROL, DOWN,
/// <summary> /// <summary>
/// Left /// Left
/// 左 /// 左
/// </summary> /// </summary>
LEFT_CONTROL, LEFT,
/// <summary> /// <summary>
/// Right /// Right
/// 右 /// 右
/// </summary> /// </summary>
RIGHT_CONTROL, RIGHT,
/// <summary> /// <summary>
/// +Zoom in /// +Zoom in
/// 变倍+ /// 变倍+
/// </summary> /// </summary>
ZOOM_ADD_CONTROL, ZOOM_ADD,
/// <summary> /// <summary>
/// -Zoom out /// -Zoom out
/// 变倍- /// 变倍-
/// </summary> /// </summary>
ZOOM_DEC_CONTROL, ZOOM_DEC,
/// <summary> /// <summary>
/// +Focus /// +Focus
/// 调焦+ /// 调焦+
/// </summary> /// </summary>
FOCUS_ADD_CONTROL, FOCUS_ADD,
/// <summary> /// <summary>
/// -Focus /// -Focus
/// 调焦- /// 调焦-
/// </summary> /// </summary>
FOCUS_DEC_CONTROL, FOCUS_DEC,
/// <summary> /// <summary>
/// + Aperture /// + Aperture
/// 光圈+ /// 光圈+
/// </summary> /// </summary>
APERTURE_ADD_CONTROL, APERTURE_ADD,
/// <summary> /// <summary>
/// -Aperture /// -Aperture
/// 光圈- /// 光圈-
/// </summary> /// </summary>
APERTURE_DEC_CONTROL, APERTURE_DEC,
/// <summary> /// <summary>
/// Go to preset /// Go to preset
/// 转至预置点 /// 转至预置点
/// </summary> /// </summary>
POINT_MOVE_CONTROL, POINT_MOVE,
/// <summary> /// <summary>
/// Set /// Set

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

@ -59,7 +59,7 @@ public class DaHuaSDK : ICameraSDK
return LoginId != IntPtr.Zero; return LoginId != IntPtr.Zero;
} }
public override void BuildException() internal override void BuildException()
{ {
uint errCode = (uint)DaHuaOriSDK.CLIENT_GetLastError(); uint errCode = (uint)DaHuaOriSDK.CLIENT_GetLastError();
if (errCode == 0) return; if (errCode == 0) return;
@ -137,28 +137,21 @@ public class DaHuaSDK : ICameraSDK
public override bool PtzMove(int cmd, int stop, int speed) 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; if (!ConnectSuccess()) return false;
int channel = 0;
//DaHuaOriSDK.CLIENT_DHPTZControlEx2(); bool stopFlag = stop == 1;
bool flag = DaHuaOriSDK.CLIENT_DHPTZControlEx2(LoginId, channel, (uint)cmd, speed, speed, 0, stopFlag, IntPtr.Zero);
//if (flag) BuildException();
return true; return flag;
} }
public override bool PtzPreset(int cmd, int presetId) 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; if (!ConnectSuccess()) return false;
return true; int channel = 0;
bool flag = DaHuaOriSDK.CLIENT_DHPTZControlEx2(LoginId, channel, (uint)DaHuaOriSDK.EM_EXTPTZ_ControlType.POINT_MOVE, 0, presetId, 0, false, IntPtr.Zero);
if (flag) BuildException();
return flag;
} }
#endregion Ptz Method #endregion Ptz Method

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

@ -55,6 +55,13 @@ public static class HiKOriSDK
#region PtzMove #region PtzMove
public const int ZOOM_IN = 11;// 焦距以速度SS变大(倍率变大)
public const int ZOOM_OUT = 12;// 焦距以速度SS变小(倍率变小)
public const int FOCUS_NEAR = 13;// 焦点以速度SS前调
public const int FOCUS_FAR = 14;// 焦点以速度SS后调
public const int IRIS_OPEN = 15;// 光圈以速度SS扩大
public const int IRIS_CLOSE = 16;// 光圈以速度SS缩小
public const int TILT_UP = 21; /* 云台以SS的速度上仰 */ public const int TILT_UP = 21; /* 云台以SS的速度上仰 */
public const int TILT_DOWN = 22; /* 云台以SS的速度下俯 */ public const int TILT_DOWN = 22; /* 云台以SS的速度下俯 */
public const int PAN_LEFT = 23; /* 云台以SS的速度左转 */ public const int PAN_LEFT = 23; /* 云台以SS的速度左转 */

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

@ -46,7 +46,7 @@ public class HiKSDK : ICameraSDK
return LoginId >= 0; return LoginId >= 0;
} }
public override void BuildException() internal override void BuildException()
{ {
uint errCode = HiKOriSDK.NET_DVR_GetLastError(); uint errCode = HiKOriSDK.NET_DVR_GetLastError();
if (errCode == 0) return; if (errCode == 0) return;
@ -125,7 +125,9 @@ public class HiKSDK : ICameraSDK
{ {
if (!ConnectSuccess()) return false; if (!ConnectSuccess()) return false;
int lChannel = 1; int lChannel = 1;
return HiKOriSDK.NET_DVR_PTZControlWithSpeed_Other(LoginId, lChannel, (uint)cmd, (uint)stop, (uint)speed); bool flag = HiKOriSDK.NET_DVR_PTZControlWithSpeed_Other(LoginId, lChannel, (uint)cmd, (uint)stop, (uint)speed);
//if (flag) BuildException();
return flag;
} }
public override bool PtzPreset(int cmd, int presetId) public override bool PtzPreset(int cmd, int presetId)

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

@ -53,6 +53,14 @@ public static class YuShiOriSDK
public const int NETDEV_LEN_260 = 260; public const int NETDEV_LEN_260 = 260;
/* NETDEV_PTZ_E */ /* NETDEV_PTZ_E */
public const int IRISCLOSE_STOP = 0x0101; /* Iris close stop */
public const int IRISCLOSE = 0x0102; /* Iris close */
public const int IRISOPEN_STOP = 0x0103; /* Iris open stop */
public const int IRISOPEN = 0x0104; /* Iris open */
public const int FOCUSNEAR_STOP = 0x0201; /* Focus near stop */
public const int FOCUSNEAR = 0x0202; /* Focus near */
public const int FOCUSFAR_STOP = 0x0203; /* Focus far stop */
public const int FOCUSFAR = 0x0204; /* Focus far */
public const int ZOOMTELE_STOP = 0x0301; /* Zoom in stop */ public const int ZOOMTELE_STOP = 0x0301; /* Zoom in stop */
public const int ZOOMTELE = 0x0302; /* Zoom in */ public const int ZOOMTELE = 0x0302; /* Zoom in */
public const int ZOOMWIDE_STOP = 0x0303; /* Zoom out stop */ public const int ZOOMWIDE_STOP = 0x0303; /* Zoom out stop */

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

@ -49,7 +49,7 @@ public class YuShiSDK : ICameraSDK
return LoginId != IntPtr.Zero; return LoginId != IntPtr.Zero;
} }
public override void BuildException() internal override void BuildException()
{ {
int errCode = YuShiOriSDK.NETDEV_GetLastError(); int errCode = YuShiOriSDK.NETDEV_GetLastError();
if (errCode == 0) return; if (errCode == 0) return;
@ -91,6 +91,7 @@ public class YuShiSDK : ICameraSDK
if (stop == 1) cmd = YuShiOriSDK.ALLSTOP; if (stop == 1) cmd = YuShiOriSDK.ALLSTOP;
int channel = 1; int channel = 1;
int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed); int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed);
//if (flag) BuildException();
return flag == YuShiOriSDK.TRUE; return flag == YuShiOriSDK.TRUE;
} }

13
JiLinApp.Biz/TransmitAlarm/Common/Config.cs

@ -21,10 +21,21 @@ public class MqttConfig
public string ClientId { get; set; } public string ClientId { get; set; }
public int RetryTime { get; set; }
public int RetryInterval { get; set; }
public string PubAlarmTopic { get; set; } public string PubAlarmTopic { get; set; }
public string SubTopic { get; set; } public string PubDevicesTopic { get; set; }
public string PubSensorsTopic { get; set; }
public string PubDeviceStateTopic { get; set; }
public string PubSensorStateTopic { get; set; }
public string SubCmdTopic { get; set; }
} }
public class ZmqConfig public class ZmqConfig

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

@ -1,6 +1,9 @@
using EC.Util.Common; using EC.Util.Common;
using MQTTnet; using MQTTnet;
using MQTTnet.Client; using MQTTnet.Client;
using MQTTnet.Exceptions;
using NewLife.Serialization;
using Newtonsoft.Json.Linq;
using System.Text; using System.Text;
namespace JiLinApp.Biz.TransmitAlarm; namespace JiLinApp.Biz.TransmitAlarm;
@ -11,14 +14,20 @@ public class AlarmMqttService : IAlarmService
private MqttConfig Config { get; } private MqttConfig Config { get; }
//private MqttServer Server { get; }
private IMqttClient Client { get; } private IMqttClient Client { get; }
private MqttClientOptions ClientOptions { get; } private MqttClientOptions ClientOptions { get; }
private MqttClientSubscribeOptions SubscribeOptions { get; } private MqttClientSubscribeOptions SubscribeOptions { get; }
public event IAlarmService.HandleRecvEvent? OnFenceUdpSendDevices;
public event IAlarmService.HandleRecvEvent? OnVibrateTcpSendDevices;
public event IAlarmService.HandleRecvEvent? OnFenceUdpSendSensors;
public event IAlarmService.HandleRecvEvent? OnVibrateTcpSendSensors;
#endregion Fields #endregion Fields
public AlarmMqttService(MqttConfig config) public AlarmMqttService(MqttConfig config)
@ -34,7 +43,7 @@ public class AlarmMqttService : IAlarmService
.WithKeepAlivePeriod(TimeSpan.FromSeconds(60)) .WithKeepAlivePeriod(TimeSpan.FromSeconds(60))
.Build(); .Build();
SubscribeOptions = factory.CreateSubscribeOptionsBuilder() SubscribeOptions = factory.CreateSubscribeOptionsBuilder()
.WithTopicFilter(f => f.WithTopic("mqttnet/samples/topic/1")) .WithTopicFilter(f => f.WithTopic(config.SubCmdTopic))
.Build(); .Build();
Config = config; Config = config;
@ -51,8 +60,30 @@ public class AlarmMqttService : IAlarmService
public void Start() public void Start()
{ {
if (IsRuning()) return; if (IsRuning()) return;
int retryTime = Config.RetryTime, retryInterval = Config.RetryInterval;
for (int i = 1; i <= retryTime; i++)
{
MqttClientConnectResult connResult = Client.ConnectAsync(ClientOptions, CancellationToken.None).Result; MqttClientConnectResult connResult = Client.ConnectAsync(ClientOptions, CancellationToken.None).Result;
if (connResult.ResultCode == MqttClientConnectResultCode.Success) break;
if (i == retryTime) throw new MqttCommunicationTimedOutException();
Thread.Sleep(retryInterval);
}
for (int i = 1; i <= retryTime; i++)
{
MqttClientSubscribeResult subResult = Client.SubscribeAsync(SubscribeOptions, CancellationToken.None).Result; MqttClientSubscribeResult subResult = Client.SubscribeAsync(SubscribeOptions, CancellationToken.None).Result;
bool flag = true;
foreach (var item in subResult.Items)
{
if (item.ResultCode > MqttClientSubscribeResultCode.GrantedQoS2)
{
flag = false;
break;
}
}
if (flag) break;
if (i == retryTime) throw new MqttCommunicationTimedOutException();
Thread.Sleep(retryInterval);
}
} }
public void Close() public void Close()
@ -66,11 +97,108 @@ public class AlarmMqttService : IAlarmService
return Client != null && Client.IsConnected; return Client != null && Client.IsConnected;
} }
public void SendAlarmMessage(AlarmMessage msg) private object StartAtomObj { get; } = new();
private bool StartAtom()
{
lock (StartAtomObj)
{
if (!IsRuning()) Start();
}
return IsRuning();
}
#endregion Base
#region Receive
private Task Client_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
{
string topic = arg.ApplicationMessage.Topic;
string msg = Encoding.UTF8.GetString(arg.ApplicationMessage.Payload);
string qos = arg.ApplicationMessage.QualityOfServiceLevel.ToString();
string retained = arg.ApplicationMessage.Retain.ToString();
if (topic.Equals(Config.SubCmdTopic))
{
HandleRecvSubCmdTopic(topic, msg);
}
return Task.CompletedTask;
}
private void HandleRecvSubCmdTopic(string topic, string reqJson)
{
JObject reqObj = JsonUtil.ToJObject(reqJson);
string cmd = reqObj.GetValue("cmd", StringComparison.OrdinalIgnoreCase)?.ToString() ?? "";
DeviceType type = (DeviceType)(reqObj.GetValue("type", StringComparison.OrdinalIgnoreCase).ToInt());
switch (cmd.Trim().ToLower())
{
case "getdevices":
switch (type)
{
case DeviceType.Vibrate:
OnVibrateTcpSendDevices?.Invoke(reqObj);
break;
case DeviceType.Fence:
OnFenceUdpSendDevices?.Invoke(reqObj);
break;
}
break;
case "getsensors":
switch (type)
{
case DeviceType.Vibrate:
OnVibrateTcpSendSensors?.Invoke(reqObj);
break;
case DeviceType.Fence:
OnFenceUdpSendSensors?.Invoke(reqObj);
break;
}
break;
}
}
#endregion Receive
#region Send
private int Frame { get; set; } = 0;
private int IncFrame
{ get { return ++Frame % int.MaxValue; } }
private void Send(string topic, object obj)
{
MqttApplicationMessage mqttMsg = new MqttApplicationMessageBuilder()
.WithTopic(topic)
.WithPayload(obj.ToJson())
.Build();
MqttClientPublishResult? pubResult = null;
while (pubResult == null || !pubResult.IsSuccess)
{
try
{
pubResult = Client.PublishAsync(mqttMsg, CancellationToken.None).Result;
}
catch (Exception)
{
while (!IsRuning())
{
if (StartAtom()) break;
Thread.Sleep(100);
}
}
}
}
private void SendByFrame(string topic, object obj)
{ {
//((dynamic)obj).Frame = IncFrame;// no work, transto dict, add frame, transto json
MqttApplicationMessage mqttMsg = new MqttApplicationMessageBuilder() MqttApplicationMessage mqttMsg = new MqttApplicationMessageBuilder()
.WithTopic(Config.PubAlarmTopic) .WithTopic(topic)
.WithPayload(JsonUtil.ToJson(msg)) .WithPayload(obj.ToJson())
.Build(); .Build();
MqttClientPublishResult? pubResult = null; MqttClientPublishResult? pubResult = null;
while (pubResult == null || !pubResult.IsSuccess) while (pubResult == null || !pubResult.IsSuccess)
@ -81,24 +209,71 @@ public class AlarmMqttService : IAlarmService
} }
catch (Exception) catch (Exception)
{ {
Start(); while (!IsRuning())
{
if (StartAtom()) break;
Thread.Sleep(100); Thread.Sleep(100);
} }
} }
} }
}
#endregion Base public void SendAlarm(AlarmMessage msg)
{
Send(Config.PubAlarmTopic, msg);
}
#region Receive public void SendDevices(DeviceType type, List<object> deviceList)
{
object obj = new
{
type = type,
data = deviceList,
frame = IncFrame
};
Send(Config.PubDevicesTopic, obj);
}
private Task Client_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg) public void SendSensors(DeviceType type, int deviceId, List<object> sensorList)
{ {
string topic = arg.ApplicationMessage.Topic; object obj = new
string text = Encoding.UTF8.GetString(arg.ApplicationMessage.Payload); {
string qos = arg.ApplicationMessage.QualityOfServiceLevel.ToString(); type = type,
string retained = arg.ApplicationMessage.Retain.ToString(); deviceId = deviceId,
return Task.CompletedTask; data = sensorList,
frame = IncFrame
};
Send(Config.PubSensorsTopic, obj);
} }
#endregion Receive public void SendDeviceState(DeviceType type, object device)
{
object obj = new
{
type = type,
data = device,
frame = IncFrame
};
Send(Config.PubDeviceStateTopic, obj);
}
public void SendSensorState(DeviceType type, object sensor)
{
object obj = new
{
type = type,
data = sensor,
frame = IncFrame
};
Send(Config.PubSensorStateTopic, obj);
}
#endregion Send
}
public enum DeviceType : int
{
Unknown = 0,
Vibrate = 3,
Fence = 4,
} }

27
JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs

@ -2,6 +2,11 @@
public class AlarmZmqService : IAlarmService public class AlarmZmqService : IAlarmService
{ {
public event IAlarmService.HandleRecvEvent? OnFenceUdpSendDevices;
public event IAlarmService.HandleRecvEvent? OnVibrateTcpSendDevices;
public event IAlarmService.HandleRecvEvent? OnFenceUdpSendSensors;
public event IAlarmService.HandleRecvEvent? OnVibrateTcpSendSensors;
public void Start() public void Start()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@ -17,7 +22,27 @@ public class AlarmZmqService : IAlarmService
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void SendAlarmMessage(AlarmMessage msg) public void SendAlarm(AlarmMessage msg)
{
throw new NotImplementedException();
}
public void SendDevices(DeviceType type, List<object> deviceList)
{
throw new NotImplementedException();
}
public void SendSensors(DeviceType type, int deviceId, List<object> sensorList)
{
throw new NotImplementedException();
}
public void SendDeviceState(DeviceType type, object device)
{
throw new NotImplementedException();
}
public void SendSensorState(DeviceType type, object sensor)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

36
JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs

@ -1,12 +1,44 @@
namespace JiLinApp.Biz.TransmitAlarm; using Newtonsoft.Json.Linq;
namespace JiLinApp.Biz.TransmitAlarm;
public interface IAlarmService public interface IAlarmService
{ {
#region Event
public delegate void HandleRecvEvent(JObject reqObj);
public event HandleRecvEvent? OnFenceUdpSendDevices;
public event HandleRecvEvent? OnVibrateTcpSendDevices;
public event HandleRecvEvent? OnFenceUdpSendSensors;
public event HandleRecvEvent? OnVibrateTcpSendSensors;
#endregion Event
#region Base
void Start(); void Start();
void Close(); void Close();
bool IsRuning(); bool IsRuning();
void SendAlarmMessage(AlarmMessage msg); #endregion Base
#region Send
void SendAlarm(AlarmMessage msg);
void SendDevices(DeviceType type, List<object> deviceList);
void SendSensors(DeviceType type, int deviceId, List<object> sensorList);
void SendDeviceState(DeviceType type, object device);
void SendSensorState(DeviceType type, object sensor);
#endregion Send
} }

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

@ -4,6 +4,8 @@ public class SectorState
{ {
#region Fields #region Fields
public int DeviceId { get; set; }
public int Id { get; set; }//防区号 public int Id { get; set; }//防区号
/// <summary> /// <summary>
@ -64,8 +66,9 @@ public class SectorState
#endregion Fields #endregion Fields
public SectorState(int id, byte data) public SectorState(int deviceId, int id, byte data)
{ {
DeviceId = deviceId;
Id = id; Id = id;
State = data & 0x0F; State = data & 0x0F;
Type = data >> 4; Type = data >> 4;

1
JiLinApp.Docking/FenceAlarm/Entity/UdpAlarmHostMessage.cs

@ -4,7 +4,6 @@ namespace JiLinApp.Docking.FenceAlarm;
public class UdpAlarmHostMessage public class UdpAlarmHostMessage
{ {
public int Id { get; set; }
public string AlarmTime { get; set; }//报警时间 public string AlarmTime { get; set; }//报警时间
public string CID { get; set; }//CID代码 public string CID { get; set; }//CID代码

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

@ -1,4 +1,5 @@
using System.Collections.Concurrent; using JiLinApp.Docking.VibrateAlarm;
using System.Collections.Concurrent;
using System.Net; using System.Net;
using System.Timers; using System.Timers;
using Timer = System.Timers.Timer; using Timer = System.Timers.Timer;
@ -19,17 +20,17 @@ public class UdpManager
#region Event #region Event
public delegate void UDPAlarmDeviceStateEvent(int deviceId, int state); public delegate void FenceUdpDeviceStateEvent(UdpAlarmHost device);
public delegate void UDPAlarmSectorStateEvent(int deviceId, int sectorId, int state); public delegate void FenceUdpSectorStateEvent(SectorState sector);
public delegate void UDPAlarmEvent(UdpAlarmHostMessage msg); public delegate void FenceUdpAlarmEvent(UdpAlarmHostMessage msg);
public event UDPAlarmDeviceStateEvent? OnUdpAlarmDeviceState; public event FenceUdpDeviceStateEvent? OnFenceUdpDeviceState;
public event UDPAlarmSectorStateEvent? OnUdpAlarmSectorState; public event FenceUdpSectorStateEvent? OnFenceUdpSectorState;
public event UDPAlarmEvent? OnUdpAlarm; public event FenceUdpAlarmEvent? OnFenceUdpAlarm;
#endregion Event #endregion Event
@ -44,16 +45,10 @@ public class UdpManager
public void Start(UdpManagerConfig config) public void Start(UdpManagerConfig config)
{ {
if (IsRunning()) return; if (IsRunning()) return;
try
{
Server = new(config.ServerPort); Server = new(config.ServerPort);
Server.DatagramReceived += Server_DatagramReceived; Server.DatagramReceived += Server_DatagramReceived;
Server.Start(); Server.Start();
}
catch (Exception)
{
return;
}
PtzCheckTimer.Interval = 1000;//1s PtzCheckTimer.Interval = 1000;//1s
PtzCheckTimer.Elapsed += PTZCheckTimer_Elapsed; PtzCheckTimer.Elapsed += PTZCheckTimer_Elapsed;
PtzCheckTimer.Enabled = true; PtzCheckTimer.Enabled = true;
@ -94,17 +89,11 @@ public class UdpManager
/// <param name="e"></param> /// <param name="e"></param>
private void PTZCheckTimer_Elapsed(object? sender, ElapsedEventArgs e) private void PTZCheckTimer_Elapsed(object? sender, ElapsedEventArgs e)
{ {
foreach (var item in DeviceDict.Values) foreach (var key in DeviceDict.Keys)
{
if (item.KeepLive >= 0)
{
item.KeepLive--;
}
else
{ {
item.OnlineState = 0; UdpAlarmHost device = DeviceDict[key];
OnUdpAlarmDeviceState?.Invoke(item.DeviceId, 0); if (device.KeepLive >= 0) device.KeepLive--;
} else ProcessDeviceStateEvent(ref device, 0, device.DefenceState);
} }
} }
@ -113,32 +102,34 @@ public class UdpManager
IPEndPoint ipep = e.Ipep; IPEndPoint ipep = e.Ipep;
//解码 //解码
byte[] msg = AlarmEncode.DecodeMessage(e.Datagram); byte[] msg = AlarmEncode.DecodeMessage(e.Datagram);
if (msg[2] != AlarmEncode.Head[0] && msg[3] != AlarmEncode.Head[1]) return; bool vaild = msg.Length >= 8 && msg[2] == AlarmEncode.Head[0] && msg[3] == AlarmEncode.Head[1];
//Console.WriteLine("Receive protocol:" + msg[4]); if (!vaild) return;
Console.WriteLine("Receive from {0}:{1} => {2}", ipep.Address.ToString(), ipep.Port, DataMessage.ToHexString(msg));
//解析 //解析
switch (msg[4]) DeviceCmd deviceCmd = (DeviceCmd)msg[4];
switch (deviceCmd)
{ {
case (byte)DeviceCmd.HeartBeatCmd://心跳信息 case DeviceCmd.HeartBeatCmd://心跳信息
AnalysisHeartMessage(ipep, msg); AnalysisHeartMessage(ipep, msg);
break; break;
case (byte)DeviceCmd.AlarmCmd://报警信息 case DeviceCmd.AlarmCmd://报警信息
AnalysisAlarmMessage(ipep, msg); AnalysisAlarmMessage(ipep, msg);
break; break;
case (byte)DeviceCmd.AllSectorStateCmd://防区信息 case DeviceCmd.AllSectorStateCmd://防区信息
AnalysisAllSectorMessage(ipep, msg); AnalysisAllSectorMessage(ipep, msg);
break; break;
case (byte)DeviceCmd.RtSectorStateCmd://张力防区信息 case DeviceCmd.RtSectorStateCmd://张力防区信息
AnalysisSectorMessage(ipep, msg); AnalysisSectorMessage(ipep, msg);
break; break;
case (byte)DeviceCmd.MaxSectorTotalCmd://最大防区信息 case DeviceCmd.MaxSectorTotalCmd://最大防区信息
AnalysisMaxSectorMessage(ipep, msg); AnalysisMaxSectorMessage(ipep, msg);
break; break;
case (byte)DeviceCmd.BackSettingsCmd://返回报警主机设置参数回服务器,无需解析 case DeviceCmd.BackSettingsCmd://返回报警主机设置参数回服务器,无需解析
break; break;
default: default:
@ -170,11 +161,7 @@ public class UdpManager
AddDevice(deviceId, device); AddDevice(deviceId, device);
} }
byte defenceState = msg[17]; byte defenceState = msg[17];
if (device.DefenceState != defenceState && OnUdpAlarmDeviceState != null) ProcessDeviceStateEvent(ref device, 1, defenceState);
{
OnUdpAlarmDeviceState?.Invoke(device.DeviceId, defenceState);
}
device.DefenceState = msg[17];
device.WorkState = msg[18]; device.WorkState = msg[18];
//设备状态1 //设备状态1
device.CellState = GetBit(msg[19], 0); device.CellState = GetBit(msg[19], 0);
@ -200,11 +187,6 @@ public class UdpManager
device.SectorTotal = msg[25]; device.SectorTotal = msg[25];
//在线状态 //在线状态
device.KeepLive = Config.DeviceHeartKeep; device.KeepLive = Config.DeviceHeartKeep;
if (device.OnlineState == 0)
{
device.OnlineState = 1;
OnUdpAlarmDeviceState?.Invoke(device.DeviceId, device.OnlineState);
}
} }
private void AnalysisAlarmMessage(IPEndPoint ipep, byte[] msg) private void AnalysisAlarmMessage(IPEndPoint ipep, byte[] msg)
@ -268,21 +250,18 @@ public class UdpManager
int sectorNum = msg[19], startIndex = msg[20]; int sectorNum = msg[19], startIndex = msg[20];
for (int i = 0; i < sectorNum; i++) for (int i = 0; i < sectorNum; i++)
{ {
int index = i + startIndex;//防区序号 int sectorId = i + startIndex;//防区序号
int pos = 21 + i;//防区信息所在byte数组未知 int pos = 21 + i;//防区信息所在byte数组未知
SectorState sector = new(index, msg[pos]); SectorState curSector = new(device.DeviceId, sectorId, msg[pos]);
if (device.SectorDict.ContainsKey(sector.Id)) if (device.SectorDict.TryGetValue(sectorId, out SectorState? sector))
{
if (device.SectorDict[sector.Id].State != sector.State)
{ {
device.SectorDict[sector.Id] = sector; ProcessSectorStateEvent(ref sector, curSector.State);
ReportSectorState(deviceId, sector.Id, sector.State);
}
} }
else else
{ {
sector = curSector;
device.SectorDict[sector.Id] = sector; device.SectorDict[sector.Id] = sector;
ReportSectorState(deviceId, sector.Id, sector.State); //ProcessSectorStateEvent(ref sector);
} }
} }
} }
@ -329,14 +308,44 @@ public class UdpManager
device.SectorTotal = msg[17] * 256 + msg[18]; device.SectorTotal = msg[17] * 256 + msg[18];
} }
private void ReportAlarm(UdpAlarmHostMessage msg) private void ProcessDeviceStateEvent(ref UdpAlarmHost device, int onlineState, int defenceState)
{
bool reportFlag = false;
if (device.OnlineState != onlineState)
{ {
OnUdpAlarm?.Invoke(msg); reportFlag = true;
device.OnlineState = onlineState;
}
if (device.DefenceState != defenceState)
{
reportFlag = true;
device.DefenceState = defenceState;
}
if (reportFlag) ReportDeviceState(device);
} }
private void ReportSectorState(int deviceId, int sectorId, int state) private void ProcessSectorStateEvent(ref SectorState sector, int state)
{
if (sector.State != state)
{
sector.State = state;
ReportSectorState(sector);
}
}
private void ReportDeviceState(UdpAlarmHost device)
{
OnFenceUdpDeviceState?.Invoke(device);
}
private void ReportSectorState(SectorState sector)
{
OnFenceUdpSectorState?.Invoke(sector);
}
private void ReportAlarm(UdpAlarmHostMessage msg)
{ {
OnUdpAlarmSectorState?.Invoke(deviceId, sectorId, state); OnFenceUdpAlarm?.Invoke(msg);
} }
#endregion Analysis #endregion Analysis
@ -592,17 +601,17 @@ public class UdpManager
#region DeviceDict #region DeviceDict
private bool ContainsDevice(int deviceId) public bool ContainsDevice(int deviceId)
{ {
return DeviceDict.ContainsKey(deviceId); return DeviceDict.ContainsKey(deviceId);
} }
private UdpAlarmHost GetDevice(int deviceId) public UdpAlarmHost GetDevice(int deviceId)
{ {
return DeviceDict[deviceId]; return DeviceDict[deviceId];
} }
private bool TryGetDevice(int deviceId, out UdpAlarmHost device) public bool TryGetDevice(int deviceId, out UdpAlarmHost device)
{ {
return DeviceDict.TryGetValue(deviceId, out device); return DeviceDict.TryGetValue(deviceId, out device);
} }
@ -624,7 +633,7 @@ public class UdpManager
return DeviceDict.Remove(deviceId, out _); return DeviceDict.Remove(deviceId, out _);
} }
private List<UdpAlarmHost> GetDeviceList() public List<UdpAlarmHost> GetDeviceList()
{ {
return DeviceDict.Values.ToList(); return DeviceDict.Values.ToList();
} }

11
JiLinApp.Docking/FenceAlarm/Service/UdpServer.cs

@ -1,4 +1,5 @@
using System.ComponentModel; using JiLinApp.Docking.VibrateAlarm;
using System.ComponentModel;
using System.Net; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
@ -86,7 +87,6 @@ public class UdpServer
private void RaiseDatagramReceived(IPEndPoint ipep, byte[] datagram) private void RaiseDatagramReceived(IPEndPoint ipep, byte[] datagram)
{ {
DatagramReceived?.Invoke(this, new UdpDatagramReceivedEventArgs<byte[]>(ipep, datagram)); DatagramReceived?.Invoke(this, new UdpDatagramReceivedEventArgs<byte[]>(ipep, datagram));
//DatagramReceived?.Invoke(ipep, datagram);
} }
#endregion Events #endregion Events
@ -113,11 +113,12 @@ public class UdpServer
#region Send #region Send
public bool SendMessage(string ip, int port, byte[] byteMsg) public bool SendMessage(string ip, int port, byte[] msg)
{ {
IPEndPoint ipep = new(IPAddress.Parse(ip), port); IPEndPoint ipep = new(IPAddress.Parse(ip), port);
int result = SendUdp.Send(byteMsg, byteMsg.Length, ipep); int result = SendUdp.Send(msg, msg.Length, ipep);
bool flag = result >= byteMsg.Length; bool flag = result >= msg.Length;
Console.WriteLine("Send to {0}:{1} => {2}, {3}", ip, port, DataMessage.ToHexString(msg), flag);
return flag; return flag;
} }

133
JiLinApp.Docking/Ptz/PtzCmd.cs

@ -10,7 +10,7 @@ public class PtzCmd
{ {
"PelcoD" => PtzControlType.PelcoD, "PelcoD" => PtzControlType.PelcoD,
"PelcoP" => PtzControlType.PelcoP, "PelcoP" => PtzControlType.PelcoP,
"DCamera" => PtzControlType.PelcoP, "DCamera" => PtzControlType.DCamera,
"CameraSdk" => PtzControlType.CameraSdk, "CameraSdk" => PtzControlType.CameraSdk,
_ => PtzControlType.None _ => PtzControlType.None
}; };
@ -20,17 +20,22 @@ public class PtzCmd
{ {
return cmdStr switch return cmdStr switch
{ {
"Top" => PtzCmdType.Top,
"Down" => PtzCmdType.Down,
"Left" => PtzCmdType.Left, "Left" => PtzCmdType.Left,
"Right" => PtzCmdType.Right, "Right" => PtzCmdType.Right,
"TopLeft" => PtzCmdType.LeftTop, "Top" => PtzCmdType.Top,
"TopRight" => PtzCmdType.RightTop, "Down" => PtzCmdType.Down,
"DownLeft" => PtzCmdType.LeftDown, "LeftTop" => PtzCmdType.LeftTop,
"DownRight" => PtzCmdType.RightDown, "LeftDown" => PtzCmdType.LeftDown,
"RightTop" => PtzCmdType.RightTop,
"RightDown" => PtzCmdType.RightDown,
"Stop" => PtzCmdType.Stop, "Stop" => PtzCmdType.Stop,
"AutoStart" => PtzCmdType.AutoStart, "AutoMove" => PtzCmdType.AutoMove,
"AutoStop" => PtzCmdType.AutoStop, "ZoomIn" => PtzCmdType.ZoomIn,
"ZoomOut" => PtzCmdType.ZoomOut,
"FocusNear" => PtzCmdType.FocusNear,
"FocusFar" => PtzCmdType.FocusFar,
"IrisOpen" => PtzCmdType.IrisOpen,
"IrisClose" => PtzCmdType.IrisClose,
"PresetSet" => PtzCmdType.PresetSet, "PresetSet" => PtzCmdType.PresetSet,
"PresetClear" => PtzCmdType.PresetClear, "PresetClear" => PtzCmdType.PresetClear,
"PresetGoto" => PtzCmdType.PresetGoto, "PresetGoto" => PtzCmdType.PresetGoto,
@ -78,8 +83,8 @@ public class PtzComCmd
PtzCmdType.RightTop => PelcoD.CameraPan(addr, PelcoD.Pan.RightUp, panSpeed), PtzCmdType.RightTop => PelcoD.CameraPan(addr, PelcoD.Pan.RightUp, panSpeed),
PtzCmdType.RightDown => PelcoD.CameraPan(addr, PelcoD.Pan.RightDown, panSpeed), PtzCmdType.RightDown => PelcoD.CameraPan(addr, PelcoD.Pan.RightDown, panSpeed),
PtzCmdType.Stop => PelcoD.CameraStop(addr), PtzCmdType.Stop => PelcoD.CameraStop(addr),
PtzCmdType.AutoStart => PelcoD.CameraScan(addr, PelcoD.Scan.Auto), PtzCmdType.AutoMove => PelcoD.CameraScan(addr, PelcoD.Scan.Auto),
PtzCmdType.AutoStop => PelcoD.CameraScan(addr, PelcoD.Scan.Manual), //PtzCmdType.AutoStop => PelcoD.CameraScan(addr, PelcoD.Scan.Manual),
PtzCmdType.PresetGoto => PelcoD.Preset(addr, PelcoD.PresetAction.Goto, (byte)args[1]), PtzCmdType.PresetGoto => PelcoD.Preset(addr, PelcoD.PresetAction.Goto, (byte)args[1]),
_ => Array.Empty<byte>(), _ => Array.Empty<byte>(),
}; };
@ -102,8 +107,8 @@ public class PtzComCmd
PtzCmdType.RightTop => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Up, tiltSpeed), PtzCmdType.RightTop => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Up, tiltSpeed),
PtzCmdType.RightDown => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Down, tiltSpeed), PtzCmdType.RightDown => PelcoP.CameraPanTilt(addr, PelcoP.Pan.Right, panSpeed, PelcoP.Tilt.Down, tiltSpeed),
PtzCmdType.Stop => PelcoP.CameraStop(addr), PtzCmdType.Stop => PelcoP.CameraStop(addr),
PtzCmdType.AutoStart => PelcoP.AutoScan(addr, PelcoP.Action.Start), PtzCmdType.AutoMove => PelcoP.AutoScan(addr, PelcoP.Action.Start),
PtzCmdType.AutoStop => PelcoP.AutoScan(addr, PelcoP.Action.Stop), //PtzCmdType.AutoStop => PelcoP.AutoScan(addr, PelcoP.Action.Stop),
PtzCmdType.PresetGoto => PelcoP.Preset(addr, PelcoP.PresetAction.Goto, (byte)args[1]), PtzCmdType.PresetGoto => PelcoP.Preset(addr, PelcoP.PresetAction.Goto, (byte)args[1]),
_ => Array.Empty<byte>(), _ => Array.Empty<byte>(),
}; };
@ -124,7 +129,6 @@ public class PtzComCmd
PtzCmdType.RightTop => DCamera.RightUp(speed, speed), PtzCmdType.RightTop => DCamera.RightUp(speed, speed),
PtzCmdType.RightDown => DCamera.RightDown(speed, speed), PtzCmdType.RightDown => DCamera.RightDown(speed, speed),
PtzCmdType.Stop => DCamera.Stop(), PtzCmdType.Stop => DCamera.Stop(),
//PtzCmdType.PresetGoto => DCamera.Up(speed),
_ => Array.Empty<byte>(), _ => Array.Empty<byte>(),
}; };
return cmd; return cmd;
@ -135,7 +139,7 @@ public class PtzCameraCmd
{ {
public static void PtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args) public static void PtzMove(ICameraSDK sdk, PtzCmdType cmdType, int[] args)
{ {
if (sdk == null || args == null) return; if (sdk == null || !sdk.ConnectSuccess() || args == null) return;
switch (sdk.CameraInfo.GetManufactor) switch (sdk.CameraInfo.GetManufactor)
{ {
case CameraManufactor.HiK: case CameraManufactor.HiK:
@ -193,10 +197,34 @@ public class PtzCameraCmd
sdk.PtzMove(HiKOriSDK.DOWN_RIGHT, stop, speed); sdk.PtzMove(HiKOriSDK.DOWN_RIGHT, stop, speed);
break; break;
case PtzCmdType.AutoStart: case PtzCmdType.AutoMove:
sdk.PtzMove(HiKOriSDK.PAN_AUTO, stop, speed); sdk.PtzMove(HiKOriSDK.PAN_AUTO, stop, speed);
break; break;
case PtzCmdType.ZoomIn:
sdk.PtzMove(HiKOriSDK.ZOOM_IN, stop, speed);
break;
case PtzCmdType.ZoomOut:
sdk.PtzMove(HiKOriSDK.ZOOM_OUT, stop, speed);
break;
case PtzCmdType.FocusNear:
sdk.PtzMove(HiKOriSDK.FOCUS_NEAR, stop, speed);
break;
case PtzCmdType.FocusFar:
sdk.PtzMove(HiKOriSDK.FOCUS_FAR, stop, speed);
break;
case PtzCmdType.IrisOpen:
sdk.PtzMove(HiKOriSDK.IRIS_OPEN, stop, speed);
break;
case PtzCmdType.IrisClose:
sdk.PtzMove(HiKOriSDK.IRIS_CLOSE, stop, speed);
break;
case PtzCmdType.PresetGoto: case PtzCmdType.PresetGoto:
sdk.PtzPreset(HiKOriSDK.GOTO_PRESET, presetId); sdk.PtzPreset(HiKOriSDK.GOTO_PRESET, presetId);
break; break;
@ -213,19 +241,19 @@ public class PtzCameraCmd
switch (cmdType) switch (cmdType)
{ {
case PtzCmdType.Left: case PtzCmdType.Left:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.LEFT_CONTROL, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.LEFT, stop, speed);
break; break;
case PtzCmdType.Right: case PtzCmdType.Right:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHT_CONTROL, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHT, stop, speed);
break; break;
case PtzCmdType.Top: case PtzCmdType.Top:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.UP_CONTROL, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.UP, stop, speed);
break; break;
case PtzCmdType.Down: case PtzCmdType.Down:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.DOWN_CONTROL, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.DOWN, stop, speed);
break; break;
case PtzCmdType.LeftTop: case PtzCmdType.LeftTop:
@ -244,8 +272,32 @@ public class PtzCameraCmd
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHTDOWN, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.RIGHTDOWN, stop, speed);
break; break;
case PtzCmdType.AutoStart: case PtzCmdType.AutoMove:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.HORSECTORSCAN, stop, speed); sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.STARTPANCRUISE, stop, speed);
break;
case PtzCmdType.ZoomIn:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.ZOOM_ADD, stop, speed);
break;
case PtzCmdType.ZoomOut:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.ZOOM_DEC, stop, speed);
break;
case PtzCmdType.FocusNear:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.FOCUS_ADD, stop, speed);
break;
case PtzCmdType.FocusFar:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.FOCUS_DEC, stop, speed);
break;
case PtzCmdType.IrisOpen:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.APERTURE_ADD, stop, speed);
break;
case PtzCmdType.IrisClose:
sdk.PtzMove((int)DaHuaOriSDK.EM_EXTPTZ_ControlType.APERTURE_DEC, stop, speed);
break; break;
case PtzCmdType.PresetGoto: case PtzCmdType.PresetGoto:
@ -295,6 +347,30 @@ public class PtzCameraCmd
sdk.PtzMove(YuShiOriSDK.RIGHTDOWN, stop, speed); sdk.PtzMove(YuShiOriSDK.RIGHTDOWN, stop, speed);
break; break;
case PtzCmdType.ZoomIn:
sdk.PtzMove(YuShiOriSDK.ZOOMTELE, stop, speed);
break;
case PtzCmdType.ZoomOut:
sdk.PtzMove(YuShiOriSDK.ZOOMWIDE, stop, speed);
break;
case PtzCmdType.FocusNear:
sdk.PtzMove(YuShiOriSDK.FOCUSNEAR, stop, speed);
break;
case PtzCmdType.FocusFar:
sdk.PtzMove(YuShiOriSDK.FOCUSFAR, stop, speed);
break;
case PtzCmdType.IrisOpen:
sdk.PtzMove(YuShiOriSDK.IRISOPEN, stop, speed);
break;
case PtzCmdType.IrisClose:
sdk.PtzMove(YuShiOriSDK.IRISCLOSE, stop, speed);
break;
case PtzCmdType.PresetGoto: case PtzCmdType.PresetGoto:
sdk.PtzPreset(YuShiOriSDK.PRESET_GOTO, presetId); sdk.PtzPreset(YuShiOriSDK.PRESET_GOTO, presetId);
break; break;
@ -316,17 +392,22 @@ public enum PtzControlType
public enum PtzCmdType public enum PtzCmdType
{ {
Top,
Down,
Left, Left,
Right, Right,
Top,
Down,
LeftTop, LeftTop,
LeftDown, LeftDown,
RightTop, RightTop,
RightDown, RightDown,
Stop, Stop,
AutoStart, AutoMove,
AutoStop, ZoomIn,
ZoomOut,
FocusNear,
FocusFar,
IrisOpen,
IrisClose,
PresetSet, PresetSet,
PresetClear, PresetClear,
PresetGoto, PresetGoto,

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

@ -1,4 +1,4 @@
using System.Collections; using System.Collections.Concurrent;
using System.Net.Sockets; using System.Net.Sockets;
namespace JiLinApp.Docking.VibrateAlarm; namespace JiLinApp.Docking.VibrateAlarm;
@ -11,22 +11,6 @@ public class ClientMessage
public TcpAlarmHost Host { get; set; } public TcpAlarmHost Host { get; set; }
public List<byte> DataList { get; } = new();
public Hashtable SectionTable { get; } = new();
public List<byte> SensorList { get; set; }
public bool SensorListEmpty
{
get
{
return SensorList == null || SensorList.Count == 0;
}
}
public ReaderWriterLockSlim SensorListLock { get; } = new();
public string Ip public string Ip
{ {
get get
@ -47,6 +31,30 @@ public class ClientMessage
} }
} }
public int OnlineState { get; set; }//设备在线状态
public int SensorTotal
{
get
{
return SensorDict.Count;
}
}
public ConcurrentDictionary<int, SensorState> SensorDict { get; } = new();
public bool SensorsEmpty
{
get
{
return SensorDict == null || SensorDict.IsEmpty;
}
}
public ReaderWriterLockSlim SensorsLock { get; } = new();
public List<byte> DataList { get; } = new();
#endregion Fields #endregion Fields
public ClientMessage() public ClientMessage()

47
JiLinApp.Docking/VibrateAlarm/Entity/SensorState.cs

@ -2,16 +2,27 @@
public class SensorState public class SensorState
{ {
public int deviceID { get; set; } public int DeviceId { get; set; }
public string channel { get; set; } public int Addr { get; set; }
public int online { get; set; }
public string onLine_str public int OfflineState { get; set; }
public int OnlineState
{
get
{
if (OfflineState == 0) return 1;
else if (OfflineState == 1) return 0;
else return 0;
}
}
public string OnlineStateStr
{ {
get get
{ {
if (online == 0) if (OfflineState == 0)
{ {
return "在线"; return "在线";
} }
@ -22,13 +33,13 @@ public class SensorState
} }
} }
public int alarm { get; set; } public int AlarmState { get; set; }
public string alarm_str public string AlarmStateStr
{ {
get get
{ {
if (alarm == 0) if (AlarmState == 0)
{ {
return "消警"; return "消警";
} }
@ -39,19 +50,19 @@ public class SensorState
} }
} }
public SensorState(int id, int chan, int state) public SensorState(int deviceId, int sensorAddr, int state)
{ {
deviceID = id; DeviceId = deviceId;
channel = chan.ToString(); Addr = sensorAddr;
online = state % 2; OfflineState = state % 2;
alarm = state / 2 % 2; AlarmState = state / 2 % 2;
} }
public SensorState(int id, int chan, int on, int a) public SensorState(int deviceId, int sensorAddr, int offlineState, int alarmState)
{ {
deviceID = id; DeviceId = deviceId;
channel = chan.ToString(); Addr = sensorAddr;
online = on; OfflineState = offlineState;
alarm = a; AlarmState = alarmState;
} }
} }

8
JiLinApp.Docking/VibrateAlarm/Entity/TcpAlarmHost.cs

@ -4,7 +4,13 @@ public class TcpAlarmHost
{ {
public int Id { get; set; } public int Id { get; set; }
public string Name { get; set; } public string Name
{
get
{
return "设备" + Id;
}
}
public string Ip { get; set; } public string Ip { get; set; }

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

@ -4,7 +4,6 @@ namespace JiLinApp.Docking.VibrateAlarm;
public class TcpAlarmHostMessage public class TcpAlarmHostMessage
{ {
public int Id { get; set; }
public string AlarmTime { get; set; }//报警时间 public string AlarmTime { get; set; }//报警时间
public string CID { get; set; }//CID代码 public string CID { get; set; }//CID代码

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

@ -199,7 +199,7 @@ public class AsyncTcpServer : IDisposable
} }
catch (Exception) catch (Exception)
{ {
throw; return;
} }
if (listener == null || client == null || !client.Connected) return; if (listener == null || client == null || !client.Connected) return;

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

@ -14,7 +14,7 @@ public class TcpManager
private TcpManagerConfig Config { get; set; } private TcpManagerConfig Config { get; set; }
private ConcurrentDictionary<string, ClientMessage> ClientMessageDict { get; } = new(); private ConcurrentDictionary<string, ClientMessage> DeviceDict { get; } = new();
private Timer HeartTimer { get; } = new(); private Timer HeartTimer { get; } = new();
@ -22,21 +22,17 @@ public class TcpManager
#region Event #region Event
public delegate void TcpDeviceMessageEvent(TcpAlarmHost host, string msg); public delegate void VibrateTcpDeviceStateEvent(ClientMessage device);
public delegate void TcpSensorMessageEvent(TcpAlarmHost host, TcpSensorTable section, string msg); public delegate void VibrateTcpSensorStateEvent(SensorState sensor);
public delegate void TcpSensorStateChangeEvent(SensorState state); public delegate void VibrateTcpAlarmEvent(TcpAlarmHostMessage msg);
public delegate void TcpSensorAlarmEvent(TcpAlarmHostMessage msg); public event VibrateTcpDeviceStateEvent? OnVibrateTcpDeviceState;
public event TcpDeviceMessageEvent? OnTcpDeviceMessage; public event VibrateTcpSensorStateEvent? OnVibrateTcpSensorState;
public event TcpSensorMessageEvent? OnTcpSensorMessage; public event VibrateTcpAlarmEvent? OnVibrateTcpAlarm;
public event TcpSensorStateChangeEvent? OnTcpSensorStateChange;
public event TcpSensorAlarmEvent? OnTcpSensorAlarm;
#endregion Event #endregion Event
@ -51,18 +47,12 @@ public class TcpManager
public void Start(TcpManagerConfig config) public void Start(TcpManagerConfig config)
{ {
if (IsRunning()) return; if (IsRunning()) return;
try
{
Server = new(IPAddress.Any, config.ServerPort); Server = new(IPAddress.Any, config.ServerPort);
Server.ClientConnected += Server_ClientConnected; Server.ClientConnected += Server_ClientConnected;
Server.ClientDisconnected += Server_ClientDisconnected; Server.ClientDisconnected += Server_ClientDisconnected;
Server.DatagramReceived += Server_DatagramReceived; Server.DatagramReceived += Server_DatagramReceived;
Server.Start(); Server.Start();
}
catch (Exception)
{
return;
}
HeartTimer.Close(); HeartTimer.Close();
HeartTimer.Interval = 1000 * config.DeviceHeartKeep; HeartTimer.Interval = 1000 * config.DeviceHeartKeep;
HeartTimer.Elapsed += HeartTimer_Elapsed; HeartTimer.Elapsed += HeartTimer_Elapsed;
@ -84,7 +74,7 @@ public class TcpManager
Server.ClientDisconnected -= Server_ClientDisconnected; Server.ClientDisconnected -= Server_ClientDisconnected;
Server.DatagramReceived -= Server_DatagramReceived; Server.DatagramReceived -= Server_DatagramReceived;
Server = null; Server = null;
ClientMessageDict.Clear(); DeviceDict.Clear();
HeartTimer.Stop(); HeartTimer.Stop();
HeartTimer.Elapsed -= HeartTimer_Elapsed; HeartTimer.Elapsed -= HeartTimer_Elapsed;
} }
@ -101,20 +91,12 @@ public class TcpManager
private void HeartTimer_Elapsed(object? sender, ElapsedEventArgs e) private void HeartTimer_Elapsed(object? sender, ElapsedEventArgs e)
{ {
foreach (var clientMsg in ClientMessageDict.Values) foreach (var clientMsg in DeviceDict.Values)
{ {
SendHostHeart_01(clientMsg); SendHostHeart_01(clientMsg);
} }
} }
private void StateSpanTimer_Elapsed(object? sender, ElapsedEventArgs e)
{
foreach (var clientMsg in ClientMessageDict.Values)
{
RequestSensorState_04(clientMsg);
}
}
private void Server_ClientConnected(object? sender, TcpClientConnectedEventArgs e) private void Server_ClientConnected(object? sender, TcpClientConnectedEventArgs e)
{ {
string clientKey = e.TcpClient.Client.RemoteEndPoint?.ToString() ?? ""; string clientKey = e.TcpClient.Client.RemoteEndPoint?.ToString() ?? "";
@ -122,19 +104,18 @@ public class TcpManager
string clientIp = clientKey.Split(':')[0]; string clientIp = clientKey.Split(':')[0];
string clientPort = clientKey.Split(':')[1]; string clientPort = clientKey.Split(':')[1];
Console.WriteLine("上线:{0}", clientIp); Console.WriteLine("上线:{0}", clientIp);
if (!TryGetClientMessage(clientIp, out ClientMessage clientMsg)) if (!TryGetDevice(clientIp, out ClientMessage clientMsg))
{ {
clientMsg = new() clientMsg = new()
{ {
Client = e.TcpClient, Client = e.TcpClient,
Host = new() { Id = -1, Ip = clientIp, Port = clientPort, Name = "未知设备" } Host = new() { Id = -1, Ip = clientIp, Port = clientPort }
}; };
AddClientMessage(clientIp, clientMsg); AddDeivce(clientIp, clientMsg);
} }
if (OnTcpDeviceMessage != null) else
{ {
TcpAlarmHost host = clientMsg.Host ?? new() { Id = -1, Ip = clientIp, Port = clientPort, Name = "未知设备" }; ProcessDeviceStateEvent(ref clientMsg, 1);
OnTcpDeviceMessage(host, "报警主机上线");
} }
} }
@ -145,14 +126,9 @@ public class TcpManager
string clientIp = clientKey.Split(':')[0]; string clientIp = clientKey.Split(':')[0];
string clientPort = clientKey.Split(':')[1]; string clientPort = clientKey.Split(':')[1];
Console.WriteLine("下线:{0}", clientIp); Console.WriteLine("下线:{0}", clientIp);
if (TryGetClientMessage(clientIp, out ClientMessage clientMsg)) if (TryGetDevice(clientIp, out ClientMessage clientMsg))
{ {
RemoveClientMessage(clientIp); ProcessDeviceStateEvent(ref clientMsg, 0);
if (OnTcpDeviceMessage != null)
{
TcpAlarmHost host = clientMsg.Host ?? new() { Id = -1, Ip = clientIp, Port = clientPort, Name = "未知设备" };
OnTcpDeviceMessage(host, "报警主机下线");
}
} }
} }
@ -161,61 +137,60 @@ public class TcpManager
string clientKey = e.TcpClient.TcpClient.Client.RemoteEndPoint?.ToString() ?? ""; string clientKey = e.TcpClient.TcpClient.Client.RemoteEndPoint?.ToString() ?? "";
if (clientKey == "") return; if (clientKey == "") return;
string clientIp = clientKey.Split(':')[0]; string clientIp = clientKey.Split(':')[0];
if (TryGetClientMessage(clientIp, out ClientMessage clientMsg)) if (TryGetDevice(clientIp, out ClientMessage clientMsg))
{ {
clientMsg.AddData(e.Datagram); clientMsg.AddData(e.Datagram);
AnalysisClientMessage(clientMsg); AnalysisClientMessage(ref clientMsg);
} }
} }
#endregion Events #endregion Events
#region Analysis #region Analysisbo
private void AnalysisClientMessage(ClientMessage clientMsg) private void AnalysisClientMessage(ref ClientMessage clientMsg)
{ {
//AA AA 01 C0 A8 01 64 88 13 C0 A8 01 05 28 23 74 00 01 01 18
//AA AA 01 C0 A8 01 05 28 23 C0 A8 01 64 88 13 7C 04 02 04 00 2B //AA AA 01 C0 A8 01 05 28 23 C0 A8 01 64 88 13 7C 04 02 04 00 2B
//AA AA 01 C0 A8 01 64 88 13 C0 A8 01 05 28 23 24 14 04 0A 00 02 00 03 //AA AA 01 C0 A8 01 64 88 13 C0 A8 01 05 28 23 24 14 04 0A 00 02 00 03
List<byte[]> msglist = clientMsg.GetMessageList(); List<byte[]> msglist = clientMsg.GetMessageList();
if (msglist == null || msglist.Count == 0) return; if (msglist == null || msglist.Count == 0) return;
for (int i = 0; i < msglist.Count; i++) for (int i = 0; i < msglist.Count; i++)
{ {
byte[] msg = msglist[i];
bool vaild = msg.Length >= 19 && msg[0] == 0xAA && msg[1] == 0xAA;
if (!vaild) continue;
DataMessage mm = new(); DataMessage mm = new();
mm.Decode(msglist[i]); mm.Decode(msglist[i]);
Console.WriteLine("Receive from {0}:{1} => {2}, {3}", clientMsg.Ip, clientMsg.Port, DataMessage.ToHexString(msglist[i]), JsonUtil.ToJson(mm)); Console.WriteLine("Receive from {0}:{1} => {2}, {3}", clientMsg.Ip, clientMsg.Port, DataMessage.ToHexString(msglist[i]), JsonUtil.ToJson(mm));
TcpAlarmHost host;
switch (mm.FunctionNum) switch (mm.FunctionNum)
{ {
case 0x00: case 0x00:
Console.WriteLine("主机登录:{0}", clientMsg.Ip); Console.WriteLine("主机登录:{0}", clientMsg.Ip);
if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId) if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId)
{ {
clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString(), Name = "未知设备" }; clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString() };
UpdateClientMessage(clientMsg.Ip, clientMsg.Host); UpdateDevice(clientMsg.Ip, clientMsg.Host);
ProcessDeviceStateEvent(ref clientMsg, 1);
} }
ResponseHostLogin_10(clientMsg, mm); ResponseHostLogin_10(clientMsg, mm);
if (clientMsg.SensorListEmpty && clientMsg.SensorListLock.TryEnterWriteLock(1000)) ClientMessage clientMsg2 = clientMsg;
if (clientMsg2.SensorsEmpty && clientMsg2.SensorsLock.TryEnterWriteLock(1000))
{ {
Task.Run(() => Task.Run(() =>
{ {
while (clientMsg.SensorListEmpty) while (clientMsg2.SensorsEmpty)
{ {
RequestSensorList_07(clientMsg); RequestSensorList_07(clientMsg2);
Thread.Sleep(1000); Thread.Sleep(1000);
} }
clientMsg.SensorListLock.ExitWriteLock(); clientMsg2.SensorsLock.ExitWriteLock();
}); });
} }
if (OnTcpDeviceMessage != null)
{
host = clientMsg.Host ?? new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString(), Name = "未知设备" };
OnTcpDeviceMessage(host, "报警主机登录");
}
break; break;
case 0x01: case 0x01:
Console.WriteLine("心跳:{0}", clientMsg.Ip); Console.WriteLine("心跳:{0}", clientMsg.Ip);
ProcessDeviceStateEvent(ref clientMsg, 1);
break; break;
case 0x12: case 0x12:
@ -236,17 +211,11 @@ public class TcpManager
int alarm = state / 2 % 2; int alarm = state / 2 % 2;
if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId) if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId)
{ {
clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString(), Name = "未知设备" }; clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString() };
UpdateClientMessage(clientMsg.Ip, clientMsg.Host); UpdateDevice(clientMsg.Ip, clientMsg.Host);
} }
ProcessOnlineEvent(clientMsg, mm, sensorAddr, online); ProcessSensorStateEvent(ref clientMsg, mm, sensorAddr, online, alarm);
ProcessAlarmEvent(clientMsg, mm, sensorAddr, alarm);
UpdateOnLineAlarm(clientMsg, sensorAddr, online, alarm);
SetDataRequest(mm, 0x04); SetDataRequest(mm, 0x04);
if (alarm == 1)
{
RequestSensorReset_05(clientMsg);
}
break; break;
case 0x15: case 0x15:
@ -258,18 +227,17 @@ public class TcpManager
Console.WriteLine("返回传感器列表:{0}", clientMsg.Ip); Console.WriteLine("返回传感器列表:{0}", clientMsg.Ip);
if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId) if (clientMsg.Host == null || clientMsg.Host.Id != mm.DeviceId)
{ {
clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString(), Name = "设备" }; clientMsg.Host = new() { Id = mm.DeviceId, Ip = mm.SendIp, Port = mm.SendPort.ToString() };
UpdateClientMessage(clientMsg.Ip, clientMsg.Host); UpdateDevice(clientMsg.Ip, clientMsg.Host);
} }
if (clientMsg.SensorListEmpty) if (clientMsg.SensorsEmpty)
{ {
List<byte> sensorList = new();
for (int j = 2; j < mm.Data.Length; j++) for (int j = 2; j < mm.Data.Length; j++)
{ {
sensorList.Add(Convert.ToByte((mm.Data[j] + mm.Data[++j] * 256))); sensorAddr = Convert.ToByte((mm.Data[j] + mm.Data[++j] * 256));
SensorState sensor = new(mm.DeviceId, sensorAddr, 0, 0);
clientMsg.SensorDict[sensorAddr] = sensor;
} }
clientMsg.SensorList = sensorList;
UpdateClientMessage(clientMsg.Ip, sensorList);
RequestSensorState_04(clientMsg); RequestSensorState_04(clientMsg);
} }
SetDataRequest(mm, 0x07); SetDataRequest(mm, 0x07);
@ -278,70 +246,66 @@ public class TcpManager
} }
} }
private void ProcessOnlineEvent(ClientMessage client, DataMessage mm, int channel, int online) private void ProcessDeviceStateEvent(ref ClientMessage device, int online)
{ {
if (client.SectionTable.ContainsKey(channel)) if (device.OnlineState != online)
{ {
SensorState oldState = client.SectionTable[channel] as SensorState; device.OnlineState = online;
if (oldState.online == online) return; ReportDeviceState(device);
} }
TcpAlarmHost host = client.Host;
TcpSensorTable section = new() { DeviceId = host.Id, Name = "未知传感器", Channel = channel.ToString() };
OnTcpSensorMessage?.Invoke(host, section, online == 0 ? "传感器上线" : "传感器离线");
} }
private void ProcessAlarmEvent(ClientMessage client, DataMessage mm, int channel, int alarm) private void ProcessSensorStateEvent(ref ClientMessage client, DataMessage mm, int sensorAddr, int offline, int alarm)
{ {
if (client.SectionTable.ContainsKey(channel)) if (!client.SensorDict.TryGetValue(sensorAddr, out SensorState? sensor))
{ {
SensorState oldState = client.SectionTable[channel] as SensorState; sensor = new(mm.DeviceId, sensorAddr, offline, alarm);
if (oldState.alarm == alarm) return; client.SensorDict[sensorAddr] = sensor;
ReportSensorState(sensor);
}
else if (sensor.OfflineState != offline || sensor.AlarmState != alarm)
{
sensor.OfflineState = offline;
sensor.AlarmState = alarm;
ReportSensorState(sensor);
} }
TcpAlarmHost host = client.Host;
if (alarm == 1) if (alarm == 1)
{ {
ProcessAlarm(host.Id, channel); ReportAlarm(sensor.DeviceId, sensorAddr);
//RequestSensorReset_05(clientMsg, sensorAddr);
} }
} }
private void UpdateOnLineAlarm(ClientMessage client, int channel, int online, int alarm) private void ReportDeviceState(ClientMessage device)
{
if (client.SectionTable.ContainsKey(channel))
{ {
SensorState oldState = client.SectionTable[channel] as SensorState; OnVibrateTcpDeviceState?.Invoke(device);
oldState.online = online;
oldState.alarm = alarm;
OnTcpSensorStateChange?.Invoke(oldState);
} }
else
private void ReportSensorState(SensorState sensor)
{ {
TcpAlarmHost host = client.Host; OnVibrateTcpSensorState?.Invoke(sensor);
SensorState state = new(host.Id, channel, online, alarm);
client.SectionTable[channel] = state;
OnTcpSensorStateChange?.Invoke(state);
}
} }
private void ProcessAlarm(int deviceId, int channel) private void ReportAlarm(int deviceId, int sensorAddr)
{ {
TcpAlarmHostMessage alarmMsg = new() TcpAlarmHostMessage alarmMsg = new()
{ {
AlarmTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), AlarmTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
CID = "1151", CID = "1151",
DeviceID = deviceId, DeviceID = deviceId,
SensorAddr = channel.ToString() SensorAddr = sensorAddr.ToString()
}; };
OnTcpSensorAlarm?.Invoke(alarmMsg); OnVibrateTcpAlarm?.Invoke(alarmMsg);
} }
#endregion Analysis #endregion Analysisbo
#region Send #region Send
public bool SendMessage(string ip, byte[] bytes) public bool SendMessage(string ip, byte[] bytes)
{ {
if (Server == null || !Server.IsRunning()) return false; if (Server == null || !Server.IsRunning()) return false;
if (!TryGetClientMessage(ip, out ClientMessage clientMsg)) return false; if (!TryGetDevice(ip, out ClientMessage clientMsg)) return false;
string cmd = DataMessage.ToHexString(bytes); string cmd = DataMessage.ToHexString(bytes);
DataMessage mm = new(); DataMessage mm = new();
mm.Decode(bytes); mm.Decode(bytes);
@ -398,12 +362,12 @@ public class TcpManager
public bool RequestSensorState_04(ClientMessage client) public bool RequestSensorState_04(ClientMessage client)
{ {
if (client.Host == null || client.Host.Id < 0) return false; if (client.Host == null || client.Host.Id < 0) return false;
if (client.SensorListEmpty) return false; if (client.SensorsEmpty) return false;
DataMessage msg = GetSendMessageHead(client.Host.Id, client, 0x04, 2); DataMessage msg = GetSendMessageHead(client.Host.Id, client, 0x04, 2);
foreach (var item in client.SensorList) foreach (var item in client.SensorDict.Values)
{ {
int channel = item; int sensorAddr = item.Addr;
msg.Data = new byte[] { (byte)(channel % 256), (byte)(channel / 256) }; msg.Data = new byte[] { (byte)(sensorAddr % 256), (byte)(sensorAddr / 256) };
DataRequest request = new() DataRequest request = new()
{ {
Request = msg Request = msg
@ -413,21 +377,17 @@ public class TcpManager
return true; return true;
} }
public bool RequestSensorReset_05(ClientMessage client) public bool RequestSensorReset_05(ClientMessage client, int sensorAddr)
{ {
if (client.Host == null || client.Host.Id < 0) return false; if (client.Host == null || client.Host.Id < 0) return false;
if (client.SensorListEmpty) return false; if (client.SensorsEmpty) return false;
DataMessage msg = GetSendMessageHead(client.Host.Id, client, 0x05, 2); DataMessage msg = GetSendMessageHead(client.Host.Id, client, 0x05, 2);
foreach (var item in client.SensorList) msg.Data = new byte[] { (byte)(sensorAddr % 256), (byte)(sensorAddr / 256) };
{
int channel = item;
msg.Data = new byte[] { (byte)(channel % 256), (byte)(channel / 256) };
DataRequest request = new() DataRequest request = new()
{ {
Request = msg Request = msg
}; };
SendRequest(ref request); SendRequest(ref request);
}
return true; return true;
} }
@ -454,52 +414,64 @@ public class TcpManager
#region ClientMessage #region ClientMessage
private bool ContainsClientMessage(string clientIp) public bool ContainsDevice(string clientIp)
{ {
return ClientMessageDict.ContainsKey(clientIp); return DeviceDict.ContainsKey(clientIp);
} }
private ClientMessage GetClientMessage(string clientIp) public ClientMessage GetDevice(string clientIp)
{ {
return ClientMessageDict[clientIp]; return DeviceDict[clientIp];
} }
private bool TryGetClientMessage(string clientIp, out ClientMessage clientMsg) public bool TryGetDevice(string clientIp, out ClientMessage clientMsg)
{ {
return ClientMessageDict.TryGetValue(clientIp, out clientMsg); return DeviceDict.TryGetValue(clientIp, out clientMsg);
} }
private bool AddClientMessage(string clientIp, ClientMessage clientMsg) public bool TryGetDevice(int deviceId, out ClientMessage clientMsg)
{ {
if (ContainsClientMessage(clientIp)) return false; foreach (var item in DeviceDict.Values)
ClientMessageDict[clientIp] = clientMsg; {
if (item.Host.Id == deviceId)
{
clientMsg = item;
return true; return true;
} }
}
clientMsg = null;
return false;
}
private void SetClientMessage(string clientIp, ClientMessage clientMsg) private bool AddDeivce(string clientIp, ClientMessage clientMsg)
{ {
ClientMessageDict[clientIp] = clientMsg; if (ContainsDevice(clientIp)) return false;
DeviceDict[clientIp] = clientMsg;
return true;
} }
private bool RemoveClientMessage(string clientIp) private void SetDevice(string clientIp, ClientMessage clientMsg)
{ {
return ClientMessageDict.Remove(clientIp, out _); DeviceDict[clientIp] = clientMsg;
} }
private bool UpdateClientMessage(string clientIp, TcpAlarmHost host) private bool RemoveDevice(string clientIp)
{ {
if (!ClientMessageDict.ContainsKey(clientIp)) return false; return DeviceDict.Remove(clientIp, out _);
ClientMessageDict[clientIp].Host = host;
return true;
} }
private bool UpdateClientMessage(string clientIp, List<byte> sensorList) private bool UpdateDevice(string clientIp, TcpAlarmHost host)
{ {
if (!ClientMessageDict.ContainsKey(clientIp)) return false; if (!DeviceDict.ContainsKey(clientIp)) return false;
ClientMessageDict[clientIp].SensorList = sensorList; DeviceDict[clientIp].Host = host;
return true; return true;
} }
public List<ClientMessage> GetDeviceList()
{
return DeviceDict.Values.ToList();
}
#endregion ClientMessage #endregion ClientMessage
#region Set #region Set

10
JiLinApp.Docking/config/alarmcode.json

@ -219,18 +219,24 @@
"Id": "1151", "Id": "1151",
"Level": "1", "Level": "1",
"Type": "警报", "Type": "警报",
"Content": "挖掘报警" "Content": "震动报警"
}, },
{ {
"Id": "1152", "Id": "1152",
"Level": "1", "Level": "1",
"Type": "警报", "Type": "警报",
"Content": "步行报警" "Content": "挖掘报警"
}, },
{ {
"Id": "1153", "Id": "1153",
"Level": "1", "Level": "1",
"Type": "警报", "Type": "警报",
"Content": "步行报警"
},
{
"Id": "1154",
"Level": "1",
"Type": "警报",
"Content": "行车报警" "Content": "行车报警"
}, },
{ {

127
JiLinApp/Components/CameraRealPlay.xaml

@ -1,10 +1,131 @@
<Window x:Class="JiLinApp.Components.CameraRealPlay" <Window x:Class="JiLinApp.Components.CameraRealPlay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:components="clr-namespace:JiLinApp.Components"
mc:Ignorable="d" mc:Ignorable="d"
Title="RealPlay" Height="430" Width="640" ShowInTaskbar=" False"> Title="RealPlay" ShowInTaskbar="False" Width="769" Height="397">
<Image Name="player"> <Grid>
</Image> <Grid.ColumnDefinitions>
<ColumnDefinition Width="640*" />
<ColumnDefinition Width="114*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<DockPanel Grid.Column="0">
<components:NativeHost x:Name="player" />
</DockPanel>
<StackPanel Grid.Column="1" Margin="3 0 3 0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Grid Name="PtzPanel" Grid.Column="1" HorizontalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="35" />
<RowDefinition Height="35" />
<RowDefinition Height="35" />
<RowDefinition Height="5" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="35" />
<ColumnDefinition Width="35" />
<ColumnDefinition Width="35" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="LeftTopBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTopLeft" />
</Button>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="TopBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTop" />
</Button>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="RightTopBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTopRight" />
</Button>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="LeftBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowLeft" />
</Button>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="AutoMoveBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="Circle" />
</Button>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="RightBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowRight" />
</Button>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="LeftDownBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottomLeft" />
</Button>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="DownBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottom" />
</Button>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="RightDownBtn" Width="30" Height="30" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottomRight" />
</Button>
</StackPanel>
<StackPanel Grid.Row="4" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="ZoomInBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusBold" />
</Button>
</StackPanel>
<StackPanel Grid.Row="4" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="调焦" />
</StackPanel>
<StackPanel Grid.Row="4" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="ZoomOutBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="5" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="FocusNearBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="5" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="聚焦" />
</StackPanel>
<StackPanel Grid.Row="5" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="FocusFarBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="6" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="IrisOpenBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="6" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="光焦" />
</StackPanel>
<StackPanel Grid.Row="6" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="IrisCloseBtn" Width="25" Height="25" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
</Grid>
</StackPanel>
</Grid>
</Window> </Window>

52
JiLinApp/Components/CameraRealPlay.xaml.cs

@ -1,7 +1,11 @@
using EC.Util.CameraSDK; using EC.Util.CameraSDK;
using JiLinApp.Docking.Ptz;
using System; using System;
using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows; using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interop; using System.Windows.Interop;
namespace JiLinApp.Components; namespace JiLinApp.Components;
@ -21,14 +25,30 @@ public partial class CameraRealPlay : Window
{ {
InitializeComponent(); InitializeComponent();
CameraSdk = cameraSdk; CameraSdk = cameraSdk;
Init();
} }
#region Init
private void Init()
{
// 绑定云台响应事件
List<Button> btnList = new();
WpfUtil.FindVisualChild(PtzPanel, ref btnList);
foreach (var btn in btnList)
{
btn.AddHandler(MouseDownEvent, new MouseButtonEventHandler(PtzBtn_MouseDown), true);
btn.AddHandler(MouseUpEvent, new MouseButtonEventHandler(PtzBtn_MouseUp), true);
}
}
#endregion
#region Base #region Base
public void StartPlay() public void StartPlay()
{ {
IntPtr hwnd = ((HwndSource)PresentationSource.FromVisual(player)).Handle; CameraSdk.StartPlay(player.Handle);
CameraSdk.StartPlay(hwnd);
} }
public void StopPlay() public void StopPlay()
@ -36,6 +56,34 @@ public partial class CameraRealPlay : Window
CameraSdk.StopPlay(); CameraSdk.StopPlay();
} }
public void StartPlayFirmly()
{
while (!CameraSdk.IsPlaying())
{
StartPlay();
}
}
#endregion
#region ElementEvent
private void PtzBtn_MouseDown(object sender, RoutedEventArgs e)
{
if (CameraSdk == null) return;
PtzCmdType cmdType = PtzCmd.GetCmdType(((Button)sender).Name.Replace("Btn", ""));
int stop = 0;
PtzCameraCmd.PtzMove(CameraSdk, cmdType, new int[] { stop });
}
private void PtzBtn_MouseUp(object sender, RoutedEventArgs e)
{
if (CameraSdk == null) return;
PtzCmdType cmdType = PtzCmd.GetCmdType(((Button)sender).Name.Replace("Btn", ""));
int stop = 1;
PtzCameraCmd.PtzMove(CameraSdk, cmdType, new int[] { stop });
}
#endregion #endregion
private const int GWL_STYLE = -16; private const int GWL_STYLE = -16;

40
JiLinApp/Components/Core/NativeHost.cs

@ -0,0 +1,40 @@
using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
namespace JiLinApp.Components;
/// <summary>
/// https://blog.csdn.net/u013113678/article/details/121275982
/// </summary>
public class NativeHost : HwndHost
{
private const int WS_CHILD = 0x40000000;
private const int WS_VISIBLE = 0x10000000;
private const int LBS_NOTIFY = 0x001;
public new IntPtr Handle
{
get { return (IntPtr)GetValue(HandleProperty); }
set { SetValue(HandleProperty, value); }
}
// Using a DependencyProperty as the backing store for Hwnd. This enables animation, styling, binding, etc...
public static readonly DependencyProperty HandleProperty =
DependencyProperty.Register("Handle", typeof(IntPtr), typeof(NativeHost), new PropertyMetadata(IntPtr.Zero));
private HwndSource _source;
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
_source = new HwndSource(0, WS_CHILD | WS_VISIBLE | LBS_NOTIFY, 0, 0, 0, (int)Width, (int)Height, "nativeHost", hwndParent.Handle);
Handle = _source.Handle;
return new HandleRef(this, Handle);
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
_source.Dispose();
}
}

26
JiLinApp/Components/Core/WpfUtil.cs

@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
namespace JiLinApp.Components;
public class WpfUtil
{
/// <summary>
/// 查找子控件
/// </summary>
/// <typeparam name="T">控件类型</typeparam>
/// <param name="parent">父控件依赖对象</param>
/// <param name="list">子控件列表</param>
public static void FindVisualChild<T>(DependencyObject parent, ref List<T> list) where T : DependencyObject
{
if (parent == null) return;
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
if (v is T child) list.Add(child);
FindVisualChild(v, ref list);
}
}
}

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

@ -1,5 +1,10 @@
using JiLinApp.Docking.FenceAlarm; using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Core;
using JiLinApp.Docking.FenceAlarm;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -14,6 +19,8 @@ public partial class Main : UserControl
private UdpManager Manager { get; } = new(); private UdpManager Manager { get; } = new();
private IAlarmService AlarmService { get; set; }
#endregion Fields #endregion Fields
public Main() public Main()
@ -30,10 +37,15 @@ public partial class Main : UserControl
{ {
MainViewModel vm = DataContext as MainViewModel; MainViewModel vm = DataContext as MainViewModel;
vm.SetView(this); vm.SetView(this);
Manager.OnFenceUdpDeviceState += vm.OnFenceUdpDeviceState;
Manager.OnUdpAlarmDeviceState += vm.OnUdpAlarmDeviceState; Manager.OnFenceUdpSectorState += vm.OnFenceUdpSensorState;
Manager.OnUdpAlarmSectorState += vm.OnUdpAlarmSectionState; Manager.OnFenceUdpAlarm += vm.OnFenceUdpAlarm;
Manager.OnUdpAlarm += vm.OnUdpAlarmEvent; }
AlarmService = Global.AlarmService;
if (AlarmService != null)
{
AlarmService.OnFenceUdpSendDevices += AlarmService_OnFenceUdpSendDevices;
AlarmService.OnFenceUdpSendSensors += AlarmService_OnFenceUdpSendSensors;
} }
} }
@ -88,4 +100,67 @@ public partial class Main : UserControl
} }
#endregion ElementEvent #endregion ElementEvent
#region Event
private void AlarmService_OnFenceUdpSendDevices(JObject reqObj)
{
List<object> respDeviceList = new();
List<UdpAlarmHost> deviceList = Manager.GetDeviceList();
foreach (var item in deviceList)
{
if (item.DeviceId <= 0) continue;
respDeviceList.Add(new
{
id = item.DeviceId,
//groupId = item.GroupId,
//userId = item.UserId,
onlineState = item.OnlineState,
defenceState = item.DefenceState
});
}
//int[] dsArr = { 0, 1, 2, 4, 8, 9 };
//for (int i = 1; i <= 6; i++)
//{
// respDeviceList.Add(new
// {
// id = i,
// //groupId = item.GroupId,
// //userId = item.UserId,
// onlineState = i % 2,
// defenceState = dsArr[(i - 1) % 6]
// });
//}
AlarmService.SendDevices(DeviceType.Fence, respDeviceList);
}
private void AlarmService_OnFenceUdpSendSensors(JObject reqObj)
{
int deviceId = reqObj.GetValue("deviceId", StringComparison.OrdinalIgnoreCase).ToInt();
List<SectorState> sectorList = Manager.TryGetDevice(deviceId, out UdpAlarmHost device) ? device.SectorDict.Values.ToList() : new();
List<object> respSensorList = new();
foreach (var item in sectorList)
{
respSensorList.Add(new
{
id = item.Id,
deviceId = item.DeviceId,
state = item.State,
type = item.Type,
});
}
//for (int i = 1; i <= 7; i++)
//{
// respSensorList.Add(new
// {
// id = i,
// deviceId = deviceId,
// state = (i - 1) % 7,
// type = 0,
// });
//}
AlarmService.SendSensors(DeviceType.Fence, deviceId, respSensorList);
}
#endregion Event
} }

36
JiLinApp/Pages/FenceServerManage/MainViewModel.cs

@ -1,4 +1,6 @@
using JiLinApp.Docking.FenceAlarm; using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Core;
using JiLinApp.Docking.FenceAlarm;
using JiLinApp.Mvvm; using JiLinApp.Mvvm;
using JiLinApp.Pages.Main; using JiLinApp.Pages.Main;
using Prism.Events; using Prism.Events;
@ -12,10 +14,13 @@ public class MainViewModel : ViewModelBase
private Main View { get; set; } private Main View { get; set; }
private IAlarmService AlarmService { get; }
#endregion Fields #endregion Fields
public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea) public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea)
{ {
AlarmService = Global.AlarmService;
} }
public override void SetView(object view) public override void SetView(object view)
@ -23,20 +28,37 @@ public class MainViewModel : ViewModelBase
View = (Main)view; View = (Main)view;
} }
#region ConnEvent #region Event
internal void OnUdpAlarmDeviceState(int deviceId, int state) internal void OnFenceUdpDeviceState(UdpAlarmHost device)
{
object deviceObj = new
{ {
id = device.DeviceId,
onlineState = device.OnlineState,
defenceState = device.DefenceState
};
AlarmService.SendDeviceState(DeviceType.Fence, deviceObj);
} }
internal void OnUdpAlarmSectionState(int deviceId, int sectorId, int state) internal void OnFenceUdpSensorState(SectorState sector)
{
object sensorObj = new
{ {
id = sector.Id,
deviceId = sector.DeviceId,
state = sector.State,
type = sector.Type,
};
AlarmService.SendSensorState(DeviceType.Fence, sensorObj);
} }
internal void OnUdpAlarmEvent(UdpAlarmHostMessage msg) internal void OnFenceUdpAlarm(UdpAlarmHostMessage msg)
{ {
_ea.GetEvent<FenceUdpAlarmSendEvent>().Publish(msg); AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarm(alarm);
_ea.GetEvent<FenceUdpSendAlarmEvent>().Publish(msg);
} }
#endregion ConnEvent #endregion Event
} }

14
JiLinApp/Pages/Main/Core/MessageEvent.cs

@ -4,14 +4,18 @@ using Prism.Events;
namespace JiLinApp.Pages.Main; namespace JiLinApp.Pages.Main;
public class MessageSentEvent : PubSubEvent<string> #region VibrateTcp
{
}
public class ShakeTcpAlarmSendEvent : PubSubEvent<TcpAlarmHostMessage> public class VibrateTcpSendAlarmEvent : PubSubEvent<TcpAlarmHostMessage>
{ {
} }
public class FenceUdpAlarmSendEvent : PubSubEvent<UdpAlarmHostMessage> #endregion
#region FenceUdp
public class FenceUdpSendAlarmEvent : PubSubEvent<UdpAlarmHostMessage>
{ {
} }
#endregion

102
JiLinApp/Pages/PtzManage/Main.xaml

@ -89,80 +89,126 @@
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" /> <ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" /> <ColumnDefinition Width="2*" />
<ColumnDefinition Width="1*" /> <ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Grid.Column="0"> <StackPanel Grid.Column="0">
<ComboBox Name="ControlTypeName" materialDesign:HintAssist.Hint="控制类型" Width="200" SelectionChanged="ControlTypeName_SelectionChanged" Style="{StaticResource MaterialDesignOutlinedComboBox}"> <ComboBox Name="ControlTypeName" materialDesign:HintAssist.Hint="控制类型" Width="160" SelectionChanged="ControlTypeName_SelectionChanged" Style="{StaticResource MaterialDesignOutlinedComboBox}">
</ComboBox> </ComboBox>
<ComboBox Name="CameraId" materialDesign:HintAssist.Hint="相机Id" Width="200" Margin="0 10 0 0" SelectedIndex="0" Style="{StaticResource MaterialDesignOutlinedComboBox}"> <ComboBox Name="CameraId" materialDesign:HintAssist.Hint="相机Id" Width="160" Margin="0 10 0 0" SelectedIndex="0" Style="{StaticResource MaterialDesignOutlinedComboBox}">
</ComboBox> </ComboBox>
</StackPanel> </StackPanel>
<Grid Name="PtzPanel" Grid.Column="1" HorizontalAlignment="Center"> <Grid Name="PtzPanel" Grid.Column="1" HorizontalAlignment="Center">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="55" /> <RowDefinition Height="50" />
<RowDefinition Height="55" /> <RowDefinition Height="50" />
<RowDefinition Height="55" /> <RowDefinition Height="50" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="55" /> <ColumnDefinition Width="50" />
<ColumnDefinition Width="55" /> <ColumnDefinition Width="50" />
<ColumnDefinition Width="55" /> <ColumnDefinition Width="50" />
<ColumnDefinition Width="15" />
<ColumnDefinition Width="40" />
<ColumnDefinition Width="40" />
<ColumnDefinition Width="40" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0"> <StackPanel Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="TopLeftBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="LeftTopBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTopLeft" /> <materialDesign:PackIcon Kind="ArrowTopLeft" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1"> <StackPanel Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="TopBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="TopBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTop" /> <materialDesign:PackIcon Kind="ArrowTop" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="2"> <StackPanel Grid.Row="0" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="TopRightBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="RightTopBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowTopRight" /> <materialDesign:PackIcon Kind="ArrowTopRight" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="0"> <StackPanel Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="LeftBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="LeftBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowLeft" /> <materialDesign:PackIcon Kind="ArrowLeft" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="1"> <StackPanel Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="AutoStartBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="AutoMoveBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="Circle" /> <materialDesign:PackIcon Kind="Circle" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="1" Grid.Column="2"> <StackPanel Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="RightBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="RightBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowRight" /> <materialDesign:PackIcon Kind="ArrowRight" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Grid.Column="0"> <StackPanel Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="DownLeftBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="LeftDownBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottomLeft" /> <materialDesign:PackIcon Kind="ArrowBottomLeft" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Grid.Column="1"> <StackPanel Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="DownBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="DownBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottom" /> <materialDesign:PackIcon Kind="ArrowBottom" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Grid.Column="2"> <StackPanel Grid.Row="2" Grid.Column="2" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="DownRightBtn" Width="50" Height="50" Style="{StaticResource MaterialDesignOutlinedLightButton}"> <Button Name="RightDownBtn" Width="45" Height="45" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="ArrowBottomRight" /> <materialDesign:PackIcon Kind="ArrowBottomRight" />
</Button> </Button>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="0" Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="ZoomInBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusBold" />
</Button>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="调焦" />
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="6" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="ZoomOutBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="FocusNearBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="聚焦" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="6" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="FocusFarBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="4" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="IrisOpenBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="PlusThick" />
</Button>
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="5" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Style="{StaticResource MaterialDesignTextBlock}" Text="光焦" />
</StackPanel>
<StackPanel Grid.Row="2" Grid.Column="6" HorizontalAlignment="Center" VerticalAlignment="Center">
<Button Name="IrisCloseBtn" Width="35" Height="35" Padding="0" Style="{StaticResource MaterialDesignOutlinedLightButton}">
<materialDesign:PackIcon Kind="MinusThick" />
</Button>
</StackPanel>
</Grid> </Grid>
<StackPanel Grid.Column="2"> <StackPanel Grid.Column="2">
<ComboBox Name="PresetId" materialDesign:HintAssist.Hint="预置点Id" Width="200" SelectedIndex="0" Style="{StaticResource MaterialDesignOutlinedComboBox}"> <ComboBox Name="PresetId" materialDesign:HintAssist.Hint="预置点Id" Width="160" SelectedIndex="0" Style="{StaticResource MaterialDesignOutlinedComboBox}">
</ComboBox> </ComboBox>
<Button Name="GotoBtn" Content="前往预置点" Width="120" Margin="0 10 0 0" Click="GotoBtn_Click" Style="{StaticResource MaterialDesignRaisedLightButton}" /> <Button Name="GotoBtn" Content="前往预置点" Width="120" Margin="0 10 0 0" Click="GotoBtn_Click" Style="{StaticResource MaterialDesignRaisedLightButton}" />
<Button Name="TestBtn" Content="测试" Width="120" Visibility="Visible" Margin="0 10 0 0" Click="TestBtn_Click" Style="{StaticResource MaterialDesignRaisedLightButton}" /> <Button Name="TestBtn" Content="测试" Width="120" Visibility="Visible" Margin="0 10 0 0" Click="TestBtn_Click" Style="{StaticResource MaterialDesignRaisedLightButton}" />

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

@ -16,7 +16,6 @@ using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading; using System.Windows.Threading;
namespace JiLinApp.Pages.PtzManage; namespace JiLinApp.Pages.PtzManage;
@ -80,11 +79,11 @@ public partial class Main : UserControl
// 绑定云台响应事件 // 绑定云台响应事件
List<Button> btnList = new(); List<Button> btnList = new();
FindVisualChild<Button>(PtzPanel, ref btnList); WpfUtil.FindVisualChild(PtzPanel, ref btnList);
foreach (var btn in btnList) foreach (var btn in btnList)
{ {
btn.AddHandler(Button.MouseDownEvent, new MouseButtonEventHandler(PtzBtn_MouseDown), true); btn.AddHandler(MouseDownEvent, new MouseButtonEventHandler(PtzBtn_MouseDown), true);
btn.AddHandler(Button.MouseUpEvent, new MouseButtonEventHandler(PtzBtn_MouseUp), true); btn.AddHandler(MouseUpEvent, new MouseButtonEventHandler(PtzBtn_MouseUp), true);
} }
// 刷新控件状态 // 刷新控件状态
@ -366,14 +365,14 @@ public partial class Main : UserControl
realPlay.StartPlay(); realPlay.StartPlay();
//切换至下一相机 //切换至下一相机
int index = CameraIp.SelectedIndex; //int index = CameraIp.SelectedIndex;
index = (index + 1) % CameraIp.Items.Count; //index = (index + 1) % CameraIp.Items.Count;
CameraIp.SelectedIndex = index; //CameraIp.SelectedIndex = index;
} }
#endregion InvokeEvent #endregion InvokeEvent
#region HikMap #region CameraSdkMap
private void LoadCameraList() private void LoadCameraList()
{ {
@ -398,7 +397,7 @@ public partial class Main : UserControl
try try
{ {
bool ret = sdk.Init(); bool ret = sdk.Init();
if (!ret) sdk.BuildException(); if (!ret) return;
CameraSdkMap[ip] = sdk; CameraSdkMap[ip] = sdk;
} }
catch (Exception ex) catch (Exception ex)
@ -409,34 +408,5 @@ public partial class Main : UserControl
} }
} }
#endregion HikMap #endregion CameraSdkMap
#region Util
/// <summary>
/// 查找子控件
/// </summary>
/// <typeparam name="T">控件类型</typeparam>
/// <param name="parent">父控件依赖对象</param>
/// <param name="list">子控件列表</param>
public static void FindVisualChild<T>(DependencyObject parent, ref List<T> list) where T : DependencyObject
{
if (parent != null)
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child != null)
{
list.Add(child);
}
FindVisualChild<T>(v, ref list);
}
}
}
#endregion Util
} }

13
JiLinApp/Pages/PtzManage/MainViewModel.cs

@ -17,19 +17,16 @@ public class MainViewModel : ViewModelBase
private AppConfig AppConfig { get; } private AppConfig AppConfig { get; }
private IAlarmService AlarmService { get; }
#endregion Fields #endregion Fields
public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea) public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea)
{ {
// Bind global fields // Bind global fields
AppConfig = Global.AppConfig; AppConfig = Global.AppConfig;
AlarmService = Global.AlarmService;
// Bind invoke event // Bind invoke event
ea.GetEvent<ShakeTcpAlarmSendEvent>().Subscribe(ShakeTcpAlarmReact); ea.GetEvent<VibrateTcpSendAlarmEvent>().Subscribe(VibrateTcpSendAlarm);
ea.GetEvent<FenceUdpAlarmSendEvent>().Subscribe(FenceUdpAlarmReact); ea.GetEvent<FenceUdpSendAlarmEvent>().Subscribe(FenceUdpSendAlarm);
} }
public override void SetView(object view) public override void SetView(object view)
@ -39,17 +36,15 @@ public class MainViewModel : ViewModelBase
#region InvokeEvent #region InvokeEvent
internal void ShakeTcpAlarmReact(TcpAlarmHostMessage msg) internal void VibrateTcpSendAlarm(TcpAlarmHostMessage msg)
{ {
AlarmMessage alarm = msg.ToAlarmMessage(); AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarmMessage(alarm);
View.GotoPresetInvoke(alarm); View.GotoPresetInvoke(alarm);
} }
internal void FenceUdpAlarmReact(UdpAlarmHostMessage msg) internal void FenceUdpSendAlarm(UdpAlarmHostMessage msg)
{ {
AlarmMessage alarm = msg.ToAlarmMessage(); AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarmMessage(alarm);
View.GotoPresetInvoke(alarm); View.GotoPresetInvoke(alarm);
} }

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

@ -1,5 +1,10 @@
using JiLinApp.Docking.VibrateAlarm; using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Core;
using JiLinApp.Docking.VibrateAlarm;
using Newtonsoft.Json.Linq;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -14,6 +19,8 @@ public partial class Main : UserControl
private TcpManager Manager { get; } = new(); private TcpManager Manager { get; } = new();
private IAlarmService AlarmService { get; set; }
#endregion Fields #endregion Fields
public Main() public Main()
@ -30,10 +37,15 @@ public partial class Main : UserControl
{ {
MainViewModel vm = DataContext as MainViewModel; MainViewModel vm = DataContext as MainViewModel;
vm.SetView(this); vm.SetView(this);
Manager.OnVibrateTcpDeviceState += vm.OnVibrateTcpDeviceState;
Manager.OnTcpDeviceMessage += vm.OnTcpDeviceMessage; Manager.OnVibrateTcpSensorState += vm.OnVibrateTcpSensorSate;
Manager.OnTcpSensorMessage += vm.OnTcpSectionMessage; Manager.OnVibrateTcpAlarm += vm.OnVibrateTcpAlarm;
Manager.OnTcpSensorAlarm += vm.OnTcpSectionAlarm; }
AlarmService = Global.AlarmService;
if (AlarmService != null)
{
AlarmService.OnVibrateTcpSendDevices += AlarmService_OnVibrateTcpSendDevices;
AlarmService.OnVibrateTcpSendSensors += AlarmService_OnVibrateTcpSendSensors;
} }
} }
@ -71,7 +83,7 @@ public partial class Main : UserControl
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(ex.ToString()); MessageBox.Show(ex.ToString());
throw; return;
} }
} }
ChangeState(true); ChangeState(true);
@ -94,4 +106,60 @@ public partial class Main : UserControl
} }
#endregion ElementEvent #endregion ElementEvent
#region Event
private void AlarmService_OnVibrateTcpSendDevices(JObject reqObj)
{
List<object> respDeviceList = new();
List<ClientMessage> deviceList = Manager.GetDeviceList();
foreach (var item in deviceList)
{
if (item.Host.Id <= 0) continue;
respDeviceList.Add(new
{
id = item.Host.Id,
onlineState = item.OnlineState
});
}
//for (int i = 1; i <= 5; i++)
//{
// respDeviceList.Add(new
// {
// id = i,
// onlineState = i % 2
// });
//}
AlarmService.SendDevices(DeviceType.Vibrate, respDeviceList);
}
private void AlarmService_OnVibrateTcpSendSensors(JObject reqObj)
{
int deviceId = reqObj.GetValue("deviceId", StringComparison.OrdinalIgnoreCase).ToInt();
List<SensorState> sensorList = Manager.TryGetDevice(deviceId, out ClientMessage device) ? device.SensorDict.Values.ToList() : new();
List<object> respSensorList = new();
foreach (var item in sensorList)
{
respSensorList.Add(new
{
id = item.Addr,
deviceId = item.DeviceId,
onlineState = item.OnlineState,
alarmState = item.AlarmState,
});
}
//for (int i = 1; i <= 7; i++)
//{
// respSensorList.Add(new
// {
// id = i,
// deviceId = deviceId,
// onlineState = i % 2,
// alarmState = i % 2,
// });
//}
AlarmService.SendSensors(DeviceType.Vibrate, deviceId, respSensorList);
}
#endregion Event
} }

35
JiLinApp/Pages/VibrateServerManage/MainViewModel.cs

@ -1,4 +1,6 @@
using JiLinApp.Docking.VibrateAlarm; using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Core;
using JiLinApp.Docking.VibrateAlarm;
using JiLinApp.Mvvm; using JiLinApp.Mvvm;
using JiLinApp.Pages.Main; using JiLinApp.Pages.Main;
using Prism.Events; using Prism.Events;
@ -12,10 +14,13 @@ public class MainViewModel : ViewModelBase
private Main View { get; set; } private Main View { get; set; }
private IAlarmService AlarmService { get; }
#endregion Fields #endregion Fields
public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea) public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea)
{ {
AlarmService = Global.AlarmService;
} }
public override void SetView(object view) public override void SetView(object view)
@ -23,20 +28,36 @@ public class MainViewModel : ViewModelBase
View = (Main)view; View = (Main)view;
} }
#region ConnEvent #region Event
internal void OnTcpDeviceMessage(TcpAlarmHost host, string msg) internal void OnVibrateTcpDeviceState(ClientMessage device)
{
object deviceObj = new
{ {
id = device.Host.Id,
onlineState = device.OnlineState
};
AlarmService.SendDeviceState(DeviceType.Vibrate, deviceObj);
} }
internal void OnTcpSectionMessage(TcpAlarmHost host, TcpSensorTable section, string msg) internal void OnVibrateTcpSensorSate(SensorState sensor)
{
object sensorObj = new
{ {
id = sensor.Addr,
deviceId = sensor.DeviceId,
onlineState = sensor.OnlineState,
alarmState = sensor.AlarmState,
};
AlarmService.SendSensorState(DeviceType.Vibrate, sensorObj);
} }
internal void OnTcpSectionAlarm(TcpAlarmHostMessage msg) internal void OnVibrateTcpAlarm(TcpAlarmHostMessage msg)
{ {
_ea.GetEvent<ShakeTcpAlarmSendEvent>().Publish(msg); AlarmMessage alarm = msg.ToAlarmMessage();
AlarmService.SendAlarm(alarm);
_ea.GetEvent<VibrateTcpSendAlarmEvent>().Publish(msg);
} }
#endregion ConnEvent #endregion Event
} }

12
JiLinApp/config/config.json

@ -53,12 +53,14 @@
"username": "admin", "username": "admin",
"password": "public", "password": "public",
"clientId": "alarm-platform1", "clientId": "alarm-platform1",
"retryTime": "5",
"retryInterval": "200",
"pubDevicesTopic": "PPS/Devices",
"pubSensorsTopic": "PPS/Sensors",
"pubDeviceStateTopic": "PPS/DeviceState",
"pubSensorStateTopic": "PPS/SensorState",
"pubAlarmTopic": "PPS/AlarmMessage/Fence", "pubAlarmTopic": "PPS/AlarmMessage/Fence",
"subDevicesTopic": "PPS/AlarmMessage/Fence", "subCmdTopic": "PPS/Cmd"
"subSensorsTopic": "PPS/AlarmMessage/Fence",
"subDeviceStateTopic": "PPS/AlarmMessage/Fence",
"subSensorStateTopic": "PPS/AlarmMessage/Fence",
"subCmdTopic": ""
} }
} }
} }
Loading…
Cancel
Save