Exemple #1
0
        private void _createConnection(InvokeRequest request)
        {
            SensolusCfg cfg  = new SensolusCfg();
            string      name = request.Parameters["Name"].Value <String>();

            if (connCfgs.ContainsKey(name.ToLower()))
            {
                // ERROR
                return;
            }
            cfg.ApiKey   = request.Parameters["apiKey"].Value <String>();
            cfg.Host     = request.Parameters["DB Address"].Value <String>();
            cfg.Port     = request.Parameters["DB Port"].Value <int>();
            cfg.Database = request.Parameters["DB Name"].Value <String>();
            cfg.User     = request.Parameters["DB User"].Value <String>();
            cfg.Password = request.Parameters["DB Password"].Value <String>();
            cfg.Interval = request.Parameters["Interval (minutes)"].Value <int>();
            cfg.Pool     = request.Parameters["Pool"].Value <bool>();
            Task.Run(() =>
            {
                var copyCfg = cfg;
                if (request.Parameters["Old Data"].Value <bool>())
                {
                    copyCfg.Interval = (int)(DateTime.Now - new DateTime(1990, 1, 1)).TotalMinutes / 2;
                    copyCfg.Clean    = true;
                }
                DataProcessor dp = new DataProcessor(copyCfg);
                dp.Run(NpgsqlFactory.Instance);
                cfg.LastExecute = DateTime.Now;
                lock (connCfgs)
                {
                    connCfgs.Add(name.ToLower(), cfg);
                }
                SaveData();
            });
            Responder.SuperRoot.CreateChild(name, "connNode").BuildNode();
        }
Exemple #2
0
        public SensolusLink(Configuration config, CommandLineArguments cmdLineOptions) : base(config)
        {
            //Perform any configuration overrides from command line options
            if (cmdLineOptions.BrokerUrl != null)
            {
                config.BrokerUrl = cmdLineOptions.BrokerUrl;
            }

            if (cmdLineOptions.Token != null)
            {
                config.Token = cmdLineOptions.Token;
            }

            if (cmdLineOptions.NodesFileName != null)
            {
                config.NodesFilename = cmdLineOptions.NodesFileName;
            }

            if (cmdLineOptions.KeysFolder != null)
            {
                config.KeysFolder = cmdLineOptions.KeysFolder;
            }

            Responder.AddNodeClass("connNode", delegate(Node node)
            {
                node.CreateChild("Remove", "removeNode").BuildNode();
            });

            Responder.AddNodeClass("removeNode", delegate(Node node)
            {
                node.SetAction(new ActionHandler(Permission.Config, (InvokeRequest request) =>
                {
                    lock (connCfgs)
                    {
                        connCfgs.Remove(node.Parent.Name.ToLower());
                    }
                    SaveData();
                }));
            });

            Responder.AddNodeClass("handleActivity", delegate(Node node) {
                node.Configs.Set(ConfigType.DisplayName, new Value("Handle Activity Notification"));
                node.AddParameter(new Parameter {
                    Name      = SensolusConstants.PATH,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter {
                    Name      = SensolusConstants.SERIAL,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter {
                    Name      = SensolusConstants.ACTIVITY_ID,
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter {
                    Name      = SensolusConstants.ACTIVITY_TIME,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_INSERTTIME,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_STATE,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_LAT,
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_LON,
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_SRC,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_ACCURACY,
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_ADDRESS,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.ACTIVITY_GEOZONE,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.SetAction(new ActionHandler(Permission.Config, _handleActivityNotification));
            });

            Responder.AddNodeClass("handleAlert", delegate(Node node) {
                node.Configs.Set(ConfigType.DisplayName, new Value("Handle Alert Notification"));
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.PATH,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = SensolusConstants.SERIAL,
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.SetAction(new ActionHandler(Permission.Config, _handleAlertNotification));
            });

            Responder.AddNodeClass("connAdd", delegate(Node node)
            {
                node.Configs.Set(ConfigType.DisplayName, new Value("Add Connection"));
                node.AddParameter(new Parameter
                {
                    Name      = "Name",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = "apiKey",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = "DB Address",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = "DB Port",
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter
                {
                    Name      = "DB Name",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = "DB User",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.AddParameter(new Parameter
                {
                    Name      = "DB Password",
                    ValueType = DSLink.Nodes.ValueType.String,
                    Editor    = EditorType.Password
                });
                node.AddParameter(new Parameter
                {
                    Name      = "Interval (minutes)",
                    ValueType = DSLink.Nodes.ValueType.Number
                });
                node.AddParameter(new Parameter
                {
                    Name      = "Pool",
                    ValueType = DSLink.Nodes.ValueType.Boolean
                });
                node.AddParameter(new Parameter
                {
                    Name      = "Old Data",
                    ValueType = DSLink.Nodes.ValueType.Boolean
                });
                node.AddParameter(new Parameter
                {
                    Name      = "Context",
                    ValueType = DSLink.Nodes.ValueType.String
                });
                node.SetAction(new ActionHandler(Permission.Config, _createConnection));
            });

            Task.Run(() =>
            {
                long i = 0;
                while (true)
                {
                    lock (connCfgs)
                    {
                        foreach (var key in connCfgs.Keys)
                        {
                            var cfg = connCfgs[key];
                            if (i % cfg.Interval == 0)
                            {
                                Task.Run(() =>
                                {
                                    var copyCfg      = cfg;
                                    copyCfg.Clean    = false;
                                    DataProcessor dp = new DataProcessor(copyCfg);
                                    dp.Run(NpgsqlFactory.Instance);
                                    cfg.LastExecute = DateTime.Now;
                                    connCfgs[key]   = cfg;
                                });
                            }
                        }
                    }
                    ++i;
                    Thread.Sleep(TimeSpan.FromMinutes(1));
                }
            });
        }
Exemple #3
0
        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}");
        }
Exemple #4
0
        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}");
        }