From 06ab6a94b6269dc7f21a26a3984ce4e946a97eb0 Mon Sep 17 00:00:00 2001 From: fajiao <1519100073@qq.com> Date: Sat, 8 Apr 2023 15:26:17 +0800 Subject: [PATCH] [feat] transmit alarm by mqtt serivce --- JiLinApp.Biz/JiLinApp.Biz.csproj | 4 + .../Transmit/Service/AlarmMqttService.cs | 5 - .../Transmit/Service/AlarmZmqService.cs | 5 - .../Service/Interfaces/IAlarmService.cs | 5 - .../Common/AlarmServiceFactory.cs | 14 +++ JiLinApp.Biz/TransmitAlarm/Common/Config.cs | 28 +++++ .../Entity/AlarmMessage.cs | 2 +- .../Entity/AlarmMessageHelper.cs | 2 +- .../TransmitAlarm/Service/AlarmMqttService.cs | 111 ++++++++++++++++++ .../TransmitAlarm/Service/AlarmZmqService.cs | 19 +++ .../Service/Interfaces/IAlarmService.cs | 10 ++ .../FenceAlarm/Service/UdpManager.cs | 5 +- .../VibrateAlarm/Service/TcpManager.cs | 2 +- JiLinApp.sln | 9 +- JiLinApp/Core/Config.cs | 13 +- JiLinApp/Core/Global.cs | 7 ++ JiLinApp/JiLinApp.csproj | 6 + .../Pages/FenceServerManage/MainViewModel.cs | 2 +- JiLinApp/Pages/PtzManage/MainViewModel.cs | 11 +- .../VibrateServerManage/MainViewModel.cs | 2 +- JiLinApp/config/config.json | 10 ++ 21 files changed, 233 insertions(+), 39 deletions(-) delete mode 100644 JiLinApp.Biz/Transmit/Service/AlarmMqttService.cs delete mode 100644 JiLinApp.Biz/Transmit/Service/AlarmZmqService.cs delete mode 100644 JiLinApp.Biz/Transmit/Service/Interfaces/IAlarmService.cs create mode 100644 JiLinApp.Biz/TransmitAlarm/Common/AlarmServiceFactory.cs create mode 100644 JiLinApp.Biz/TransmitAlarm/Common/Config.cs rename JiLinApp.Biz/{Transmit => TransmitAlarm}/Entity/AlarmMessage.cs (96%) rename JiLinApp.Biz/{Transmit => TransmitAlarm}/Entity/AlarmMessageHelper.cs (96%) create mode 100644 JiLinApp.Biz/TransmitAlarm/Service/AlarmMqttService.cs create mode 100644 JiLinApp.Biz/TransmitAlarm/Service/AlarmZmqService.cs create mode 100644 JiLinApp.Biz/TransmitAlarm/Service/Interfaces/IAlarmService.cs 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",