diff --git a/EC.Util/CameraSDK/Common/ICameraSDK.cs b/EC.Util/CameraSDK/Common/ICameraSDK.cs
index aea8e44..60efa38 100644
--- a/EC.Util/CameraSDK/Common/ICameraSDK.cs
+++ b/EC.Util/CameraSDK/Common/ICameraSDK.cs
@@ -36,7 +36,7 @@ public abstract class ICameraSDK
///
/// 构建异常
///
- public abstract void BuildException();
+ internal abstract void BuildException();
#endregion Base Method
diff --git a/EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs b/EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs
index 7b43898..a8c352d 100644
--- a/EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs
+++ b/EC.Util/CameraSDK/DaHua/DaHuaOriSDK.cs
@@ -622,67 +622,67 @@ public static class DaHuaOriSDK
/// Up
/// 上
///
- UP_CONTROL = 0,
+ UP = 0,
///
/// Down
/// 下
///
- DOWN_CONTROL,
+ DOWN,
///
/// Left
/// 左
///
- LEFT_CONTROL,
+ LEFT,
///
/// Right
/// 右
///
- RIGHT_CONTROL,
+ RIGHT,
///
/// +Zoom in
/// 变倍+
///
- ZOOM_ADD_CONTROL,
+ ZOOM_ADD,
///
/// -Zoom out
/// 变倍-
///
- ZOOM_DEC_CONTROL,
+ ZOOM_DEC,
///
/// +Focus
/// 调焦+
///
- FOCUS_ADD_CONTROL,
+ FOCUS_ADD,
///
/// -Focus
/// 调焦-
///
- FOCUS_DEC_CONTROL,
+ FOCUS_DEC,
///
/// + Aperture
/// 光圈+
///
- APERTURE_ADD_CONTROL,
+ APERTURE_ADD,
///
/// -Aperture
/// 光圈-
///
- APERTURE_DEC_CONTROL,
+ APERTURE_DEC,
///
/// Go to preset
/// 转至预置点
///
- POINT_MOVE_CONTROL,
+ POINT_MOVE,
///
/// Set
diff --git a/EC.Util/CameraSDK/DaHua/DaHuaSDK.cs b/EC.Util/CameraSDK/DaHua/DaHuaSDK.cs
index 28610de..bcb7cfc 100644
--- a/EC.Util/CameraSDK/DaHua/DaHuaSDK.cs
+++ b/EC.Util/CameraSDK/DaHua/DaHuaSDK.cs
@@ -59,7 +59,7 @@ public class DaHuaSDK : ICameraSDK
return LoginId != IntPtr.Zero;
}
- public override void BuildException()
+ internal override void BuildException()
{
uint errCode = (uint)DaHuaOriSDK.CLIENT_GetLastError();
if (errCode == 0) return;
@@ -137,28 +137,21 @@ public class DaHuaSDK : ICameraSDK
public override bool PtzMove(int cmd, int stop, int speed)
{
- //if (!ConnectSuccess()) return false;
- //if (stop == 1) cmd = YuShiOriSDK.ALLSTOP;
- //int channel = 1;
- //int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed);
- //return flag == YuShiOriSDK.TRUE;
-
if (!ConnectSuccess()) return false;
-
- //DaHuaOriSDK.CLIENT_DHPTZControlEx2();
-
-
- return true;
+ int channel = 0;
+ bool stopFlag = stop == 1;
+ bool flag = DaHuaOriSDK.CLIENT_DHPTZControlEx2(LoginId, channel, (uint)cmd, speed, speed, 0, stopFlag, IntPtr.Zero);
+ //if (flag) BuildException();
+ return flag;
}
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(), presetId);
- //return flag == YuShiOriSDK.TRUE;
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
diff --git a/EC.Util/CameraSDK/HiK/HiKOriSDK.cs b/EC.Util/CameraSDK/HiK/HiKOriSDK.cs
index 3076f50..9e02c65 100644
--- a/EC.Util/CameraSDK/HiK/HiKOriSDK.cs
+++ b/EC.Util/CameraSDK/HiK/HiKOriSDK.cs
@@ -55,6 +55,13 @@ public static class HiKOriSDK
#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_DOWN = 22; /* 云台以SS的速度下俯 */
public const int PAN_LEFT = 23; /* 云台以SS的速度左转 */
diff --git a/EC.Util/CameraSDK/HiK/HiKSDK.cs b/EC.Util/CameraSDK/HiK/HiKSDK.cs
index ad92565..320ec28 100644
--- a/EC.Util/CameraSDK/HiK/HiKSDK.cs
+++ b/EC.Util/CameraSDK/HiK/HiKSDK.cs
@@ -46,7 +46,7 @@ public class HiKSDK : ICameraSDK
return LoginId >= 0;
}
- public override void BuildException()
+ internal override void BuildException()
{
uint errCode = HiKOriSDK.NET_DVR_GetLastError();
if (errCode == 0) return;
@@ -125,7 +125,9 @@ public class HiKSDK : ICameraSDK
{
if (!ConnectSuccess()) return false;
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)
diff --git a/EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs b/EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs
index 0343a95..991cb12 100644
--- a/EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs
+++ b/EC.Util/CameraSDK/YuShi/YuShiOriSDK.cs
@@ -53,6 +53,14 @@ public static class YuShiOriSDK
public const int NETDEV_LEN_260 = 260;
/* 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 = 0x0302; /* Zoom in */
public const int ZOOMWIDE_STOP = 0x0303; /* Zoom out stop */
diff --git a/EC.Util/CameraSDK/YuShi/YuShiSDK.cs b/EC.Util/CameraSDK/YuShi/YuShiSDK.cs
index 655bf8b..53c2711 100644
--- a/EC.Util/CameraSDK/YuShi/YuShiSDK.cs
+++ b/EC.Util/CameraSDK/YuShi/YuShiSDK.cs
@@ -49,7 +49,7 @@ public class YuShiSDK : ICameraSDK
return LoginId != IntPtr.Zero;
}
- public override void BuildException()
+ internal override void BuildException()
{
int errCode = YuShiOriSDK.NETDEV_GetLastError();
if (errCode == 0) return;
@@ -91,6 +91,7 @@ public class YuShiSDK : ICameraSDK
if (stop == 1) cmd = YuShiOriSDK.ALLSTOP;
int channel = 1;
int flag = YuShiOriSDK.NETDEV_PTZControl_Other(LoginId, channel, cmd, speed);
+ //if (flag) BuildException();
return flag == YuShiOriSDK.TRUE;
}
diff --git a/JiLinApp.Biz/TransmitAlarm/Common/Config.cs b/JiLinApp.Biz/TransmitAlarm/Common/Config.cs
index b35b574..6427bb3 100644
--- a/JiLinApp.Biz/TransmitAlarm/Common/Config.cs
+++ b/JiLinApp.Biz/TransmitAlarm/Common/Config.cs
@@ -21,10 +21,21 @@ public class MqttConfig
public string ClientId { get; set; }
+ public int RetryTime { get; set; }
+
+ public int RetryInterval { 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
diff --git a/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs b/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
index 501c0ba..1da84a6 100644
--- a/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
+++ b/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
@@ -1,6 +1,9 @@
using EC.Util.Common;
using MQTTnet;
using MQTTnet.Client;
+using MQTTnet.Exceptions;
+using NewLife.Serialization;
+using Newtonsoft.Json.Linq;
using System.Text;
namespace JiLinApp.Biz.TransmitAlarm;
@@ -11,14 +14,20 @@ public class AlarmMqttService : IAlarmService
private MqttConfig Config { get; }
- //private MqttServer Server { get; }
-
private IMqttClient Client { get; }
private MqttClientOptions ClientOptions { 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
public AlarmMqttService(MqttConfig config)
@@ -34,7 +43,7 @@ public class AlarmMqttService : IAlarmService
.WithKeepAlivePeriod(TimeSpan.FromSeconds(60))
.Build();
SubscribeOptions = factory.CreateSubscribeOptionsBuilder()
- .WithTopicFilter(f => f.WithTopic("mqttnet/samples/topic/1"))
+ .WithTopicFilter(f => f.WithTopic(config.SubCmdTopic))
.Build();
Config = config;
@@ -51,8 +60,30 @@ public class AlarmMqttService : IAlarmService
public void Start()
{
if (IsRuning()) return;
- MqttClientConnectResult connResult = Client.ConnectAsync(ClientOptions, CancellationToken.None).Result;
- MqttClientSubscribeResult subResult = Client.SubscribeAsync(SubscribeOptions, CancellationToken.None).Result;
+ int retryTime = Config.RetryTime, retryInterval = Config.RetryInterval;
+ for (int i = 1; i <= retryTime; i++)
+ {
+ 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;
+ 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()
@@ -66,11 +97,108 @@ public class AlarmMqttService : IAlarmService
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()
- .WithTopic(Config.PubAlarmTopic)
- .WithPayload(JsonUtil.ToJson(msg))
+ .WithTopic(topic)
+ .WithPayload(obj.ToJson())
.Build();
MqttClientPublishResult? pubResult = null;
while (pubResult == null || !pubResult.IsSuccess)
@@ -81,24 +209,71 @@ public class AlarmMqttService : IAlarmService
}
catch (Exception)
{
- Start();
- Thread.Sleep(100);
+ while (!IsRuning())
+ {
+ if (StartAtom()) break;
+ Thread.Sleep(100);
+ }
}
}
}
- #endregion Base
+ public void SendAlarm(AlarmMessage msg)
+ {
+ Send(Config.PubAlarmTopic, msg);
+ }
- #region Receive
+ public void SendDevices(DeviceType type, List