예제 #1
0
        public LuGaMqtt(
            LuGaMqttConfig config,
            IRepository <Event> eventRepository)
        {
            this.eventRepository = eventRepository;

            var factory = new MqttFactory();

            var options = new ManagedMqttClientOptionsBuilder()
                          .WithAutoReconnectDelay(TimeSpan.FromSeconds(Constants.ReconnectDelay))
                          .WithClientOptions(new MqttClientOptionsBuilder()
                                             .WithClientId(config.ClientId)
                                             .WithTcpServer(config.Host, config.Port)
                                             .WithCredentials(config.Username, config.Password)
                                             .Build())
                          .Build();

            client = factory.CreateManagedMqttClient();

            client.ApplicationMessageReceived += (s, e) =>
            {
                if (e.ApplicationMessage.Topic.IndexOf(Constants.MessageTopic1, StringComparison.Ordinal) <= -1 ||
                    e.ApplicationMessage.Topic.IndexOf(Constants.MessageTopic2, StringComparison.Ordinal) != -1)
                {
                    return;
                }

                var pulled = e.ApplicationMessage.Topic.Split(Constants.SplitCharacter);

                var @event = new Event()
                {
                    DeviceId  = pulled[1],
                    Action    = pulled[3].Split("_").ElementAt(0),
                    Zone      = pulled[3].Split("_").ElementAt(1),
                    Value     = Encoding.UTF8.GetString(e.ApplicationMessage.Payload),
                    TimeStamp = DateTime.UtcNow
                };

                this.eventRepository.Add(@event);
            };

            client.Connected += async(s, e) =>
            {
                Debug.WriteLine(Constants.ConnectedOutput);
                await client.SubscribeAsync(
                    new TopicFilterBuilder()
                    .WithTopic(Constants.SubscribeTopic)
                    .Build()
                    );
            };

            client.Disconnected += (s, e) => {
                Debug.WriteLine(Constants.DisconnectedOutput);
            };

            Task.Run(() => Background(options));
        }
예제 #2
0
        static int Main(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;

            string environment = Environment.GetEnvironmentVariable(Constants.Environment);

            if (String.IsNullOrWhiteSpace(environment))
            {
                throw new ArgumentNullException("Environment not found in:" + Constants.Environment);
            }

            Debug.WriteLine("Environment: {0}", environment);

            // all passwords should be stored in
            // %APPDATA%\microsoft\UserSecrets\luga\secrets.json
            // https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?tabs=visual-studio

            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                          .AddJsonFile($"appsettings.{environment}.json", optional: true)
                          .AddEnvironmentVariables();

            if (environment != null && environment.Contains("Dev"))
            {
                builder.AddUserSecrets <Program>();
            }

            var cfg = builder.Build();

            var connectionString = cfg.GetConnectionString(Constants.ConnectionString);

            return((int)HostFactory.Run(x =>
            {
                var mqttConfig = new LuGaMqttConfig
                                 (
                    cfg[Constants.Username],
                    cfg[Constants.Password],
                    cfg[Constants.ClientId],
                    cfg[Constants.Host],
                    Convert.ToInt32(cfg[Constants.Port]));

                var eventsRepository = new EventsRepository(connectionString);

                x.Service(y => new LuGaMqtt(mqttConfig, eventsRepository));

                x.SetServiceName(Constants.ServiceName);
                x.SetDisplayName(Constants.ServiceName);
            }));
        }