diff --git a/CodeChallengeV2/Services/GeocodeService.cs b/CodeChallengeV2/Services/GeocodeService.cs index 242df1f..ba60772 100644 --- a/CodeChallengeV2/Services/GeocodeService.cs +++ b/CodeChallengeV2/Services/GeocodeService.cs @@ -1,16 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Net.Http; using System.Threading.Tasks; using CodeChallengeV2.Models; +using Newtonsoft.Json.Linq; namespace CodeChallengeV2.Services { public class GeocodeService : IGeocodeService { - public Task FindCountryCode(GeocodePayload payload) + static readonly HttpClient client = new HttpClient(); + public async Task FindCountryCode(GeocodePayload payload) { - return Task.FromResult("DK"); + var requestStr = $"http://api.geonames.org/findNearbyPlaceNameJSON?lat={payload.Lat}&lng={payload.Long}&username=kk9440"; + + HttpResponseMessage response = (await client.GetAsync(requestStr)).EnsureSuccessStatusCode(); + var parsedContent = JObject.Parse(await response.Content.ReadAsStringAsync()); + return (string) parsedContent["geonames"][0]["countryCode"]; } } } diff --git a/CodeChallengeV2/Services/NetworkSimulatorService.cs b/CodeChallengeV2/Services/NetworkSimulatorService.cs index 0fe7eb1..33ad1e6 100644 --- a/CodeChallengeV2/Services/NetworkSimulatorService.cs +++ b/CodeChallengeV2/Services/NetworkSimulatorService.cs @@ -15,7 +15,20 @@ public class NetworkSimulatorService : INetworkSimulatorService /// public Task> FindCritialGateways(NetworkGraph graph) { - return Task.FromResult(Enumerable.Empty().ToList()); + var devDict = new Dictionary>(); + List criticalGatewayNodes = new List(); + + graph.Graphs.ToList().ForEach(g => { + List devices = g.Nodes.Where(x => x.Type == "Device").Select(x => x.Id).ToList(); + + devices.ForEach(dev => devDict[dev] = new List()); + g.Edges.Where(x => x.Relation == "is_connected_to").ToList().ForEach(y => devDict[y.Source].Add(y.Target)); + + List criticalGateways = devDict.Where( x => x.Value.Count == 1).Select( y => y.Value.First()).ToList(); + criticalGatewayNodes.AddRange(g.Nodes.Where(x => x.Type == "Gateway" && criticalGateways.Contains(x.Id)).ToList()); + }); + + return Task.FromResult(criticalGatewayNodes); } } } diff --git a/CodeChallengeV2/Services/SensorService.cs b/CodeChallengeV2/Services/SensorService.cs index 7879734..8fc9226 100644 --- a/CodeChallengeV2/Services/SensorService.cs +++ b/CodeChallengeV2/Services/SensorService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using System.Threading.Tasks; using CodeChallengeV2.Models; @@ -8,15 +9,59 @@ namespace CodeChallengeV2.Services { public class SensorService : ISensorService { + private static byte[] StringToByteArray(string hex) { + byte[] bytes = new byte[(hex.Length >> 1)]; + for (int idx = 0; idx < hex.Length; idx += 2) bytes[(idx >> 1)] = Convert.ToByte(hex.Substring(idx, 2), 16); + return bytes; + } + + private static T GetData(byte[] bytes, int offset, int dataSize) { + T result = default(T); + for (int i = 0; i < Marshal.SizeOf(default(T)); i++) { + result = (result * (dynamic)256) | bytes[0]; + } + + return result; + } + public Task DecodePayload(SensorPayload payload) { - //TODO: implement decoding + byte[] bytes = StringToByteArray(payload.FPort.ToString("X2") + payload.Data); + int arrayIdx = 0; var res = new SensorPayloadDecoded() { DevEUI = payload.DevEUI, - Time = payload.Time + Time = payload.Time }; + while (arrayIdx < bytes.Length) { + double data = (double)((Int16)(bytes[arrayIdx+2] << 8 | bytes[arrayIdx+1])); + switch(bytes[arrayIdx]) { + case 20: + arrayIdx += 3; + break; + case 40: + res.TempInternal = data / 100.0; + arrayIdx += 3; + break; + case 41: + res.TempRed = data / 100.0; + arrayIdx += 3; + break; + case 42: + res.TempBlue = data / 100.0; + arrayIdx += 3; + break; + case 43: + res.TempHumidity = data / 100.0; + res.Humidity = (double)((SByte)(bytes[arrayIdx+3])) / 2.0; + arrayIdx += 4; + break; + default: + break; + } + } + return Task.FromResult(res); } }