11 Commits
Author SHA1 Message Date
BlubbFish 8348185272 move to .net 10 2026-08-04 12:28:22 +02:00
BlubbFish a5894ceeb7 make gps events 2026-08-04 12:28:03 +02:00
BlubbFish 759842b528 add new backend types 2026-08-04 12:26:47 +02:00
BlubbFish 2e6f2f464b [1.3.0] Netcore default 2022-01-15 21:52:41 +01:00
BlubbFish a2e5ca6c7e Fix readme 2021-08-22 13:20:28 +02:00
BlubbFish 870d8d065b add mirror to github.com 2021-08-21 23:40:06 +02:00
BlubbFish 73674548e3 Make netcore as default, also using 3.1 now - BlubbFish 2021-01-08 23:57:55 +01:00
BlubbFish 6a20324c6d add file Changelog.md 2019-12-01 17:55:59 +01:00
BlubbFish 7ee7060c7c catch exceptions 2019-11-29 14:46:10 +01:00
BlubbFish cc00efe5ea Add netcore 2019-11-24 20:46:32 +01:00
BlubbFish 0877e6ffbb Refactoring 2019-11-24 20:12:35 +01:00
23 changed files with 561 additions and 328 deletions
+33
View File
@@ -0,0 +1,33 @@
# Changelog
## 1.3.0 - 2022-01-15 - Netcore default
### New Features
* Netcore is now default
* ABackend thows exeption if loading failed
### Bugfixes
### Changes
* Make ref for github in readme
* Refactoring
* Codingstyles
## 1.2.0 - 2019-12.01 - Refactoring
### New Features
* Add netcore
* ABackend now return null if type is not loadable
### Bugfixes
### Changes
* Refactoring
## 1.1.0 - 2019-05-29 - Readme
### New Features
* Add Readme, Contribution and Licence
### Bugfixes
### Changes
* Coding Styles
## 1.0.0.0 - 2019-02-14 - Init
### New Features
* First Version
### Bugfixes
### Changes
+11 -6
View File
@@ -1,6 +1,11 @@
# BlubbFish.Utils.IoT (Utils-IoT) # BlubbFish.Utils.IoT (Utils-IoT)
Library contains utils for Iot Library contains utils for Iot
## Linking to Maybe you find this Repo on Github. This is a mirror from [here](https://git.blubbfish.net/vs_utils/Utils-IoT).
### External
* litjson ## Linking to
### Internal
* BlubbFish.Utils ([Utils](http://git.blubbfish.net/vs_utils/Utils))
### External
* litjson ([Used Fork](https://github.com/blubbfish/litjson), [Original](https://github.com/LitJSON/litjson))
+37
View File
@@ -0,0 +1,37 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29519.87
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "Utils-IoT\Utils-IoT-4.7.1.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "litjson_4.7.1", "..\..\Librarys\litjson\litjson\litjson_4.7.1.csproj", "{91A14CD2-2940-4500-8193-56D37EDDDBAA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-4.7.1", "..\Utils\Utils\Utils-4.7.1.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.Build.0 = Release|Any CPU
{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {844D8F60-6DE1-4C48-976D-F71450E9707B}
EndGlobalSection
EndGlobal
+19 -13
View File
@@ -1,11 +1,13 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio Version 16
VisualStudioVersion = 15.0.27004.2010 VisualStudioVersion = 16.0.29519.87
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "Utils-IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Utils-IoT", "Utils-IoT\Utils-IoT.csproj", "{549D532E-F859-4128-BA8E-9658E7349F64}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "litjson_4.7.1", "..\..\Librarys\litjson\litjson\litjson_4.7.1.csproj", "{91A14CD2-2940-4500-8193-56D37EDDDBAA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Utils", "..\Utils\Utils\Utils.csproj", "{5A666820-02FF-4649-95F7-476CE95E0E29}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "litjson", "..\..\Librarys\litjson\litjson\litjson.csproj", "{822DFFA0-7838-4590-8160-63EC92AE15B5}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,19 +15,23 @@ Global
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {549D532E-F859-4128-BA8E-9658E7349F64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU {549D532E-F859-4128-BA8E-9658E7349F64}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU {549D532E-F859-4128-BA8E-9658E7349F64}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}.Release|Any CPU.Build.0 = Release|Any CPU {549D532E-F859-4128-BA8E-9658E7349F64}.Release|Any CPU.Build.0 = Release|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A666820-02FF-4649-95F7-476CE95E0E29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Debug|Any CPU.Build.0 = Debug|Any CPU {5A666820-02FF-4649-95F7-476CE95E0E29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A666820-02FF-4649-95F7-476CE95E0E29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91A14CD2-2940-4500-8193-56D37EDDDBAA}.Release|Any CPU.Build.0 = Release|Any CPU {5A666820-02FF-4649-95F7-476CE95E0E29}.Release|Any CPU.Build.0 = Release|Any CPU
{822DFFA0-7838-4590-8160-63EC92AE15B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{822DFFA0-7838-4590-8160-63EC92AE15B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{822DFFA0-7838-4590-8160-63EC92AE15B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{822DFFA0-7838-4590-8160-63EC92AE15B5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {844D8F60-6DE1-4C48-976D-F71450E9707B} SolutionGuid = {28A0A2C2-A747-4FB6-80F6-50CA564403B8}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal
+72 -45
View File
@@ -1,45 +1,72 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using BlubbFish.Utils.IoT.Events; using System.Linq;
namespace BlubbFish.Utils.IoT.Connector { using BlubbFish.Utils.IoT.Events;
public abstract class ABackend {
public enum BackendType { namespace BlubbFish.Utils.IoT.Connector {
Data, public abstract class ABackend {
User public enum BackendType {
} Data,
public event BackendMessage MessageIncomming; Db,
public event BackendMessage MessageSending; Storage,
public delegate void BackendMessage(Object sender, BackendEvent e); User
}
protected Dictionary<String, String> settings; public event BackendMessage MessageIncomming;
public event BackendMessage MessageSending;
public abstract Boolean IsConnected { get; } public delegate void BackendMessage(Object sender, BackendEvent e);
public ABackend(Dictionary<String, String> settings) => this.settings = settings; protected Dictionary<String, String> settings;
public static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) { public abstract Boolean IsConnected { get; }
if (settings.Count == 0) {
return null; public ABackend(Dictionary<String, String> settings) => this.settings = settings;
}
String object_sensor = "BlubbFish.Utils.IoT.Connector." + ty.ToString() + "." + settings["type"].ToUpperLower() + ", " + "Connector" + ty.ToString() + settings["type"].ToUpperLower();
Type t = null; public static ABackend GetInstance(Dictionary<String, String> settings) {
try { if(settings.Count == 0) {
t = Type.GetType(object_sensor, true); return null;
} catch (TypeLoadException) { }
Console.Error.WriteLine("Configuration: " + settings["type"] + " is not a " + ty.ToString() + "Backend"); try {
return null; return GetInstance(settings, (BackendType)Enum.Parse(typeof(BackendType), settings["backendtype"]));
} catch (System.IO.FileNotFoundException) { } catch(Exception e) {
Console.Error.WriteLine("Driver " + object_sensor + " could not load!"); throw new Exception("Something bad Happend while Loading Connector without type: " + e.Message);
return null; }
} }
return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings });
} public static ABackend GetStorageInstance(Dictionary<String, String> settings, List<Type> types) {
if(settings.Count == 0 || types.Count != 1) {
protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value); return null;
}
protected void NotifyClientSending(BackendEvent value) => this.MessageSending?.Invoke(this, value); String object_sensor = "BlubbFish.Utils.IoT.Connector.Storage." + settings["type"].ToUpperLower() + "`"+types.Count+"["+ String.Join(",", new List<String>(types.Select(x => "["+x.FullName + "," + x.Assembly.FullName+"]"))) + "], " + "ConnectorStorage" + settings["type"].ToUpperLower();
return LoadInstance(object_sensor, settings, "Storage");
public abstract void Dispose(); }
}
} public static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) {
if (settings.Count == 0) {
return null;
}
String object_sensor = "BlubbFish.Utils.IoT.Connector." + ty.ToString() + "." + settings["type"].ToUpperLower() + ", " + "Connector" + ty.ToString() + settings["type"].ToUpperLower();
return LoadInstance(object_sensor, settings, ty.ToString());
}
public static ABackend LoadInstance(String object_sensor, Dictionary<String, String> settings, String backendtype) {
try {
Type t = Type.GetType(object_sensor, true);
return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings });
} catch(TypeLoadException) {
throw new TypeLoadException("Configuration: " + settings["type"] + " is not a " + backendtype + "Backend");
} catch(System.IO.FileNotFoundException) {
throw new DllNotFoundException("Driver " + object_sensor + " could not load!");
} catch(Exception e) {
throw new Exception("Something bad Happend while Loading Connector: " + e.Message);
}
}
protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value);
protected void NotifyClientSending(BackendEvent value) => this.MessageSending?.Invoke(this, value);
public abstract void Dispose();
}
}
-1
View File
@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.Connector { namespace BlubbFish.Utils.IoT.Connector {
public abstract class ADataBackend : ABackend { public abstract class ADataBackend : ABackend {
+14
View File
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
namespace BlubbFish.Utils.IoT.Connector {
public abstract class ADbBackend : ABackend {
public ADbBackend(Dictionary<String, String> settings) : base(settings) { }
public abstract T LoadSingleRow<T>(String query, Dictionary<String, Object> param) where T : new();
public abstract List<T> LoadMultiRows<T>(String query, Dictionary<String, Object> param) where T : new();
public abstract Int32 Insert(String query, Dictionary<String, Object> param);
}
}
+14
View File
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
namespace BlubbFish.Utils.IoT.Connector {
public abstract class AStorageBackend<O> : ABackend {
public AStorageBackend(Dictionary<String, String> settings) : base(settings) { }
public abstract Dictionary<String, O> Get() ;
public abstract O Get(String key);
public abstract Boolean Put(O param, String key);
}
}
-2
View File
@@ -1,11 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.Connector { namespace BlubbFish.Utils.IoT.Connector {
public abstract class AUserBackend : ABackend { public abstract class AUserBackend : ABackend {
public AUserBackend(Dictionary<String, String> settings) : base(settings) {} public AUserBackend(Dictionary<String, String> settings) : base(settings) {}
public abstract void Send(String message); public abstract void Send(String message);
public abstract void Send(String message, String[] buttons);
} }
} }
-26
View File
@@ -1,26 +0,0 @@
using System;
namespace BlubbFish.Utils.IoT.Connector {
public class UserMessageEventArgs : EventArgs {
public UserMessageEventArgs() : base() { }
public UserMessageEventArgs(String message, Int64 UserId, DateTime date) {
this.UserId = UserId;
this.Message = message;
this.Date = date;
}
public Int64 UserId { get; private set; }
public String Message { get; private set; }
public DateTime Date { get; private set; }
}
public class MqttEventArgs : EventArgs {
public MqttEventArgs() : base() { }
public MqttEventArgs(String message, String topic) {
this.Topic = topic;
this.Message = message;
this.Date = DateTime.Now;
}
public String Topic { get; private set; }
public String Message { get; private set; }
public DateTime Date { get; private set; }
}
}
-4
View File
@@ -1,8 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BlubbFish.Utils.IoT.Events { namespace BlubbFish.Utils.IoT.Events {
public class BackendEvent : EventArgs { public class BackendEvent : EventArgs {
+1 -5
View File
@@ -1,12 +1,8 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BlubbFish.Utils.IoT.Events { namespace BlubbFish.Utils.IoT.Events {
public class DataEvent : BackendEvent { public class DataEvent : BackendEvent {
public DataEvent(String data) : base() { } public DataEvent() : base() { }
public DataEvent(String message, String topic, DateTime date) : base(message, topic, date, "Data") { } public DataEvent(String message, String topic, DateTime date) : base(message, topic, date, "Data") { }
} }
} }
+58
View File
@@ -0,0 +1,58 @@
using System;
namespace BlubbFish.Utils.IoT.Events {
public class GpsEvent : BackendEvent {
#region mandatory field
public Double BatteryLevel {
get; set;
}
public Boolean CorrectInterface {
get; set;
}
public LoraDataGps Gps {
get; set;
}
public String Hash {
get; set;
}
public String Name {
get; set;
}
#endregion
#region optional field
public DateTime Receivedtime {
get; set;
}
public Double Rssi {
get; set;
}
public Double Snr {
get; set;
}
#endregion
public class LoraDataGps {
#region mandatory field
public Double Latitude {
get; set;
}
public Double Longitude {
get; set;
}
public Boolean Fix {
get; set;
}
public Double Height {
get; set;
}
#endregion
#region optional field
public Double Hdop {
get; set;
}
#endregion
}
}
}
+21
View File
@@ -0,0 +1,21 @@
using System;
namespace BlubbFish.Utils.IoT.Events {
public class MqttEventArgs : EventArgs {
public MqttEventArgs() : base() { }
public MqttEventArgs(String message, String topic) {
this.Topic = topic;
this.Message = message;
this.Date = DateTime.Now;
}
public String Topic {
get; private set;
}
public String Message {
get; private set;
}
public DateTime Date {
get; private set;
}
}
}
+1 -5
View File
@@ -1,12 +1,8 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BlubbFish.Utils.IoT.Events { namespace BlubbFish.Utils.IoT.Events {
public class UserEvent : BackendEvent { public class UserEvent : BackendEvent {
public UserEvent() : base() { } public UserEvent() : base() { }
public UserEvent(String message, Int64 UserId, DateTime date) : base(message, UserId, date, "User") { } public UserEvent(String message, Tuple<Int64, String, Int64, String> UserId, DateTime date) : base(message, UserId, date, "User") { }
} }
} }
+21
View File
@@ -0,0 +1,21 @@
using System;
namespace BlubbFish.Utils.IoT.Events {
public class UserMessageEventArgs : EventArgs {
public UserMessageEventArgs() : base() { }
public UserMessageEventArgs(String message, Int64 UserId, DateTime date) {
this.UserId = UserId;
this.Message = message;
this.Date = date;
}
public Int64 UserId {
get; private set;
}
public String Message {
get; private set;
}
public DateTime Date {
get; private set;
}
}
}
-19
View File
@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BlubbFish.Utils.IoT {
static class Helper {
internal static String ToUpperLower(this String s) {
if (s.Length == 0) {
return "";
}
if (s.Length == 1) {
return s.ToUpper();
}
return s[0].ToString().ToUpper() + s.Substring(1).ToLower();
}
}
}
+133 -128
View File
@@ -1,129 +1,134 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading; using System.Threading;
using BlubbFish.Utils.IoT.Connector;
using BlubbFish.Utils.IoT.Events; using BlubbFish.Utils.IoT.Connector;
using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.JsonSensor {
public abstract class AJsonSensor : IDisposable { namespace BlubbFish.Utils.IoT.JsonSensor {
protected String topic; public abstract class AJsonSensor : IDisposable {
protected Int32 pollcount; protected String topic;
protected Dictionary<String, String> settings; protected Int32 pollcount;
protected ABackend backend; protected Dictionary<String, String> settings;
private Thread pollingThread; protected ABackend backend;
private Boolean pollEnabled = false; private Thread pollingThread;
private Boolean pollEnabled = false;
public AJsonSensor(Dictionary<String, String> settings, String name, ABackend backend) {
this.GetBool = true; public AJsonSensor(Dictionary<String, String> settings, String name, ABackend backend) {
this.GetFloat = 0.0f; this.GetBool = true;
this.GetInt = 0; this.GetFloat = 0.0f;
this.topic = (settings.Keys.Contains("topic")) ? settings["topic"] : ""; this.GetInt = 0;
this.settings = settings; this.topic = settings.Keys.Contains("topic") ? settings["topic"] : "";
this.Title = (settings.Keys.Contains("title")) ? settings["title"] : ""; this.settings = settings;
this.Name = name; this.Title = settings.Keys.Contains("title") ? settings["title"] : "";
this.backend = backend; this.Name = name;
this.backend.MessageIncomming += this.IncommingMqttMessage; this.backend = backend;
if (settings.Keys.Contains("polling")) { this.backend.MessageIncomming += this.IncommingMqttMessage;
this.pollEnabled = true; if (settings.Keys.Contains("polling")) {
this.Polling = Int32.Parse(settings["polling"]); this.pollEnabled = true;
this.pollcount = this.Polling; this.Polling = Int32.Parse(settings["polling"]);
this.pollingThread = new Thread(this.SensorPolling); this.pollcount = this.Polling;
this.pollingThread.Start(); this.pollingThread = new Thread(this.SensorPolling);
} this.pollingThread.Start();
} }
}
private void SensorPolling() {
while(this.pollEnabled) { private void SensorPolling() {
Thread.Sleep(1000); while(this.pollEnabled) {
this.Poll(); Thread.Sleep(1000);
} this.Poll();
} }
}
private void IncommingMqttMessage(Object sender, BackendEvent e) {
if(Regex.Match(e.From.ToString(), this.topic).Success) { private void IncommingMqttMessage(Object sender, BackendEvent e) {
if (this.UpdateValue(e)) { if(Regex.Match(e.From.ToString(), this.topic).Success) {
this.Timestamp = DateTime.Now; if (this.UpdateValue(e)) {
this.Update?.Invoke(this, e); this.Timestamp = DateTime.Now;
} this.Update?.Invoke(this, e);
} }
} }
}
public static AJsonSensor GetInstance(Dictionary<String, ABackend> backends, Dictionary<String, String> settings, String name) {
String object_sensor = "BlubbFish.Utils.IoT.JsonSensor." + Char.ToUpper(settings["type"][0]) + settings["type"].Substring(1).ToLower(); public static AJsonSensor GetInstance(Dictionary<String, ABackend> backends, Dictionary<String, String> settings, String name) {
Type t = null; if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) {
try { throw new ArgumentException("Backend not specified!");
t = Type.GetType(object_sensor, true); }
} catch(TypeLoadException) { String object_sensor = "BlubbFish.Utils.IoT.JsonSensor." + settings["type"].ToUpperLower();
throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor"); try {
} Type t = Type.GetType(object_sensor, true);
if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) { return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] });
throw new ArgumentException("Backend not specified!"); } catch(TypeLoadException) {
} throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor");
return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] }); } catch(Exception e) {
} Helper.WriteError("Something went wrong! " + e.Message);
throw e;
protected virtual void Poll() { }
if(this.pollcount++ >= this.Polling) { }
this.pollcount = 1;
if (this.backend is ADataBackend) { protected virtual void Poll() {
((ADataBackend)this.backend).Send(this.topic + "/get", ""); if(this.pollcount++ >= this.Polling) {
} this.pollcount = 1;
} if (this.backend is ADataBackend databackend) {
} databackend.Send(this.topic + "/get", "");
}
public virtual void SetBool(Boolean v) { }
if (this.backend is ADataBackend) { }
((ADataBackend)this.backend).Send(this.topic + "/set", v ? "on" : "off");
} public virtual void SetBool(Boolean v) {
} if (this.backend is ADataBackend databackend) {
databackend.Send(this.topic + "/set", v ? "on" : "off");
protected abstract Boolean UpdateValue(BackendEvent e); }
}
public Single GetFloat { get; protected set; }
public Boolean GetBool { get; protected set; } protected abstract Boolean UpdateValue(BackendEvent e);
public Int32 GetInt { get; protected set; }
public Types Datatypes { get; protected set; } public Single GetFloat { get; protected set; }
public DateTime Timestamp { get; protected set; } public Boolean GetBool { get; protected set; }
public Int32 Polling { get; private set; } public Int32 GetInt { get; protected set; }
public String Title { get; protected set; } public Types Datatypes { get; protected set; }
public String Name { get; internal set; } public DateTime Timestamp { get; protected set; }
public Int32 Polling { get; private set; }
public enum Types { public String Title { get; protected set; }
Bool, public String Name { get; internal set; }
Int,
Float public enum Types {
} Bool,
public delegate void UpdatedValue(Object sender, EventArgs e); Int,
public event UpdatedValue Update; Float
}
#region IDisposable Support public delegate void UpdatedValue(Object sender, EventArgs e);
private Boolean disposedValue = false; public event UpdatedValue Update;
#region IDisposable Support
protected virtual void Dispose(Boolean disposing) { private Boolean disposedValue = false;
if(!this.disposedValue) {
if(disposing) {
this.pollEnabled = false; protected virtual void Dispose(Boolean disposing) {
if (this.pollingThread != null && this.pollingThread.ThreadState == ThreadState.Running) { if(!this.disposedValue) {
this.pollingThread.Abort(); if(disposing) {
while (this.pollingThread.ThreadState != ThreadState.Aborted) { } this.pollEnabled = false;
} if (this.pollingThread != null && this.pollingThread.ThreadState == ThreadState.Running) {
this.backend.MessageIncomming -= this.IncommingMqttMessage; this.pollingThread.Abort();
} while (this.pollingThread.ThreadState != ThreadState.Aborted) { }
this.settings = null; }
this.pollingThread = null; this.backend.MessageIncomming -= this.IncommingMqttMessage;
this.disposedValue = true; }
} this.settings = null;
} this.pollingThread = null;
~AJsonSensor() { this.disposedValue = true;
Dispose(false); }
} }
public void Dispose() {
Dispose(true); ~AJsonSensor() {
GC.SuppressFinalize(this); this.Dispose(false);
} }
#endregion
} public void Dispose() {
this.Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
}
} }
+2 -4
View File
@@ -5,12 +5,10 @@ using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.JsonSensor { namespace BlubbFish.Utils.IoT.JsonSensor {
class Pir : AJsonSensor { class Pir : AJsonSensor {
public Pir(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) { public Pir(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool;
this.Datatypes = Types.Bool;
}
protected override Boolean UpdateValue(BackendEvent e) { protected override Boolean UpdateValue(BackendEvent e) {
this.GetBool = (e.Message.ToLower() == "on") ? true : false; this.GetBool = e.Message.ToLower() == "on";
return true; return true;
} }
} }
+2 -4
View File
@@ -5,12 +5,10 @@ using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.JsonSensor { namespace BlubbFish.Utils.IoT.JsonSensor {
class Switch : AJsonSensor { class Switch : AJsonSensor {
public Switch(Dictionary<System.String, System.String> settings, String name, ADataBackend backend) : base(settings, name, backend) { public Switch(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool;
this.Datatypes = Types.Bool;
}
protected override Boolean UpdateValue(BackendEvent e) { protected override Boolean UpdateValue(BackendEvent e) {
this.GetBool = (e.Message.ToLower() == "on") ? true : false; this.GetBool = e.Message.ToLower() == "on";
return true; return true;
} }
} }
+17 -14
View File
@@ -1,18 +1,20 @@
using System.Reflection; #if !NETCOREAPP
using System.Runtime.CompilerServices; using System.Reflection;
using System.Runtime.InteropServices; using System.Resources;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, // Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind. // die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("IoT")] [assembly: AssemblyTitle("Utils-IoT")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("Provides classes for iot development")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("BlubbFish")]
[assembly: AssemblyProduct("IoT")] [assembly: AssemblyProduct("Utils-IoT")]
[assembly: AssemblyCopyright("Copyright © 2017")] [assembly: AssemblyCopyright("Copyright © BlubbFish 2017 - 24.11.2019")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("BlubbFish")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("de-DE")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly // 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 // für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
@@ -32,5 +34,6 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben: // indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0")]
#endif
+69
View File
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BlubbFish.Utils.IoT</RootNamespace>
<AssemblyName>Utils-IoT</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="Connector\ABackend.cs" />
<Compile Include="Connector\ADataBackend.cs" />
<Compile Include="Connector\AUserBackend.cs" />
<Compile Include="Events\BackendEvent.cs" />
<Compile Include="Events\DataEvent.cs" />
<Compile Include="Events\UserEvent.cs" />
<Compile Include="JsonSensor\Bosmon.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="JsonSensor\AJsonSensor.cs" />
<Compile Include="JsonSensor\Luminanz.cs" />
<Compile Include="JsonSensor\Pir.cs" />
<Compile Include="JsonSensor\Power.cs" />
<Compile Include="JsonSensor\Switch.cs" />
<Compile Include="JsonSensor\Temperatur.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="..\CHANGELOG.md" />
<Content Include="..\CONTRIBUTING.md" />
<Content Include="..\LICENSE" />
<Content Include="..\README.md" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Librarys\litjson\litjson\litjson_4.7.1.csproj">
<Project>{91a14cd2-2940-4500-8193-56d37edddbaa}</Project>
<Name>litjson_4.7.1</Name>
</ProjectReference>
<ProjectReference Include="..\..\Utils\Utils\Utils.csproj">
<Project>{fac8ce64-bf13-4ece-8097-aeb5dd060098}</Project>
<Name>Utils</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+36 -52
View File
@@ -1,60 +1,44 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>net10.0</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BlubbFish.Utils.IoT</RootNamespace> <RootNamespace>BlubbFish.Utils.IoT</RootNamespace>
<AssemblyName>Utils-IoT</AssemblyName> <AssemblyName>Utils-IoT</AssemblyName>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion> <NeutralLanguage>de-DE</NeutralLanguage>
<FileAlignment>512</FileAlignment> <PackageReleaseNotes>
<TargetFrameworkProfile /> 1.3.0 Netcore default
</PropertyGroup> 1.2.0 Refactoring
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 1.1.0 Readme
<DebugSymbols>true</DebugSymbols> 1.0.0.0 Init
<DebugType>full</DebugType> </PackageReleaseNotes>
<Optimize>false</Optimize> <Copyright>Copyright © BlubbFish 2017 - 15.01.2022</Copyright>
<OutputPath>bin\Debug\</OutputPath> <Description>Provides classes for iot development</Description>
<DefineConstants>DEBUG;TRACE</DefineConstants> <PackageLicenseFile>LICENSE</PackageLicenseFile>
<ErrorReport>prompt</ErrorReport> <Company>BlubbFish</Company>
<WarningLevel>4</WarningLevel> <Authors>BlubbFish</Authors>
</PropertyGroup> <PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils-IoT</PackageProjectUrl>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils-IoT.git</RepositoryUrl>
<DebugType>pdbonly</DebugType> <RepositoryType>git</RepositoryType>
<Optimize>true</Optimize> <Version>1.3.0</Version>
<OutputPath>bin\Release\</OutputPath> <PackageId>IoT.Utils.BlubbFish</PackageId>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <ProjectReference Include="..\..\..\Librarys\litjson\litjson\litjson.csproj" />
<ProjectReference Include="..\..\Utils\Utils\Utils.csproj" />
</ItemGroup>
<ItemGroup>
<Content Include="../CHANGELOG.md" />
<Content Include="../CONTRIBUTING.md" />
<Content Include="../LICENSE" />
<Content Include="../README.md" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Connector\ABackend.cs" /> <None Include="..\LICENSE">
<Compile Include="Connector\ADataBackend.cs" /> <Pack>True</Pack>
<Compile Include="Connector\AUserBackend.cs" /> <PackagePath></PackagePath>
<Compile Include="Events\BackendEvent.cs" /> </None>
<Compile Include="Events\DataEvent.cs" />
<Compile Include="Events\UserEvent.cs" />
<Compile Include="Helper.cs" />
<Compile Include="JsonSensor\Bosmon.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="JsonSensor\AJsonSensor.cs" />
<Compile Include="JsonSensor\Luminanz.cs" />
<Compile Include="JsonSensor\Pir.cs" />
<Compile Include="JsonSensor\Power.cs" />
<Compile Include="JsonSensor\Switch.cs" />
<Compile Include="JsonSensor\Temperatur.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Librarys\litjson\litjson\litjson_4.7.1.csproj"> </Project>
<Project>{91a14cd2-2940-4500-8193-56d37edddbaa}</Project>
<Name>litjson_4.7.1</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>