6 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
12 changed files with 344 additions and 193 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
+6 -4
View File
@@ -1,9 +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](http://git.blubbfish.net/vs_librarys/litjson)
## Linking to
### Internal ### Internal
* [Utils](http://git.blubbfish.net/vs_utils/Utils) * 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))
+34 -9
View File
@@ -1,11 +1,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using BlubbFish.Utils.IoT.Events; using BlubbFish.Utils.IoT.Events;
namespace BlubbFish.Utils.IoT.Connector { namespace BlubbFish.Utils.IoT.Connector {
public abstract class ABackend { public abstract class ABackend {
public enum BackendType { public enum BackendType {
Data, Data,
Db,
Storage,
User User
} }
public event BackendMessage MessageIncomming; public event BackendMessage MessageIncomming;
@@ -18,24 +22,45 @@ namespace BlubbFish.Utils.IoT.Connector {
public ABackend(Dictionary<String, String> settings) => this.settings = settings; public ABackend(Dictionary<String, String> settings) => this.settings = settings;
public static ABackend GetInstance(Dictionary<String, String> settings) {
if(settings.Count == 0) {
return null;
}
try {
return GetInstance(settings, (BackendType)Enum.Parse(typeof(BackendType), settings["backendtype"]));
} catch(Exception e) {
throw new Exception("Something bad Happend while Loading Connector without type: " + e.Message);
}
}
public static ABackend GetStorageInstance(Dictionary<String, String> settings, List<Type> types) {
if(settings.Count == 0 || types.Count != 1) {
return null;
}
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 static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) { public static ABackend GetInstance(Dictionary<String, String> settings, BackendType ty) {
if (settings.Count == 0) { if (settings.Count == 0) {
return null; return null;
} }
String object_sensor = "BlubbFish.Utils.IoT.Connector." + ty.ToString() + "." + settings["type"].ToUpperLower() + ", " + "Connector" + ty.ToString() + settings["type"].ToUpperLower(); 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 { try {
Type t = Type.GetType(object_sensor, true); Type t = Type.GetType(object_sensor, true);
return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings }); return (ABackend)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>) }).Invoke(new Object[] { settings });
} catch (TypeLoadException) { } catch(TypeLoadException) {
Console.Error.WriteLine("Configuration: " + settings["type"] + " is not a " + ty.ToString() + "Backend"); throw new TypeLoadException("Configuration: " + settings["type"] + " is not a " + backendtype + "Backend");
return null; } catch(System.IO.FileNotFoundException) {
} catch (System.IO.FileNotFoundException) { throw new DllNotFoundException("Driver " + object_sensor + " could not load!");
Console.Error.WriteLine("Driver " + object_sensor + " could not load!"); } catch(Exception e) {
return null; throw new Exception("Something bad Happend while Loading Connector: " + e.Message);
} catch (Exception e) {
Console.Error.WriteLine("Something bad Happend while Loading Connectior: "+e.Message);
} }
return null;
} }
protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value); protected void NotifyClientIncomming(BackendEvent value) => this.MessageIncomming?.Invoke(this, value);
+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);
}
}
-1
View File
@@ -5,6 +5,5 @@ 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);
} }
} }
+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
}
}
}
+1 -1
View File
@@ -3,6 +3,6 @@
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") { }
} }
} }
+14 -11
View File
@@ -3,6 +3,7 @@ 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.Connector;
using BlubbFish.Utils.IoT.Events; using BlubbFish.Utils.IoT.Events;
@@ -51,31 +52,33 @@ namespace BlubbFish.Utils.IoT.JsonSensor {
} }
public static AJsonSensor GetInstance(Dictionary<String, ABackend> backends, Dictionary<String, String> settings, String name) { 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();
Type t;
try {
t = Type.GetType(object_sensor, true);
} catch(TypeLoadException) {
throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor");
}
if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) { if(!settings.ContainsKey("backend") || !backends.ContainsKey(settings["backend"])) {
throw new ArgumentException("Backend not specified!"); throw new ArgumentException("Backend not specified!");
} }
String object_sensor = "BlubbFish.Utils.IoT.JsonSensor." + settings["type"].ToUpperLower();
try {
Type t = Type.GetType(object_sensor, true);
return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] }); return (AJsonSensor)t.GetConstructor(new Type[] { typeof(Dictionary<String, String>), typeof(String), typeof(ABackend) }).Invoke(new Object[] { settings, name, backends[settings["backend"]] });
} catch(TypeLoadException) {
throw new ArgumentException("Sensor: " + object_sensor + " is not a Sensor");
} catch(Exception e) {
Helper.WriteError("Something went wrong! " + e.Message);
throw e;
}
} }
protected virtual void Poll() { protected virtual void Poll() {
if(this.pollcount++ >= this.Polling) { if(this.pollcount++ >= this.Polling) {
this.pollcount = 1; this.pollcount = 1;
if (this.backend is ADataBackend) { if (this.backend is ADataBackend databackend) {
((ADataBackend)this.backend).Send(this.topic + "/get", ""); databackend.Send(this.topic + "/get", "");
} }
} }
} }
public virtual void SetBool(Boolean v) { public virtual void SetBool(Boolean v) {
if (this.backend is ADataBackend) { if (this.backend is ADataBackend databackend) {
((ADataBackend)this.backend).Send(this.topic + "/set", v ? "on" : "off"); databackend.Send(this.topic + "/set", v ? "on" : "off");
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ namespace BlubbFish.Utils.IoT.JsonSensor {
public Pir(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool; public Pir(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => 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;
} }
} }
+1 -1
View File
@@ -8,7 +8,7 @@ namespace BlubbFish.Utils.IoT.JsonSensor {
public Switch(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => this.Datatypes = Types.Bool; public Switch(Dictionary<String, String> settings, String name, ADataBackend backend) : base(settings, name, backend) => 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;
} }
} }
+9 -6
View File
@@ -1,22 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<RootNamespace>BlubbFish.Utils.IoT</RootNamespace> <RootNamespace>BlubbFish.Utils.IoT</RootNamespace>
<AssemblyName>Utils-IoT</AssemblyName> <AssemblyName>Utils-IoT</AssemblyName>
<AssemblyVersion>1.0.0</AssemblyVersion>
<NeutralLanguage>de-DE</NeutralLanguage> <NeutralLanguage>de-DE</NeutralLanguage>
<PackageReleaseNotes>1.0.0 Init</PackageReleaseNotes> <PackageReleaseNotes>
<Copyright>Copyright © BlubbFish 2017 - 24.11.2019</Copyright> 1.3.0 Netcore default
1.2.0 Refactoring
1.1.0 Readme
1.0.0.0 Init
</PackageReleaseNotes>
<Copyright>Copyright © BlubbFish 2017 - 15.01.2022</Copyright>
<Description>Provides classes for iot development</Description> <Description>Provides classes for iot development</Description>
<PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageLicenseFile>LICENSE</PackageLicenseFile>
<Company>BlubbFish</Company> <Company>BlubbFish</Company>
<Authors>BlubbFish</Authors> <Authors>BlubbFish</Authors>
<FileVersion>1.0.0</FileVersion>
<PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils-IoT</PackageProjectUrl> <PackageProjectUrl>http://git.blubbfish.net/vs_utils/Utils-IoT</PackageProjectUrl>
<RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils-IoT.git</RepositoryUrl> <RepositoryUrl>http://git.blubbfish.net/vs_utils/Utils-IoT.git</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<Version>1.0.0</Version> <Version>1.3.0</Version>
<PackageId>IoT.Utils.BlubbFish</PackageId> <PackageId>IoT.Utils.BlubbFish</PackageId>
</PropertyGroup> </PropertyGroup>