From fcdf4fd96482175a6a9db4a13d05daac7dacfda0 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Sun, 1 Apr 2018 14:18:59 +0000 Subject: [PATCH] =?UTF-8?q?[NF]=20Filter=20nun=20auch=20f=C3=BCr=20FMS=20u?= =?UTF-8?q?nd=20ZVEI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BosmonMqtt/MqttEventProcessor.cs | 58 ++++++++++++++++++++++---- BosmonMqtt/MqttPlugin.cs | 2 +- BosmonMqtt/Properties/AssemblyInfo.cs | 4 +- BosmonMqtt/bin/Release/BosmonMqtt.dll | Bin 24064 -> 25088 bytes BosmonMqtt/bin/Release/M2Mqtt.dll | Bin 38912 -> 38912 bytes 5 files changed, 53 insertions(+), 11 deletions(-) diff --git a/BosmonMqtt/MqttEventProcessor.cs b/BosmonMqtt/MqttEventProcessor.cs index 866de84..552e68b 100644 --- a/BosmonMqtt/MqttEventProcessor.cs +++ b/BosmonMqtt/MqttEventProcessor.cs @@ -17,7 +17,9 @@ namespace BlubbFish.BosmonMqtt { private IBosMonHost pluginhost; private MqttClient client; private FilterList filter; - private List pfilter = new List(); + private List pfilter = new List(); + private List ffilter = new List(); + private List zfilter = new List(); Thread connectionWatcher; public MqttEventProcessor(PluginConfiguration pluginconfiguration, IBosMonHost pluginHost) { @@ -102,6 +104,12 @@ namespace BlubbFish.BosmonMqtt { if (item.GetType() == typeof(PocsagFilterItem)) { this.pfilter.Add(item as PocsagFilterItem); } + if (item.GetType() == typeof(FmsFilterItem)) { + this.ffilter.Add(item as FmsFilterItem); + } + if (item.GetType() == typeof(ZveiFilterItem)) { + this.zfilter.Add(item as ZveiFilterItem); + } } this.Log("Connect", "Erfolgreich verbunden."); } @@ -109,6 +117,8 @@ namespace BlubbFish.BosmonMqtt { private void Disconnect() { this.pfilter.Clear(); + this.ffilter.Clear(); + this.zfilter.Clear(); if (this.client != null && this.client.IsConnected) { this.client.Unsubscribe(new String[] { this.pluginconfig.Topic }); this.client.Disconnect(); @@ -122,20 +132,52 @@ namespace BlubbFish.BosmonMqtt { try { Telegram t = e.Telegram as Telegram; if (this.client != null && this.client.IsConnected && this.filter != null) { - if (t.Type == PocsagTelegram.TYPE_POCSAG) { - PocsagTelegram p = t as PocsagTelegram; - foreach (PocsagFilterItem item in this.pfilter) { - if ((item.IsMatching(p) && item.Negated)) { - return; - } + if (this.FilterMatch(t)) { + if (t.Type == PocsagTelegram.TYPE_POCSAG) { + PocsagTelegram p = t as PocsagTelegram; + this.client.Publish(this.pluginconfig.Topic + "pocsag/" + p.Address + p.Func, Encoding.UTF8.GetBytes(p.Msg)); + } else if(t.Type == FmsTelegram.TYPE_FMS) { + FmsTelegram f = t as FmsTelegram; + this.client.Publish(this.pluginconfig.Topic + "fms/" + f.Address, Encoding.UTF8.GetBytes(f.Bos + "\t" + f.Fzg + "\t" + f.Info + "\t" + f.Lkz + "\t" + f.Msg + "\t" + f.Okz + "\t" + f.Status)); + } else if(t.Type == ZveiTelegram.TYPE_ZVEI) { + ZveiTelegram z = t as ZveiTelegram; + this.client.Publish(this.pluginconfig.Topic + "zvei/" + z.Address, Encoding.UTF8.GetBytes("")); + } else if (t.Type == ZveiDtmfTelegram.TYPE_ZVEIDTMF) { + ZveiDtmfTelegram z = t as ZveiDtmfTelegram; + this.client.Publish(this.pluginconfig.Topic + "zveidmf/" + z.Address, Encoding.UTF8.GetBytes(z.DtmfTone)); } - this.client.Publish(this.pluginconfig.Topic + p.Address + p.Func, Encoding.UTF8.GetBytes(p.Msg)); } } } catch (Exception) { } } } + private Boolean FilterMatch(Telegram t) { + if (t.Type == PocsagTelegram.TYPE_POCSAG) { + return this.FilterMatchType(this.pfilter, t); + } else if(t.Type == FmsTelegram.TYPE_FMS) { + return this.FilterMatchType(this.ffilter, t); + } else { + return this.FilterMatchType(this.zfilter, t); + } + } + + private Boolean FilterMatchType(List filter, Telegram t) { + Boolean negatedInList = false; + foreach (FilterItem item in filter) { + if (item.IsMatching(t) && item.Negated) { + return false; + } + if(item.IsMatching(t) && !item.Negated) { + return true; + } + if(item.Negated) { + negatedInList = true; + } + } + return negatedInList; + } + private void Log(String method, String text) { BosMonLog.Logger.WriteLine(LogSeverity.Info, "BosmonMqtt.MqttEventProcessor", method, text); this.pluginhost.AddMessage(DateTime.Now.Ticks, MessageType.Message, "BosmonMqtt " + text); diff --git a/BosmonMqtt/MqttPlugin.cs b/BosmonMqtt/MqttPlugin.cs index 0910c3a..ba51bea 100644 --- a/BosmonMqtt/MqttPlugin.cs +++ b/BosmonMqtt/MqttPlugin.cs @@ -21,7 +21,7 @@ namespace BlubbFish.BosmonMqtt { Int32 IBosMonPlugin.PluginVersion { get { - return 1; + return 2; } } diff --git a/BosmonMqtt/Properties/AssemblyInfo.cs b/BosmonMqtt/Properties/AssemblyInfo.cs index f551efa..32b8096 100644 --- a/BosmonMqtt/Properties/AssemblyInfo.cs +++ b/BosmonMqtt/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // indem Sie "*" wie unten gezeigt eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.2.0.0")] +[assembly: AssemblyFileVersion("1.2.0.0")] [assembly: NeutralResourcesLanguage("de")] diff --git a/BosmonMqtt/bin/Release/BosmonMqtt.dll b/BosmonMqtt/bin/Release/BosmonMqtt.dll index 9a6500b0b1e7190f23259fe160275b3ff8f0266c..a8fb70168501569195a6d755639c511ea8dabbe4 100644 GIT binary patch literal 25088 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 delta 87 zcmZqJz|^pTX+j56`jL%YhuQ@mzgs$eO87yyeSW#-4yQFgZjR}g!LE~j=OKS%7;bPN$Re%UVl6J$6Ty=v%-W2>;N*!BIp1B