diff --git a/Lora-Map/Lib/WebRequests.cs b/Lora-Map/Lib/WebRequests.cs
new file mode 100644
index 0000000..8a4e98a
--- /dev/null
+++ b/Lora-Map/Lib/WebRequests.cs
@@ -0,0 +1,62 @@
+using System;
+using System.IO;
+using System.Net;
+
+using BlubbFish.Utils;
+
+using LitJson;
+
+namespace Fraunhofer.Fit.IoT.LoraMap.Lib {
+ public class WebRequests {
+ private static readonly Object getLock = new Object();
+ public JsonData GetJson(String url) {
+ String text = null;
+ for(Int32 i = 0; i < 3; i++) {
+ try {
+ text = this.GetString(url);
+ break;
+ } catch(Exception e) {
+ Helper.WriteError(e.Message);
+ if(i == 2) {
+ throw;
+ }
+ System.Threading.Thread.Sleep(30000);
+ }
+ }
+ if(text == null) {
+ return new JsonData();
+ }
+ try {
+ return JsonMapper.ToObject(text);
+ } catch(Exception) {
+ return new JsonData();
+ }
+ }
+
+ private String GetString(String url, Boolean withoutput = true) {
+ String ret = null;
+ lock(getLock) {
+ HttpWebRequest request = WebRequest.CreateHttp(url);
+ request.Timeout = 10000;
+ //request.Headers.Add(HttpRequestHeader.Authorization, this.auth);
+ 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) {
+ //Helper.WriteError("Konnte keine Verbindung zum Razzbery Server herstellen. Resource: \"" + this.server + v + "\" Fehler: " + e.Message);
+ //return null;
+ throw new Exception("Konnte keine Verbindung zum Server herstellen: " + e.Message);
+ }
+ }
+ return ret;
+ }
+ }
+}
diff --git a/Lora-Map/Lora-Map.csproj b/Lora-Map/Lora-Map.csproj
index 4b6192c..84ffda1 100644
--- a/Lora-Map/Lora-Map.csproj
+++ b/Lora-Map/Lora-Map.csproj
@@ -45,6 +45,7 @@
+
@@ -238,8 +239,6 @@
PreserveNewest
-
-
-
+
\ No newline at end of file
diff --git a/Lora-Map/Model/Settings.cs b/Lora-Map/Model/Settings.cs
index 5f62294..748666a 100644
--- a/Lora-Map/Model/Settings.cs
+++ b/Lora-Map/Model/Settings.cs
@@ -117,5 +117,7 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model {
}
}
}
+
+ public List GetWeatherCellIds() => this.weatherCellIDs;
}
}
diff --git a/Lora-Map/Model/WeatherWarnings.cs b/Lora-Map/Model/WeatherWarnings.cs
index 2956ce3..9eb780b 100644
--- a/Lora-Map/Model/WeatherWarnings.cs
+++ b/Lora-Map/Model/WeatherWarnings.cs
@@ -1,21 +1,164 @@
using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Threading;
+
+using Fraunhofer.Fit.IoT.LoraMap.Lib;
+
+using LitJson;
namespace Fraunhofer.Fit.IoT.LoraMap.Model {
public class WeatherWarnings {
private readonly Settings settings;
+ private Thread bgthread;
+ private readonly WebRequests webrequests = new WebRequests();
- public WeatherWarnings(Settings settings) { this.settings = settings;
+ public List Warnungen { get; private set; }
+
+ public WeatherWarnings(Settings settings) {
+ this.settings = settings;
this.StartBackgroundThread();
}
private void StartBackgroundThread() {
+ this.bgthread = new Thread(this.BackGroundRunner);
+ this.bgthread.Start();
}
- internal void Dispose() {
+ private void BackGroundRunner() {
+ while(true) {
+ List ret = new List();
+ foreach(Int32 item in this.settings.GetWeatherCellIds()) {
+ JsonData json = this.webrequests.GetJson("https://maps.dwd.de/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeName=dwd:Warnungen_Gemeinden&outputFormat=application/json&cql_filter=WARNCELLID=" + item);
+ if(json.ContainsKey("features") && json["features"].IsArray && json["features"].Count > 0) {
+ foreach(JsonData warning in json["features"]) {
+ try {
+ ret.Add(new Warning(warning));
+ } catch { }
+ }
+ }
+ }
+ this.Warnungen = ret;
+ Thread.Sleep(60 * 1000);
+ }
+ }
+
+ internal void Dispose() => this.bgthread.Abort();
+
+ public class Warning {
+ public Warning(JsonData warning) {
+ this.Id = warning["id"].ToString();
+ this.From = warning["properties"]["SENT"].ToString();
+ this.Expires = warning["properties"]["EXPIRES"].ToString();
+ this.Location = warning["properties"]["NAME"].ToString();
+ this.Type = warning["properties"]["EVENT"].ToString();
+ this.Level = warning["properties"]["SEVERITY"].ToString();
+ this.Headline = warning["properties"]["HEADLINE"].ToString();
+ this.Body = warning["properties"]["DESCRIPTION"].ToString();
+ this.Instructions = warning["properties"]["INSTRUCTION"].ToString();
+ }
+
+ public String Id { get; }
+ public String From { get; }
+ public String Expires { get; }
+ public String Location { get; }
+ public String Type { get; }
+ public String Level { get; }
+ public String Headline { get; }
+ public String Body { get; }
+ public String Instructions { get; }
}
}
+
+
}
+
+/* https://maps.dwd.de/geoserver/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature&typeName=dwd:Warnungen_Gemeinden&outputFormat=application/json&cql_filter=WARNCELLID=805314000
+ * {
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "id": "Warnungen_Gemeinden.805314000.2.49.0.1.276.0.DWD.PVW.1565627520000.4edfa973-5fef-4b97-8990-7489828dbe5b.DEU",
+ "geometry": {
+ "type": "MultiPolygon",
+ "coordinates": [
+ [
+ [
+ [ 7.2072, 50.7395 ],
+ [ 7.1534, 50.7599 ],
+ [ 7.1255, 50.7744 ],
+ [ 7.105, 50.7622 ],
+ [ 7.0768, 50.7679 ],
+ [ 7.0666, 50.7705 ],
+ [ 7.0378, 50.7558 ],
+ [ 7.0256, 50.7054 ],
+ [ 7.0385, 50.6886 ],
+ [ 7.0255, 50.665 ],
+ [ 7.0473, 50.6391 ],
+ [ 7.0639, 50.6309 ],
+ [ 7.1054, 50.6595 ],
+ [ 7.1278, 50.6472 ],
+ [ 7.1564, 50.6547 ],
+ [ 7.1954, 50.6434 ],
+ [ 7.2119, 50.649 ],
+ [ 7.1972, 50.6648 ],
+ [ 7.1679, 50.7035 ],
+ [ 7.1969, 50.7138 ],
+ [ 7.2072, 50.7395 ]
+ ]
+ ]
+ ]
+ },
+ "geometry_name": "THE_GEOM",
+ "properties": {
+ "AREADESC": "Bonn",
+ "NAME": "Stadt Bonn",
+ "WARNCELLID": 805314000,
+ "IDENTIFIER": "2.49.0.1.276.0.DWD.PVW.1565627520000.4edfa973-5fef-4b97-8990-7489828dbe5b.DEU",
+ "SENDER": "CAP@dwd.de",
+ "SENT": "2019-08-12T16:32:00Z",
+ "STATUS": "Actual",
+ "MSGTYPE": "Update",
+ "SOURCE": "PVW",
+ "SCOPE": "Public",
+ "CODE": "id:2.49.0.1.276.0.DWD.PVW.1565627520000.4edfa973-5fef-4b97-8990-7489828dbe5b",
+ "LANGUAGE": "de-DE",
+ "CATEGORY": "Met",
+ "EVENT": "GEWITTER",
+ "RESPONSETYPE": "Prepare",
+ "URGENCY": "Immediate",
+ "SEVERITY": "Minor",
+ "CERTAINTY": "Likely",
+ "EC_PROFILE": "2.1",
+ "EC_LICENSE": "Geobasisdaten: Copyright Bundesamt für Kartographie und Geodäsie, Frankfurt am Main, 2017",
+ "EC_II": "31",
+ "EC_GROUP": "THUNDERSTORM;WIND",
+ "EC_AREA_COLOR": "255 255 0",
+ "EFFECTIVE": "2019-08-12T16:32:00Z",
+ "ONSET": "2019-08-12T16:32:00Z",
+ "EXPIRES": "2019-08-12T17:00:00Z",
+ "SENDERNAME": "DWD / Nationales Warnzentrum Offenbach",
+ "HEADLINE": "Amtliche WARNUNG vor GEWITTER",
+ "DESCRIPTION": "Von Südwesten ziehen einzelne Gewitter auf. Dabei gibt es Windböen mit Geschwindigkeiten um 60 km/h (17m/s, 33kn, Bft 7).",
+ "INSTRUCTION": "ACHTUNG! Hinweis auf mögliche Gefahren: Örtlich kann es Blitzschlag geben. Bei Blitzschlag besteht Lebensgefahr!",
+ "WEB": "http://www.wettergefahren.de",
+ "CONTACT": "Deutscher Wetterdienst",
+ "PARAMETERNAME": "Böen;Gewitter;Gewitteraufzugsrichtung",
+ "PARAMETERVALUE": "~60 [km/h];einzelne;SW",
+ "ALTITUDE": 0,
+ "CEILING": 9842.5197,
+ "bbox": [ 7.0255, 50.6309, 7.2119, 50.7744 ]
+ }
+ }
+ ],
+ "totalFeatures": 1,
+ "numberMatched": 1,
+ "numberReturned": 1,
+ "timeStamp": "2019-08-12T16:42:20.743Z",
+ "crs": {
+ "type": "name",
+ "properties": { "name": "urn:ogc:def:crs:EPSG::4326" }
+ },
+ "bbox": [ 50.6309, 7.0255, 50.7744, 7.2119 ]
+}
+*/