[1.2.0] Refactor Bot to ABot and refere MultiSourceBot, Webserver and Bot to it. Add MultiSourceBot. Rewrite Mqtt module so that it not need to watch the connection.
This commit is contained in:
parent
cf3413a3d7
commit
8932867ed9
48
Bot-Utils/ABot.cs
Normal file
48
Bot-Utils/ABot.cs
Normal file
@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Bots {
|
||||
public abstract class ABot {
|
||||
private Thread sig_thread;
|
||||
private Boolean RunningProcess = true;
|
||||
|
||||
protected ProgramLogger logger = new ProgramLogger();
|
||||
|
||||
private void SetupShutdown(Object sender, ConsoleCancelEventArgs e) {
|
||||
e.Cancel = true;
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.SetupShutdown: Signalhandler Windows INT recieved.");
|
||||
this.RunningProcess = false;
|
||||
}
|
||||
|
||||
protected void WaitForShutdown() {
|
||||
if(Type.GetType("Mono.Runtime") != null) {
|
||||
this.sig_thread = new Thread(delegate () {
|
||||
Mono.Unix.UnixSignal[] signals = new Mono.Unix.UnixSignal[] {
|
||||
new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM),
|
||||
new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT)
|
||||
};
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono attached.");
|
||||
while(true) {
|
||||
Int32 i = Mono.Unix.UnixSignal.WaitAny(signals, -1);
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono INT recieved " + i + ".");
|
||||
this.RunningProcess = false;
|
||||
break;
|
||||
}
|
||||
});
|
||||
this.sig_thread.Start();
|
||||
} else {
|
||||
Console.CancelKeyPress += new ConsoleCancelEventHandler(this.SetupShutdown);
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Windows attached.");
|
||||
}
|
||||
while(this.RunningProcess) {
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Dispose() {
|
||||
if(this.sig_thread != null && this.sig_thread.IsAlive) {
|
||||
this.sig_thread.Abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -46,6 +46,7 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ABot.cs" />
|
||||
<Compile Include="Bot.cs" />
|
||||
<Compile Include="Events\CronEvent.cs" />
|
||||
<Compile Include="Events\ModulEventArgs.cs" />
|
||||
@ -59,6 +60,7 @@
|
||||
<Compile Include="Moduls\Mqtt.cs" />
|
||||
<Compile Include="Moduls\Overtaker.cs" />
|
||||
<Compile Include="Moduls\Statuspolling.cs" />
|
||||
<Compile Include="MultiSourceBot.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Webserver.cs" />
|
||||
</ItemGroup>
|
||||
|
@ -1,57 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using BlubbFish.Utils.IoT.Bots.Moduls;
|
||||
using BlubbFish.Utils.IoT.Bots.Events;
|
||||
using BlubbFish.Utils.IoT.Bots.Interfaces;
|
||||
using BlubbFish.Utils.IoT.Bots.Moduls;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Bots {
|
||||
public abstract class Bot<T> {
|
||||
private Thread sig_thread;
|
||||
private Boolean RunningProcess = true;
|
||||
protected ProgramLogger logger = new ProgramLogger();
|
||||
public abstract class Bot<T> : ABot {
|
||||
protected readonly Dictionary<String, AModul<T>> moduls = new Dictionary<String, AModul<T>>();
|
||||
|
||||
protected void WaitForShutdown() {
|
||||
if (Type.GetType("Mono.Runtime") != null) {
|
||||
this.sig_thread = new Thread(delegate () {
|
||||
Mono.Unix.UnixSignal[] signals = new Mono.Unix.UnixSignal[] {
|
||||
new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM),
|
||||
new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT)
|
||||
};
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono attached.");
|
||||
while (true) {
|
||||
Int32 i = Mono.Unix.UnixSignal.WaitAny(signals, -1);
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono INT recieved " + i + ".");
|
||||
this.RunningProcess = false;
|
||||
break;
|
||||
}
|
||||
});
|
||||
this.sig_thread.Start();
|
||||
} else {
|
||||
Console.CancelKeyPress += new ConsoleCancelEventHandler(this.SetupShutdown);
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Windows attached.");
|
||||
}
|
||||
while (this.RunningProcess) {
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupShutdown(Object sender, ConsoleCancelEventArgs e) {
|
||||
e.Cancel = true;
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.SetupShutdown: Signalhandler Windows INT recieved.");
|
||||
this.RunningProcess = false;
|
||||
}
|
||||
|
||||
protected void ModulDispose() {
|
||||
foreach (KeyValuePair<String, AModul<T>> item in this.moduls) {
|
||||
item.Value.Dispose();
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulDispose: Modul entladen: " + item.Key);
|
||||
}
|
||||
if (this.sig_thread != null && this.sig_thread.IsAlive) {
|
||||
this.sig_thread.Abort();
|
||||
}
|
||||
this.Dispose();
|
||||
}
|
||||
|
||||
protected void ModulLoader(String @namespace, Object library) {
|
||||
@ -92,8 +55,6 @@ namespace BlubbFish.Utils.IoT.Bots {
|
||||
}
|
||||
}
|
||||
|
||||
protected void ModulUpdate(Object sender, ModulEventArgs e) {
|
||||
Console.WriteLine(e.ToString());
|
||||
}
|
||||
protected void ModulUpdate(Object sender, ModulEventArgs e) => Console.WriteLine(e.ToString());
|
||||
}
|
||||
}
|
||||
|
@ -54,9 +54,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls {
|
||||
|
||||
protected abstract void LibUpadteThread(Object state);
|
||||
|
||||
protected void HandleLibUpdate(Object sender, EventArgs e) {
|
||||
ThreadPool.QueueUserWorkItem(this.LibUpadteThread, e);
|
||||
}
|
||||
protected void HandleLibUpdate(Object sender, EventArgs e) => ThreadPool.QueueUserWorkItem(this.LibUpadteThread, e);
|
||||
|
||||
public abstract void Dispose();
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using BlubbFish.Utils.IoT.Bots.Events;
|
||||
using BlubbFish.Utils.IoT.Connector;
|
||||
using BlubbFish.Utils.IoT.Events;
|
||||
@ -9,52 +8,38 @@ using LitJson;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Bots.Moduls {
|
||||
public abstract class Mqtt<T> : AModul<T>, IDisposable {
|
||||
protected readonly Thread connectionWatcher;
|
||||
protected ABackend mqtt;
|
||||
protected Dictionary<String, AModul<T>> modules;
|
||||
|
||||
#region Constructor
|
||||
public Mqtt(T lib, InIReader settings) : base(lib, settings) {
|
||||
if (this.config.ContainsKey("settings")) {
|
||||
this.connectionWatcher = new Thread(this.ConnectionWatcherRunner);
|
||||
this.connectionWatcher.Start();
|
||||
} else {
|
||||
throw new ArgumentException("Setting section [settings] is missing!");
|
||||
}
|
||||
}
|
||||
public Mqtt(T lib, InIReader settings) : base(lib, settings) => this.Connect();
|
||||
#endregion
|
||||
|
||||
#region Watcher
|
||||
protected void ConnectionWatcherRunner() {
|
||||
while (true) {
|
||||
try {
|
||||
if (this.mqtt == null || !this.mqtt.IsConnected) {
|
||||
this.Reconnect();
|
||||
}
|
||||
Thread.Sleep(10000);
|
||||
} catch (Exception) { }
|
||||
}
|
||||
}
|
||||
|
||||
#region Connection
|
||||
protected void Reconnect() {
|
||||
Console.WriteLine("BlubbFish.Utils.IoT.Bots.Moduls.Mqtt.Reconnect()");
|
||||
if(!this.config.ContainsKey("settings")) {
|
||||
throw new ArgumentException("Setting section [settings] is missing!");
|
||||
} else {
|
||||
this.Disconnect();
|
||||
this.Connect();
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void Connect();
|
||||
protected void Connect() {
|
||||
if(!this.config.ContainsKey("settings")) {
|
||||
throw new ArgumentException("Setting section [settings] is missing!");
|
||||
} else {
|
||||
this.mqtt = ABackend.GetInstance(this.config["settings"], ABackend.BackendType.Data);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void Disconnect();
|
||||
protected void Disconnect() => this.mqtt.Dispose();
|
||||
#endregion
|
||||
|
||||
#region AModul
|
||||
public override void Interconnect(Dictionary<String, AModul<T>> moduls) {
|
||||
this.modules = moduls;
|
||||
}
|
||||
public override void Interconnect(Dictionary<String, AModul<T>> moduls) => this.modules = moduls;
|
||||
|
||||
protected override void UpdateConfig() {
|
||||
this.Reconnect();
|
||||
}
|
||||
protected override void UpdateConfig() => this.Reconnect();
|
||||
#endregion
|
||||
|
||||
protected Tuple<Boolean, MqttEvent> ChangeConfig(BackendEvent e, String topic) {
|
||||
@ -90,7 +75,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls {
|
||||
}
|
||||
modul.SetConfig(newconf);
|
||||
return new Tuple<Boolean, MqttEvent>(true, new MqttEvent("New Config", "Write"));
|
||||
} catch (Exception) { }
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
return new Tuple<Boolean, MqttEvent>(false, null);
|
||||
@ -102,8 +87,6 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls {
|
||||
protected void Dispose(Boolean disposing) {
|
||||
if (!this.disposedValue) {
|
||||
if (disposing) {
|
||||
this.connectionWatcher.Abort();
|
||||
while (this.connectionWatcher.ThreadState == ThreadState.Running) { Thread.Sleep(10); }
|
||||
this.Disconnect();
|
||||
}
|
||||
this.disposedValue = true;
|
||||
@ -111,7 +94,7 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls {
|
||||
}
|
||||
|
||||
public override void Dispose() {
|
||||
Dispose(true);
|
||||
this.Dispose(true);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
#endregion
|
||||
|
18
Bot-Utils/MultiSourceBot.cs
Normal file
18
Bot-Utils/MultiSourceBot.cs
Normal file
@ -0,0 +1,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using BlubbFish.Utils.IoT.Connector;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Bots {
|
||||
public abstract class MultiSourceBot : ABot {
|
||||
protected Dictionary<String, ABackend> sources;
|
||||
protected Dictionary<String, String> settings;
|
||||
|
||||
protected MultiSourceBot(Dictionary<String, ABackend> sources, Dictionary<String, String> settings) {
|
||||
this.sources = sources;
|
||||
this.settings = settings;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||
@ -9,9 +10,10 @@ using System.Runtime.InteropServices;
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("BlubbFish")]
|
||||
[assembly: AssemblyProduct("Bot-Utils")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2018 - 21.04.2019")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2018 - 27.05.2019")]
|
||||
[assembly: AssemblyTrademark("© BlubbFish")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: NeutralResourcesLanguage("de-DE")]
|
||||
|
||||
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
|
||||
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
|
||||
@ -31,8 +33,8 @@ 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.1.9")]
|
||||
[assembly: AssemblyFileVersion("1.1.9")]
|
||||
[assembly: AssemblyVersion("1.2.0")]
|
||||
[assembly: AssemblyFileVersion("1.2.0")]
|
||||
|
||||
/*
|
||||
* 1.1.0 Remove Helper from Bot-Utils
|
||||
@ -46,4 +48,5 @@ using System.Runtime.InteropServices;
|
||||
* 1.1.7 Restrucutre loading, so that all is init and after the listener is started, REQUEST_URL_HOST gives now host and port
|
||||
* 1.1.8 Add logger to Webserver Class
|
||||
* 1.1.9 Modify Output of SendFileResponse
|
||||
* 1.2.0 Refactor Bot to ABot and refere MultiSourceBot, Webserver and Bot to it. Add MultiSourceBot. Rewrite Mqtt module so that it not need to watch the connection.
|
||||
*/
|
||||
|
@ -10,13 +10,12 @@ using BlubbFish.Utils.IoT.Events;
|
||||
using LitJson;
|
||||
|
||||
namespace BlubbFish.Utils.IoT.Bots {
|
||||
public abstract class Webserver
|
||||
public abstract class Webserver : ABot
|
||||
{
|
||||
protected Dictionary<String, String> config;
|
||||
protected static InIReader requests;
|
||||
protected HttpListener httplistener;
|
||||
protected ABackend databackend;
|
||||
protected ProgramLogger logger = new ProgramLogger();
|
||||
|
||||
public Webserver(ABackend backend, Dictionary<String, String> settings, InIReader requestslookup) {
|
||||
this.config = settings;
|
||||
@ -142,9 +141,10 @@ namespace BlubbFish.Utils.IoT.Bots {
|
||||
return new Dictionary<String, String>();
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
public override void Dispose() {
|
||||
this.httplistener.Stop();
|
||||
this.httplistener.Close();
|
||||
base.Dispose();
|
||||
}
|
||||
|
||||
protected abstract void Backend_MessageIncomming(Object sender, BackendEvent e);
|
||||
|
Loading…
Reference in New Issue
Block a user