コード例 #1
0
        public void ConfigureCommands(IMqttApplicationBuilder mqttApplicationBuilder)
        {
            var topicHandlers = EntityConfigurations
                                .SelectMany(x => x.EntityConfiguration.CommandHandlers.Select(y => (configuration: x, commandHandler: y)))
                                .GroupBy(x => (topicPattern: x.commandHandler.GetTopicPattern(x.configuration.EntityConfiguration.EntityDefinition), qualityOfServiceLevel: x.configuration.EntityConfiguration.DiscoveryMessageQualityOfServiceLevel))
                                .ToDictionary(x => x.Key, x => x.ToArray());

            foreach (var topicHandler in topicHandlers)
            {
                var topicPattern          = topicHandler.Key.topicPattern;
                var qualityOfServiceLevel = topicHandler.Key.qualityOfServiceLevel;

                mqttApplicationBuilder.Map(
                    topicPattern,
                    async ctx =>
                {
                    var payload = ctx.GetPayloadAsString();

                    // Logger.LogInformation("> [{topic}] {payload}", ctx.Topic, payload);

                    foreach (var(cfg, handler) in topicHandler.Value)
                    {
                        var commandContext = new MqttCommandContext <TEntity, TEntityDefinition>(ctx, cfg.EntityConfiguration.Entity, cfg.EntityConfiguration.EntityDefinition);
                        var result         = await handler.ProcessCommand(commandContext, payload);
                        if (result)
                        {
                            return(true);
                        }
                    }

                    return(false);
                },
                    qualityOfServiceLevel);
            }
        }
コード例 #2
0
 public void ConfigureMqttApplication(IMqttApplicationBuilder mqttApplicationBuilder)
 {
     foreach (var ebm in this.EntityBindingManagers)
     {
         ebm.ConfigureCommands(mqttApplicationBuilder);
     }
 }
コード例 #3
0
        public static IMqttApplicationBuilder UseProcessor <TProcessor>(
            this IMqttApplicationBuilder mqttApplicationBuilder
            )
            where TProcessor : IMqttRequestProcessor
        {
            mqttApplicationBuilder.Use(async context =>
            {
                var processor = context.ServiceProvider.GetRequiredService <TProcessor>();
                return(await processor.ProcessRequest(context));
            });

            return(mqttApplicationBuilder);
        }
コード例 #4
0
        public static IMqttApplicationBuilder MapProcessor <TProcessor, TTopicParameters>(
            this IMqttApplicationBuilder mqttApplicationBuilder,
            string topicPattern,
            Func <TTopicParameters, bool> parametersPredicate = null,
            Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
            where TProcessor : IMqttRequestProcessor <TTopicParameters>
            where TTopicParameters : class, new()
        {
            var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator);

            return(mqttApplicationBuilder.Map(
                       topicPattern,
                       async context =>
            {
                if (topicBinder.IsMatch(context.Topic))
                {
                    TTopicParameters parameters;

                    try
                    {
                        parameters = topicBinder.Bind(context.Topic);
                    }
                    catch
                    {
                        return false;
                    }

                    if (parametersPredicate?.Invoke(parameters) ?? true)
                    {
                        var parameterizedContext = new MqttRequestContext <TTopicParameters>(context, parameters);
                        var processor = context.ServiceProvider.GetRequiredService <TProcessor>();
                        return await processor.ProcessRequest(parameterizedContext);
                    }
                }

                return false;
            },
                       qualityOfServiceLevel,
                       noLocal,
                       retainAsPublished,
                       retainHandling));
        }
コード例 #5
0
        public static IMqttApplicationBuilder Map <TTopicParameters>(
            this IMqttApplicationBuilder mqttApplicationBuilder,
            string topicPattern,
            MqttRequestDelegate <TTopicParameters> middleware,
            Func <TTopicParameters, bool> parametersPredicate = null,
            Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
            where TTopicParameters : class, new()
        {
            var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator);

            return(mqttApplicationBuilder.Map(
                       topicPattern,
                       async context =>
            {
                if (topicBinder.IsMatch(context.Topic))
                {
                    TTopicParameters parameters;

                    try
                    {
                        parameters = topicBinder.Bind(context.Topic);
                    }
                    catch
                    {
                        return false;
                    }

                    if (parametersPredicate?.Invoke(parameters) ?? true)
                    {
                        var ctx = new MqttRequestContext <TTopicParameters>(context, parameters);
                        return await middleware.Invoke(ctx);
                    }
                }

                return false;
            },
                       qualityOfServiceLevel,
                       noLocal,
                       retainAsPublished,
                       retainHandling));
        }
コード例 #6
0
 public static IMqttApplicationBuilder MapProcessor <TProcessor>(
     this IMqttApplicationBuilder mqttApplicationBuilder,
     string topicPattern,
     TProcessor processor,
     MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
     bool?noLocal                      = null,
     bool?retainAsPublished            = null,
     MqttRetainHandling?retainHandling = null
     )
     where TProcessor : IMqttRequestProcessor
 {
     return(mqttApplicationBuilder.Map(
                topicPattern,
                async context => await processor.ProcessRequest(context),
                qualityOfServiceLevel,
                noLocal,
                retainAsPublished,
                retainHandling));
 }
コード例 #7
0
 public static IMqttApplicationBuilder UseDefault(this IMqttApplicationBuilder mqttApplicationBuilder)
 {
     mqttApplicationBuilder.Use(_ => Task.FromResult(true));
     return(mqttApplicationBuilder);
 }
コード例 #8
0
 public void ConfigureMqttApplication(IMqttApplicationBuilder mqttApplicationBuilder)
 {
     mqttApplicationBuilder.Map(
         $"test/builder_{BuilderNumber}/build_{BuildCount++}",
         MqttRequestDelegateHelper.Throws(() => new Exception($"{InvocationCount++}")));
 }
 public void Configure(IMqttApplicationBuilder mqttApplicationBuilder)
 {
     ConfigureCommands(DeviceTriggerConfigurations, mqttApplicationBuilder);
     ConfigureCommands(LockConfigurations, mqttApplicationBuilder);
     ConfigureCommands(SwitchConfigurations, mqttApplicationBuilder);
 }
コード例 #10
0
 public void ConfigureMqttApplication(IMqttApplicationBuilder mqttApplicationBuilder)
 {
     Configurator?.Invoke(mqttApplicationBuilder);
 }