diff --git a/JiLinApp.Biz/JiLinApp.Biz.csproj b/JiLinApp.Biz/JiLinApp.Biz.csproj
index 982d279..9f54f41 100644
--- a/JiLinApp.Biz/JiLinApp.Biz.csproj
+++ b/JiLinApp.Biz/JiLinApp.Biz.csproj
@@ -6,6 +6,10 @@
enable
+
+
+
+
diff --git a/JiLinApp.Biz/Transmit/Service/AlarmMqttService.cs b/JiLinApp.Biz/Transmit/Service/AlarmMqttService.cs
deleted file mode 100644
index 4be7bc0..0000000
--- a/JiLinApp.Biz/Transmit/Service/AlarmMqttService.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-using JiLinApp.Biz.Transmit;
-
-public class AlarmMqttService : IAlarmService
-{
-}
\ No newline at end of file
diff --git a/JiLinApp.Biz/Transmit/Service/AlarmZmqService.cs b/JiLinApp.Biz/Transmit/Service/AlarmZmqService.cs
deleted file mode 100644
index cc04baa..0000000
--- a/JiLinApp.Biz/Transmit/Service/AlarmZmqService.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-using JiLinApp.Biz.Transmit;
-
-public class AlarmZmqService : IAlarmService
-{
-}
\ No newline at end of file
diff --git a/JiLinApp.Biz/Transmit/Service/Interfaces/IAlarmService.cs b/JiLinApp.Biz/Transmit/Service/Interfaces/IAlarmService.cs
deleted file mode 100644
index 582e7d8..0000000
--- a/JiLinApp.Biz/Transmit/Service/Interfaces/IAlarmService.cs
+++ /dev/null
@@ -1,5 +0,0 @@
-namespace JiLinApp.Biz.Transmit;
-
-public interface IAlarmService
-{
-}
\ No newline at end of file
diff --git a/JiLinApp.Biz/TransmitAlarm/Common/AlarmServiceFactory.cs b/JiLinApp.Biz/TransmitAlarm/Common/AlarmServiceFactory.cs
new file mode 100644
index 0000000..e2a3e1f
--- /dev/null
+++ b/JiLinApp.Biz/TransmitAlarm/Common/AlarmServiceFactory.cs
@@ -0,0 +1,14 @@
+namespace JiLinApp.Biz.TransmitAlarm;
+
+public class AlarmServiceFactory
+{
+ public static IAlarmService CreateService(TransmitAlarmConfig config)
+ {
+ IAlarmService service = (config.Type) switch
+ {
+ "mqtt" => new AlarmMqttService(config.Mqtt),
+ _ => throw new NotSupportedException(),
+ }; ;
+ return service;
+ }
+}
\ No newline at end of file
diff --git a/JiLinApp.Biz/TransmitAlarm/Common/Config.cs b/JiLinApp.Biz/TransmitAlarm/Common/Config.cs
new file mode 100644
index 0000000..e426901
--- /dev/null
+++ b/JiLinApp.Biz/TransmitAlarm/Common/Config.cs
@@ -0,0 +1,28 @@
+namespace JiLinApp.Biz.TransmitAlarm;
+
+public class TransmitAlarmConfig
+{
+ public string Type { get; set; }
+
+ public MqttConfig Mqtt { get; set; }
+}
+
+public class MqttConfig
+{
+ public int Port { get; set; }
+
+ public string UserName { get; set; }
+
+ public string Password { get; set; }
+
+ public string ClientId { get; set; }
+
+ public string TransmitTopic { get; set; }
+}
+
+public class ZmqConfig
+{
+ public string AlarmPubAddr { get; set; }
+
+ public string AlarmPubTopic { get; set; }
+}
\ No newline at end of file
diff --git a/JiLinApp.Biz/Transmit/Entity/AlarmMessage.cs b/JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessage.cs
similarity index 96%
rename from JiLinApp.Biz/Transmit/Entity/AlarmMessage.cs
rename to JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessage.cs
index 86802f6..fa0eab5 100644
--- a/JiLinApp.Biz/Transmit/Entity/AlarmMessage.cs
+++ b/JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessage.cs
@@ -1,4 +1,4 @@
-namespace JiLinApp.Biz.Transmit;
+namespace JiLinApp.Biz.TransmitAlarm;
public class AlarmMessage
{
diff --git a/JiLinApp.Biz/Transmit/Entity/AlarmMessageHelper.cs b/JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessageHelper.cs
similarity index 96%
rename from JiLinApp.Biz/Transmit/Entity/AlarmMessageHelper.cs
rename to JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessageHelper.cs
index c05b7b2..e64829d 100644
--- a/JiLinApp.Biz/Transmit/Entity/AlarmMessageHelper.cs
+++ b/JiLinApp.Biz/TransmitAlarm/Entity/AlarmMessageHelper.cs
@@ -2,7 +2,7 @@
using JiLinApp.Docking.FenceAlarm;
using JiLinApp.Docking.VibrateAlarm;
-namespace JiLinApp.Biz.Transmit;
+namespace JiLinApp.Biz.TransmitAlarm;
public static class AlarmMessageHelper
{
diff --git a/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs b/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
new file mode 100644
index 0000000..d690dc0
--- /dev/null
+++ b/JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs
@@ -0,0 +1,111 @@
+using EC.Util.Common;
+using MQTTnet;
+using MQTTnet.Client;
+using MQTTnet.Protocol;
+using MQTTnet.Server;
+using System.Text;
+
+namespace JiLinApp.Biz.TransmitAlarm;
+
+public class AlarmMqttService : IAlarmService
+{
+ #region Fields
+
+ private MqttConfig Config { get; }
+
+ private MqttServer Server { get; }
+
+ private IMqttClient Client { get; }
+
+ #endregion Fields
+
+ public AlarmMqttService(MqttConfig config)
+ {
+ MqttFactory factory = new();
+ MqttServerOptions options = new MqttServerOptionsBuilder()
+ .WithDefaultEndpoint()
+ .WithDefaultEndpointPort(config.Port)
+ .Build();
+ MqttServer server = factory.CreateMqttServer(options);
+ server.ValidatingConnectionAsync += Server_ValidatingConnectionAsync;
+ server.ClientConnectedAsync += Server_ClientConnectedAsync;
+ server.ClientDisconnectedAsync += Server_ClientDisconnectedAsync;
+ server.ClientAcknowledgedPublishPacketAsync += Server_ClientAcknowledgedPublishPacketAsync;
+ IMqttClient client = factory.CreateMqttClient();
+
+ Config = config;
+ Server = server;
+ Client = client;
+ }
+
+ ~AlarmMqttService()
+ {
+ Close();
+ }
+
+ #region Base
+
+ public void Start()
+ {
+ Server.StartAsync().Wait();
+
+ MqttClientOptions mqttClientOptions = new MqttClientOptionsBuilder()
+ .WithTcpServer("127.0.0.1", Config.Port)
+ .WithClientId(Config.ClientId)
+ .WithCredentials(Config.UserName, Config.Password)
+ .Build();
+ Client.ConnectAsync(mqttClientOptions, CancellationToken.None);
+ }
+
+ public void Close()
+ {
+ Client.DisconnectAsync().Wait();
+ Server.StopAsync().Wait();
+ }
+
+ public void SendAlarmMessage(AlarmMessage msg)
+ {
+ MqttApplicationMessage mqttMsg = new MqttApplicationMessageBuilder()
+ .WithTopic(Config.TransmitTopic)
+ .WithPayload(JsonUtil.ToJson(msg))
+ .Build();
+ Client.PublishAsync(mqttMsg, CancellationToken.None).Wait();
+ }
+
+ #endregion Base
+
+ #region Server Event
+
+ private Task Server_ValidatingConnectionAsync(ValidatingConnectionEventArgs arg)
+ {
+ if (arg.ClientId.Length == 0) arg.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
+ else if (arg.UserName != Config.UserName) arg.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
+ else if (arg.Password != Config.Password) arg.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
+ return Task.CompletedTask;
+ }
+
+ private Task Server_ClientConnectedAsync(ClientConnectedEventArgs arg)
+ {
+ return Task.CompletedTask;
+ }
+
+ private Task Server_ClientDisconnectedAsync(ClientDisconnectedEventArgs arg)
+ {
+ return Task.CompletedTask;
+ }
+
+ private Task Server_ClientAcknowledgedPublishPacketAsync(ClientAcknowledgedPublishPacketEventArgs arg)
+ {
+ string clientId = arg.ClientId;
+ ushort packetIdentifier = arg.PublishPacket.PacketIdentifier;
+ string topic = arg.PublishPacket.Topic;
+ string msg = Encoding.UTF8.GetString(arg.PublishPacket.Payload);
+ return Task.CompletedTask;
+ }
+
+ #endregion Server Event
+
+ #region
+
+ #endregion
+}
\ No newline at end of file
diff --git a/JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs b/JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs
new file mode 100644
index 0000000..ad12ecf
--- /dev/null
+++ b/JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs
@@ -0,0 +1,19 @@
+namespace JiLinApp.Biz.TransmitAlarm;
+
+public class AlarmZmqService : IAlarmService
+{
+ public void Start()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Close()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void SendAlarmMessage(AlarmMessage msg)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs b/JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs
new file mode 100644
index 0000000..baff02d
--- /dev/null
+++ b/JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs
@@ -0,0 +1,10 @@
+namespace JiLinApp.Biz.TransmitAlarm;
+
+public interface IAlarmService
+{
+ void Start();
+
+ void Close();
+
+ void SendAlarmMessage(AlarmMessage msg);
+}
\ No newline at end of file
diff --git a/JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs b/JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs
index fdc1cde..5d6da5c 100644
--- a/JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs
+++ b/JiLinApp.Docking/FenceAlarm/Service/UdpManager.cs
@@ -1,5 +1,4 @@
-using System.Data;
-using System.Timers;
+using System.Timers;
using Timer = System.Timers.Timer;
namespace JiLinApp.Docking.FenceAlarm;
@@ -16,7 +15,7 @@ public class UdpManager
private List deviceList = new();
- #endregion fields
+ #endregion Fields
public UdpManager()
{
diff --git a/JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs b/JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs
index 3a82d9e..ddd59ea 100644
--- a/JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs
+++ b/JiLinApp.Docking/VibrateAlarm/Service/TcpManager.cs
@@ -21,7 +21,7 @@ public class TcpManager
private List list { get; } = new();
- #endregion fields
+ #endregion Fields
public TcpManager()
{
diff --git a/JiLinApp.sln b/JiLinApp.sln
index 3105430..11d07ac 100644
--- a/JiLinApp.sln
+++ b/JiLinApp.sln
@@ -7,9 +7,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JiLinApp", "JiLinApp\JiLinA
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EC.Util", "EC.Util\EC.Util.csproj", "{A41E47C9-1930-4FF0-955E-B91EC859D262}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiLinApp.Docking", "JiLinApp.Docking\JiLinApp.Docking.csproj", "{B664DFEE-E137-44AC-A766-95D384E3F70B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JiLinApp.Docking", "JiLinApp.Docking\JiLinApp.Docking.csproj", "{B664DFEE-E137-44AC-A766-95D384E3F70B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JiLinApp.Biz", "JiLinApp.Biz\JiLinApp.Biz.csproj", "{7CE63A50-C92C-4554-8E0C-F7BED355C1FD}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JiLinApp.Biz", "JiLinApp.Biz\JiLinApp.Biz.csproj", "{7CE63A50-C92C-4554-8E0C-F7BED355C1FD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{97F952A2-D735-42D6-A21B-DCEA87C2D6C9}"
+ ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
+ EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/JiLinApp/Core/Config.cs b/JiLinApp/Core/Config.cs
index 93afd68..94a2e17 100644
--- a/JiLinApp/Core/Config.cs
+++ b/JiLinApp/Core/Config.cs
@@ -1,4 +1,5 @@
using EC.Util.CameraSDK;
+using JiLinApp.Biz.TransmitAlarm;
using System.Collections.Generic;
namespace JiLinApp.Core;
@@ -7,20 +8,12 @@ public class AppConfig
{
public BaseConfig Base { get; set; }
+ public TransmitAlarmConfig TransmitAlarm { get; set; }
+
public List CameraList { get; set; }
}
public class BaseConfig
{
public bool Console { get; set; }
-}
-
-public class MqttConfig
-{
-}
-
-public class ZmqConfig
-{
- public string AlarmPubAddr { get; set; }
- public string AlarmPubTopic { get; set; }
}
\ No newline at end of file
diff --git a/JiLinApp/Core/Global.cs b/JiLinApp/Core/Global.cs
index b267b64..330eaff 100644
--- a/JiLinApp/Core/Global.cs
+++ b/JiLinApp/Core/Global.cs
@@ -1,4 +1,5 @@
using EC.Util.Common;
+using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Docking.Alarm;
using NewLife.Configuration;
using System;
@@ -11,8 +12,11 @@ public static class Global
#region Fields
private static JsonConfigProvider ConfigProvider { get; }
+
public static AppConfig AppConfig { get; }
+ public static IAlarmService AlarmService { get; }
+
#endregion Fields
static Global()
@@ -26,6 +30,9 @@ public static class Global
// 控制台
if (AppConfig.Base.Console) SystemUtil.AllocConsole();
+
+ AlarmService = AlarmServiceFactory.CreateService(AppConfig.TransmitAlarm);
+ AlarmService?.Start();
}
catch (Exception)
{
diff --git a/JiLinApp/JiLinApp.csproj b/JiLinApp/JiLinApp.csproj
index b9b3f6a..7e150c4 100644
--- a/JiLinApp/JiLinApp.csproj
+++ b/JiLinApp/JiLinApp.csproj
@@ -6,6 +6,12 @@
true
+
+ 6
+
+
+ 6
+
diff --git a/JiLinApp/Pages/FenceServerManage/MainViewModel.cs b/JiLinApp/Pages/FenceServerManage/MainViewModel.cs
index afb361e..6837a79 100644
--- a/JiLinApp/Pages/FenceServerManage/MainViewModel.cs
+++ b/JiLinApp/Pages/FenceServerManage/MainViewModel.cs
@@ -12,7 +12,7 @@ public class MainViewModel : ViewModelBase
private Main View { get; set; }
- #endregion fields
+ #endregion Fields
public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea)
{
diff --git a/JiLinApp/Pages/PtzManage/MainViewModel.cs b/JiLinApp/Pages/PtzManage/MainViewModel.cs
index 115bf49..a10c5b2 100644
--- a/JiLinApp/Pages/PtzManage/MainViewModel.cs
+++ b/JiLinApp/Pages/PtzManage/MainViewModel.cs
@@ -1,4 +1,4 @@
-using JiLinApp.Biz.Transmit;
+using JiLinApp.Biz.TransmitAlarm;
using JiLinApp.Core;
using JiLinApp.Docking.FenceAlarm;
using JiLinApp.Docking.VibrateAlarm;
@@ -15,7 +15,9 @@ public class MainViewModel : ViewModelBase
private Main View { get; set; }
- private AppConfig AppConfig { get; set; }
+ private AppConfig AppConfig { get; }
+
+ private IAlarmService AlarmService { get; }
#endregion Fields
@@ -23,6 +25,7 @@ public class MainViewModel : ViewModelBase
{
// Bind global fields
AppConfig = Global.AppConfig;
+ AlarmService = Global.AlarmService;
// Bind invoke event
ea.GetEvent().Subscribe(ShakeTcpAlarmReact);
@@ -38,13 +41,13 @@ public class MainViewModel : ViewModelBase
internal void ShakeTcpAlarmReact(TcpAlarmHostMessage msg)
{
- SendAlarm(msg.ToAlarmMessage());
+ AlarmService.SendAlarmMessage(msg.ToAlarmMessage());
View.GotoPreset();
}
internal void FenceUdpAlarmReact(UdpAlarmHostMessage msg)
{
- SendAlarm(msg.ToAlarmMessage());
+ AlarmService.SendAlarmMessage(msg.ToAlarmMessage());
View.GotoPreset();
}
diff --git a/JiLinApp/Pages/VibrateServerManage/MainViewModel.cs b/JiLinApp/Pages/VibrateServerManage/MainViewModel.cs
index 4b9c296..3d3ea4b 100644
--- a/JiLinApp/Pages/VibrateServerManage/MainViewModel.cs
+++ b/JiLinApp/Pages/VibrateServerManage/MainViewModel.cs
@@ -12,7 +12,7 @@ public class MainViewModel : ViewModelBase
private Main View { get; set; }
- #endregion fields
+ #endregion Fields
public MainViewModel(IRegionManager region, IEventAggregator ea) : base(region, ea)
{
diff --git a/JiLinApp/config/config.json b/JiLinApp/config/config.json
index a542713..9a092a2 100644
--- a/JiLinApp/config/config.json
+++ b/JiLinApp/config/config.json
@@ -2,6 +2,16 @@
"base": {
"console": false
},
+ "transmitAlarm": {
+ "type": "mqtt",
+ "mqtt": {
+ "port": "1883",
+ "username": "admin",
+ "password": "public",
+ "clientId": "alarmClient",
+ "transmitTopic": "alarm/transmit"
+ }
+ },
"cameraList": [
{
"ip": "192.168.1.65",