Init
This commit is contained in:
commit
5e1a38fd9e
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/.vs
|
||||||
|
/MonicaScral/bin
|
||||||
|
/MonicaScral/obj
|
61
MonicaScral.sln
Normal file
61
MonicaScral.sln
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 15
|
||||||
|
VisualStudioVersion = 15.0.27703.2026
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonicaScral", "MonicaScral\MonicaScral.csproj", "{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils-IoT", "..\Utils\Utils-IoT\Utils-IoT\Utils-IoT.csproj", "{B870E4D5-6806-4A0B-B233-8907EEDC5AFC}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConnectorDataMqtt", "..\Utils\ConnectorDataMqtt\ConnectorDataMqtt\ConnectorDataMqtt.csproj", "{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}"
|
||||||
|
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}") = "M2Mqtt_4.7.1", "..\Librarys\mqtt\M2Mqtt\M2Mqtt_4.7.1.csproj", "{A11AEF5A-B246-4FE8-8330-06DB73CC8074}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Posix", "..\Librarys\Mono.Posix\Mono.Posix\Mono.Posix.csproj", "{E2CA132E-E85C-40AD-BE94-B138AA68772B}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{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
|
||||||
|
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EE6C8F68-ED46-4C1C-ABDD-CFCDF75104F2}.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
|
||||||
|
{A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A11AEF5A-B246-4FE8-8330-06DB73CC8074}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A11AEF5A-B246-4FE8-8330-06DB73CC8074}.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
|
||||||
|
{E2CA132E-E85C-40AD-BE94-B138AA68772B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{E2CA132E-E85C-40AD-BE94-B138AA68772B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{E2CA132E-E85C-40AD-BE94-B138AA68772B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{E2CA132E-E85C-40AD-BE94-B138AA68772B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
|
SolutionGuid = {CE98D3EF-81C6-4C8D-B8EF-E1C6A72FDD29}
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
74
MonicaScral/MonicaScral.csproj
Normal file
74
MonicaScral/MonicaScral.csproj
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?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>{AF25B9BC-7D93-4CEC-B5E2-8A8383679787}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>Fraunhofer.Fit.IoT.MonicaScral</RootNamespace>
|
||||||
|
<AssemblyName>MonicaScral</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<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' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="MqttEvents.cs" />
|
||||||
|
<Compile Include="MqttListener.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ScralPusher.cs" />
|
||||||
|
</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="..\..\Librarys\Mono.Posix\Mono.Posix\Mono.Posix.csproj">
|
||||||
|
<Project>{e2ca132e-e85c-40ad-be94-b138aa68772b}</Project>
|
||||||
|
<Name>Mono.Posix</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Utils\ConnectorDataMqtt\ConnectorDataMqtt\ConnectorDataMqtt.csproj">
|
||||||
|
<Project>{ee6c8f68-ed46-4c1c-abdd-cfcdf75104f2}</Project>
|
||||||
|
<Name>ConnectorDataMqtt</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Utils\Utils-IoT\Utils-IoT\Utils-IoT.csproj">
|
||||||
|
<Project>{b870e4d5-6806-4a0b-b233-8907eedc5afc}</Project>
|
||||||
|
<Name>Utils-IoT</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\Utils\Utils\Utils\Utils.csproj">
|
||||||
|
<Project>{fac8ce64-bf13-4ece-8097-aeb5dd060098}</Project>
|
||||||
|
<Name>Utils</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
19
MonicaScral/MqttEvents.cs
Normal file
19
MonicaScral/MqttEvents.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Fraunhofer.Fit.IoT.MonicaScral {
|
||||||
|
class MqttEvents : EventArgs {
|
||||||
|
public MqttEvents(String topic, String message, DateTime date) {
|
||||||
|
this.Topic = topic;
|
||||||
|
this.Message = message;
|
||||||
|
this.Date = date;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Topic { get; }
|
||||||
|
public String Message { get; }
|
||||||
|
public DateTime Date { get; }
|
||||||
|
}
|
||||||
|
}
|
66
MonicaScral/MqttListener.cs
Normal file
66
MonicaScral/MqttListener.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using BlubbFish.Utils.IoT.Connector;
|
||||||
|
using BlubbFish.Utils.IoT.Events;
|
||||||
|
|
||||||
|
namespace Fraunhofer.Fit.IoT.MonicaScral {
|
||||||
|
class MqttListener {
|
||||||
|
protected readonly Thread connectionWatcher;
|
||||||
|
protected ABackend mqtt;
|
||||||
|
private readonly Dictionary<String, String> config;
|
||||||
|
|
||||||
|
public delegate void InputData(Object sender, MqttEvents e);
|
||||||
|
public event InputData Update;
|
||||||
|
|
||||||
|
public MqttListener(Dictionary<String, String> settings) {
|
||||||
|
this.config = settings;
|
||||||
|
if(this.config.ContainsKey("type")) {
|
||||||
|
this.connectionWatcher = new Thread(this.ConnectionWatcherRunner);
|
||||||
|
this.connectionWatcher.Start();
|
||||||
|
} else {
|
||||||
|
throw new ArgumentException("Setting section [mqtt] is missing or wrong!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ConnectionWatcherRunner() {
|
||||||
|
while(true) {
|
||||||
|
try {
|
||||||
|
if(this.mqtt == null || !this.mqtt.IsConnected) {
|
||||||
|
this.Reconnect();
|
||||||
|
}
|
||||||
|
Thread.Sleep(10000);
|
||||||
|
} catch(Exception) { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Reconnect() {
|
||||||
|
Console.WriteLine("Fraunhofer.Fit.IoT.MonicaScral.Reconnect()");
|
||||||
|
this.Disconnect();
|
||||||
|
this.Connect();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Connect() {
|
||||||
|
this.mqtt = ABackend.GetInstance(this.config, ABackend.BackendType.Data);
|
||||||
|
this.mqtt.MessageIncomming += this.MqttData;
|
||||||
|
Console.WriteLine("Fraunhofer.Fit.IoT.MonicaScral.Connect()");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MqttData(Object sender, BackendEvent e) => this.Update?.Invoke(this, new MqttEvents(e.From.ToString(), e.Message, e.Date));
|
||||||
|
|
||||||
|
protected void Disconnect() {
|
||||||
|
if(this.mqtt != null) {
|
||||||
|
this.mqtt.MessageIncomming -= this.MqttData;
|
||||||
|
this.mqtt.Dispose();
|
||||||
|
}
|
||||||
|
this.mqtt = null;
|
||||||
|
Console.WriteLine("Fraunhofer.Fit.IoT.MonicaScral.Disconnect()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose() {
|
||||||
|
this.connectionWatcher.Abort();
|
||||||
|
while(this.connectionWatcher.ThreadState == ThreadState.Running) { Thread.Sleep(10); }
|
||||||
|
this.Disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
61
MonicaScral/Program.cs
Normal file
61
MonicaScral/Program.cs
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using BlubbFish.Utils;
|
||||||
|
|
||||||
|
namespace Fraunhofer.Fit.IoT.MonicaScral {
|
||||||
|
class Program {
|
||||||
|
private Thread sig_thread;
|
||||||
|
private Boolean RunningProcess = true;
|
||||||
|
protected ProgramLogger logger = new ProgramLogger();
|
||||||
|
|
||||||
|
static void Main(String[] args) => new Program(args);
|
||||||
|
|
||||||
|
public Program(String[] args) {
|
||||||
|
MqttListener m = new MqttListener(new Dictionary<String, String>() { { "type", "mqtt" }, { "server", "10.100.0.20" }, { "topic", "lora/data/+;lora/panic/+" } });
|
||||||
|
ScralPusher s = new ScralPusher(new Dictionary<String, String>() {
|
||||||
|
{ "server", "http://monappdwp3.monica-cloud.eu:8250" },
|
||||||
|
{ "register_addr", "/scral/v1.0/gps-tracker-gw/gps-tag" },
|
||||||
|
{ "register_method", "post" },
|
||||||
|
{ "update_addr", "/scral/v1.0/gps-tracker-gw/gps-tag/localization" },
|
||||||
|
{ "update_method", "put" },
|
||||||
|
{ "panic_addr", "/scral/v1.0/gps-tracker-gw/gps-tag/alert" },
|
||||||
|
{ "panic_method", "put" },});
|
||||||
|
m.Update += s.DataInput;
|
||||||
|
this.WaitForShutdown();
|
||||||
|
m.Dispose();
|
||||||
|
s.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
MonicaScral/Properties/AssemblyInfo.cs
Normal file
36
MonicaScral/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// 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.
|
||||||
|
[assembly: AssemblyTitle("MonicaScral")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("MonicaScral")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2019")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||||
|
[assembly: Guid("af25b9bc-7d93-4cec-b5e2-8a8383679787")]
|
||||||
|
|
||||||
|
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
//
|
||||||
|
// Hauptversion
|
||||||
|
// Nebenversion
|
||||||
|
// Buildnummer
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||||
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
160
MonicaScral/ScralPusher.cs
Normal file
160
MonicaScral/ScralPusher.cs
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using BlubbFish.Utils;
|
||||||
|
using LitJson;
|
||||||
|
|
||||||
|
namespace Fraunhofer.Fit.IoT.MonicaScral {
|
||||||
|
class ScralPusher {
|
||||||
|
private readonly List<String> nodes = new List<String>();
|
||||||
|
private readonly Dictionary<String, String> config;
|
||||||
|
private readonly Object getLock = new Object();
|
||||||
|
private readonly Boolean authRequired = false;
|
||||||
|
private readonly String auth = "";
|
||||||
|
|
||||||
|
public ScralPusher(Dictionary<String, String> settings) => this.config = settings;
|
||||||
|
|
||||||
|
internal async void DataInput(Object sender, MqttEvents e) => await Task.Run(() => {
|
||||||
|
try {
|
||||||
|
JsonData data = JsonMapper.ToObject(e.Message);
|
||||||
|
if(this.CheckRegister(data)) {
|
||||||
|
if(e.Topic.StartsWith("lora/data")) {
|
||||||
|
this.SendUpdate(data);
|
||||||
|
} else if(e.Topic.StartsWith("lora/panic")) {
|
||||||
|
this.SendPanic(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(Exception ex) {
|
||||||
|
Helper.WriteError("Something is wrong: " + ex.Message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
private Boolean CheckRegister(JsonData data) {
|
||||||
|
if(data.ContainsKey("Name") && data["Name"].IsString) {
|
||||||
|
if(!this.nodes.Contains((String)data["Name"])) {
|
||||||
|
this.SendRegister(data);
|
||||||
|
this.nodes.Add((String)data["Name"]);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendRegister(JsonData data) {
|
||||||
|
Dictionary<String, Object> d = new Dictionary<String, Object> {
|
||||||
|
{ "device", "wearable" },
|
||||||
|
{ "sensor", "tag" },
|
||||||
|
{ "type", "uwb" },
|
||||||
|
{ "tagId", (String)data["Name"] },
|
||||||
|
{ "timestamp", DateTime.Now.ToString("o") },
|
||||||
|
{ "unitOfMeasurements", "meters" },
|
||||||
|
{ "observationType", "propietary" },
|
||||||
|
{ "state", "active" }
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
String addr = this.config["register_addr"];
|
||||||
|
if(Enum.TryParse(this.config["register_method"], true, out RequestMethod meth)) {
|
||||||
|
this.RequestString(addr, JsonMapper.ToJson(d), false, meth);
|
||||||
|
Console.WriteLine(meth.ToString() + " " + this.config["register_addr"] + ": " + JsonMapper.ToJson(d));
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Helper.WriteError("Fraunhofer.Fit.IoT.MonicaScral.SendRegister: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendUpdate(JsonData data) {
|
||||||
|
if((Boolean)data["Gps"]["Fix"]) {
|
||||||
|
Dictionary<String, Object> d = new Dictionary<String, Object> {
|
||||||
|
{ "type", "uwb" },
|
||||||
|
{ "tagId", (String)data["Name"] },
|
||||||
|
{ "timestamp", DateTime.Now.ToString("o") },
|
||||||
|
{ "lat", (Double)data["Gps"]["Latitude"] },
|
||||||
|
{ "lon", (Double)data["Gps"]["Longitude"] },
|
||||||
|
{ "height", (Double)data["Gps"]["Height"] },
|
||||||
|
{ "hdop", (Double)data["Gps"]["Hdop"] },
|
||||||
|
{ "snr", (Double)data["Snr"] },
|
||||||
|
{ "battery_level", (Double)data["BatteryLevel"] },
|
||||||
|
{ "host", (String)data["Host"]}
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
String addr = this.config["update_addr"];
|
||||||
|
if(Enum.TryParse(this.config["update_method"], true, out RequestMethod meth)) {
|
||||||
|
this.RequestString(addr, JsonMapper.ToJson(d), false, meth);
|
||||||
|
Console.WriteLine(meth.ToString() + " " + this.config["update_addr"] + ": " + JsonMapper.ToJson(d));
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Helper.WriteError("Fraunhofer.Fit.IoT.MonicaScral.SendUpdate: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendPanic(JsonData data) {
|
||||||
|
Dictionary<String, Object> d = new Dictionary<String, Object> {
|
||||||
|
{ "type", "uwb" },
|
||||||
|
{ "tagId", (String)data["Name"] },
|
||||||
|
{ "timestamp", DateTime.Now.ToString("o") },
|
||||||
|
{ "last_known_lat", (Double)data["Gps"]["LastLatitude"] },
|
||||||
|
{ "last_known_lon", (Double)data["Gps"]["LastLongitude"] },
|
||||||
|
{ "last_known_gps", DateTime.Parse((String)data["Gps"]["LastGPSPos"], DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal).ToLocalTime().ToString("o") }
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
String addr = this.config["panic_addr"];
|
||||||
|
if(Enum.TryParse(this.config["panic_method"], true, out RequestMethod meth)) {
|
||||||
|
this.RequestString(addr, JsonMapper.ToJson(d), false, meth);
|
||||||
|
Console.WriteLine(meth.ToString() + " " + this.config["panic_addr"] + ": " + JsonMapper.ToJson(d));
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Helper.WriteError("Fraunhofer.Fit.IoT.MonicaScral.SendRegister: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region HTTP Request
|
||||||
|
private String RequestString(String address, String json = "", Boolean withoutput = true, RequestMethod method = RequestMethod.GET) {
|
||||||
|
String ret = null;
|
||||||
|
lock(this.getLock) {
|
||||||
|
HttpWebRequest request = WebRequest.CreateHttp(this.config["server"] + address);
|
||||||
|
request.Timeout = 2000;
|
||||||
|
if(this.authRequired) {
|
||||||
|
request.Headers.Add(HttpRequestHeader.Authorization, this.auth);
|
||||||
|
}
|
||||||
|
if(method == RequestMethod.POST || method == RequestMethod.PUT) {
|
||||||
|
Byte[] requestdata = Encoding.ASCII.GetBytes(json);
|
||||||
|
request.ContentLength = requestdata.Length;
|
||||||
|
request.Method = method.ToString();
|
||||||
|
request.ContentType = "application/json";
|
||||||
|
using(Stream stream = request.GetRequestStream()) {
|
||||||
|
stream.Write(requestdata, 0, requestdata.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
|
||||||
|
if(response.StatusCode == HttpStatusCode.Unauthorized) {
|
||||||
|
Console.Error.WriteLine("Benutzer oder Passwort falsch!");
|
||||||
|
throw new Exception("Benutzer oder Passwort falsch!");
|
||||||
|
}
|
||||||
|
if(withoutput) {
|
||||||
|
StreamReader reader = new StreamReader(response.GetResponseStream());
|
||||||
|
ret = reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new WebException("Error while uploading to Scal. Resource: \"" + this.config["server"] + address + "\" Method: " + method + " Data: " + json + " Fehler: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
private enum RequestMethod {
|
||||||
|
GET,
|
||||||
|
POST,
|
||||||
|
PUT
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
internal void Dispose() { }
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user