private async void _handleActivityNotification(InvokeRequest request) { Uri uri = new Uri("http://localhost" + request.Parameters[SensolusConstants.PATH].Value <string>()); if (uri.Segments.Length <= 1) { return; } string context = uri.Segments[1].Replace("/", ""); if (!connCfgs.ContainsKey(context)) { return; } SensolusCfg cfg = connCfgs[context]; var query = System.Web.HttpUtility.ParseQueryString(uri.Query); DateTime start = DateTime.Now; DataProcessor dp = new DataProcessor(cfg); IDbTransaction transaction = null; string serial = ""; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); transaction = client.BeginTransaction(); //dp.FirstPhase(client); List <DimTracker> trackers = client.GetDimTrackers(); FactActivity activity = new FactActivity(); activity.Id = request.Parameters[SensolusConstants.ACTIVITY_ID].Value <long>(); activity.Evttime = DateTime.Parse(request.Parameters[SensolusConstants.ACTIVITY_TIME].Value <string>()); activity.Inserttime = DateTime.Parse(request.Parameters[SensolusConstants.ACTIVITY_INSERTTIME].Value <string>()); activity.Serial = request.Parameters[SensolusConstants.SERIAL].Value <string>(); activity.Evttype = request.Parameters[SensolusConstants.ACTIVITY_STATE]?.Value <string>(); activity.Lat = request.Parameters[SensolusConstants.ACTIVITY_LAT]?.Value <double?>(); activity.Lon = request.Parameters[SensolusConstants.ACTIVITY_LON]?.Value <double?>(); activity.Src = request.Parameters[SensolusConstants.ACTIVITY_SRC]?.Value <string>(); activity.Accuracy = request.Parameters[SensolusConstants.ACTIVITY_ACCURACY]?.Value <int?>(); activity.Address = request.Parameters[SensolusConstants.ACTIVITY_ADDRESS]?.Value <string>(); activity.Geozones = request.Parameters[SensolusConstants.ACTIVITY_GEOZONE]?.Value <string>(); serial = activity.Serial; DimTracker tracker = trackers.Find(x => x.Serial == activity.Serial); if (tracker == default(DimTracker)) { dp.FirstPhase(client); tracker = client.GetDimTrackers().Find(x => x.Serial == activity.Serial); } activity.Trackerrecid = tracker.Recid; DateTime epoch = new DateTime(1970, 1, 1); if (tracker.TBRef != null && ThingsBoardURL != "") { // send to TB JObject data = new JObject(); if (activity.Evttype == "GeozoneInsideAlertType") { data["inGz"] = true; JArray geozones = JArray.Parse(activity.Geozones); data["lastGz"] = geozones[0].Value <string>(); if (client.GetZones().Find(x => x.Id == long.Parse(data["lastGz"])) == default(DimZone)) { dp.FirstPhase(client); } data["lastGzEntry"] = (activity.Evttime - epoch).TotalMilliseconds; } else if (activity.Evttype == "GeozoneOutsideAlertType") { data["inGz"] = false; data["lastGzExit"] = (activity.Evttime - epoch).TotalMilliseconds; } if (activity.Lat != null) { data["latitude"] = activity.Lat; } if (activity.Lon != null) { data["longitude"] = activity.Lon; } if (activity.Accuracy != null) { data["locAccuracy"] = activity.Accuracy; } if (activity.Lat != null || activity.Lon != null || activity.Accuracy != null) { data["lastLocTime"] = (activity.Evttime - epoch).TotalMilliseconds; } data["tracker"] = activity.Serial; // send POST request to ThingsBoard using (var httpClient = new HttpClient()) { var response = await httpClient.PostAsync( $"{ThingsBoardURL}/api/v1/{tracker.TBRef.Value.TBAt}/attributes", new StringContent(data.ToString(), Encoding.UTF8, "application/json")); } } transaction.Commit(); } } catch (SqlException e) { Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); transaction?.Rollback(); return; } catch (ArgumentException e) { //wrong SQL Connection string Serilog.Log.Error("Wrong SQL Connection string: " + $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password=*****"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } catch (Exception e) { Serilog.Log.Error("Unexpected error"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } TimeSpan duration = DateTime.Now - start; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); IDbCommand cmd = client.CreateCommand(); cmd.CommandText = $"INSERT INTO log (ts, duration, reqcount, initevent, serial) VALUES ({SqlConvert.Convert(DateTime.Now)}, {duration.TotalMilliseconds}, {dp.api.Count}, 'PN', {SqlConvert.Convert(serial)})"; cmd.ExecuteNonQuery(); } } catch (Exception e) { Serilog.Log.Error("Could not make log record"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } Serilog.Log.Information($"ts: {DateTime.Now}, duration: {duration.TotalMilliseconds}, reqCount: {dp.api.Count}, initevent: PN, serial: {serial}"); }
public void Run(DbProviderFactory factory) { IDbTransaction transaction = null; api.ResetCounter(); DateTime start = DateTime.Now; try { var connectionStringBuilder = factory.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(factory, connectionStringBuilder.ToString())) { client.Open(); transaction = client.BeginTransaction(); if (cfg.Clean) { client.ClearAlerts(); client.ClearActivities(); client.ClearFactTrackers(); client.ClearZones(); client.ClearRules(); client.ClearDimTrackers(); } FirstPhase(client); SecondPhase(client, cfg.Interval); string[] serials = client.GetDimTrackers().Select(x => x.Serial).ToArray(); ThirdPhase(client, serials); transaction.Commit(); transaction = null; } } catch (SqlException e) { Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); transaction?.Rollback(); return; } catch (ArgumentException e) { //wrong SQL Connection string Serilog.Log.Error("Wrong SQL Connection string: " + $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password=*****"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } catch (Exception e) { Serilog.Log.Error("Unexpected error"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } TimeSpan duration = DateTime.Now - start; try { var connectionStringBuilder = factory.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(factory, connectionStringBuilder.ToString())) { client.Open(); IDbCommand cmd = client.CreateCommand(); cmd.CommandText = $"INSERT INTO log (ts, duration, reqcount, initevent) VALUES ({SqlConvert.Convert(DateTime.Now)}, {duration.TotalMilliseconds}, {api.Count}, 'TS')"; cmd.ExecuteNonQuery(); } } catch (Exception e) { Serilog.Log.Error("Could not make log record"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } Serilog.Log.Information($"ts: {DateTime.Now}, duration: {duration.TotalMilliseconds}, reqCount: {api.Count}, initevent: TS"); }
private void _handleAlertNotification(InvokeRequest request) { Uri uri = new Uri("http://localhost" + request.Parameters[SensolusConstants.PATH].Value <string>()); if (uri.Segments.Length <= 1) { return; } string context = uri.Segments[1].Replace("/", ""); if (!connCfgs.ContainsKey(context)) { return; } SensolusCfg cfg = connCfgs[context]; var query = System.Web.HttpUtility.ParseQueryString(uri.Query); DateTime start = DateTime.Now; DataProcessor dp = new DataProcessor(cfg); IDbTransaction transaction = null; string serial = ""; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); transaction = client.BeginTransaction(); //dp.FirstPhase(client); serial = request.Parameters[SensolusConstants.SERIAL]?.Value <string>(); FactActivity latestActivity = client.GetLatestActivity(serial); int halfMinutes = (int)Math.Ceiling((DateTime.Now - latestActivity.Evttime).TotalMinutes / 2); List <DimTracker> trackers = new List <DimTracker>(); DimTracker tracker = client.GetDimTracker(serial); if (tracker == default(DimTracker)) { dp.FirstPhase(client); tracker = client.GetDimTracker(serial); } trackers.Add(tracker); dp.SecondPhase(client, halfMinutes, trackers); dp.ThirdPhase(client, new string[] { serial }); transaction.Commit(); } } catch (SqlException e) { Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); transaction?.Rollback(); return; } catch (ArgumentException e) { //wrong SQL Connection string Serilog.Log.Error("Wrong SQL Connection string: " + $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password=*****"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } catch (Exception e) { Serilog.Log.Error("Unexpected error"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } TimeSpan duration = DateTime.Now - start; try { var connectionStringBuilder = NpgsqlFactory.Instance.CreateConnectionStringBuilder(); connectionStringBuilder.ConnectionString = $"Server={cfg.Host};Database={cfg.Database};User ID={cfg.User};Password={cfg.Password}"; using (DatabaseWrapper client = new DatabaseWrapper(NpgsqlFactory.Instance, connectionStringBuilder.ToString())) { client.Open(); IDbCommand cmd = client.CreateCommand(); cmd.CommandText = $"INSERT INTO log (ts, duration, reqcount, initevent, serial) VALUES ({SqlConvert.Convert(DateTime.Now)}, {duration.TotalMilliseconds}, {dp.api.Count}, 'PN', {SqlConvert.Convert(serial)})"; cmd.ExecuteNonQuery(); } } catch (Exception e) { Serilog.Log.Error("Could not make log record"); Serilog.Log.Error(e.Message); Serilog.Log.Error(e.StackTrace); return; } Serilog.Log.Information($"ts: {DateTime.Now}, duration: {duration.TotalMilliseconds}, reqCount: {dp.api.Count}, initevent: PN, serial: {serial}"); }