Ejemplo n.º 1
0
 protected override IAlarmControlPanelMqttEntityConfiguration Build(
     IAlarmControlPanel entity,
     IAlarmControlPanelEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessage,
     ICommandHandler <IAlarmControlPanel, IAlarmControlPanelEntityDefinition>[] commandHandlers,
     MqttQualityOfServiceLevel?stateMessageQualityOfServiceLevel,
     bool retainStateMessages,
     IStateChangeHandler <IAlarmControlPanel, IAlarmControlPanelEntityDefinition>[] stateChangeHandlers
     )
 => new AlarmControlPanelMqttEntityConfiguration(
     entity,
     entityDefinition,
     discoveryTopic,
     discoveryMessage,
     deleteMessage,
     discoveryMessageQualityOfServiceLevel,
     retainDiscoveryMessage,
     commandHandlers,
     stateMessageQualityOfServiceLevel,
     retainStateMessages,
     stateChangeHandlers);
Ejemplo n.º 2
0
        private IDisposable BindObserver(
            IMqttMessageBus target,
            TEntity entity,
            TEntityDefinition entityDefinition,
            MqttQualityOfServiceLevel?qualityOfServiceLevel,
            bool retainMessages)
        => GetStateChangeDetector(entity)
        .Subscribe(
            state =>
        {
            var payload = GetStateMessagePayload(entityDefinition, entity);

            var messageBuilder = new MqttApplicationMessageBuilder()
                                 .WithTopic(entityDefinition.StateTopic)
                                 .WithPayload(payload)
                                 .WithRetainFlag(retainMessages);

            if (qualityOfServiceLevel.HasValue)
            {
                messageBuilder = messageBuilder.WithQualityOfServiceLevel(qualityOfServiceLevel.Value);
            }

            var message = messageBuilder.Build();

            if (message.Payload != null)
            {
                target.PublishMessage(message);
            }
        }
            );
Ejemplo n.º 3
0
        private MqttTopicFilter CreateTopicFilter(
            string topic,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
        {
            var result = new MqttTopicFilter
            {
                Topic = TopicFilterSanitizer.SanitizeTopic(topic)
            };

            if (qualityOfServiceLevel.HasValue)
            {
                result.QualityOfServiceLevel = qualityOfServiceLevel.Value;
            }

            if (noLocal.HasValue)
            {
                result.NoLocal = noLocal.Value;
            }

            if (retainAsPublished.HasValue)
            {
                result.RetainAsPublished = retainAsPublished.Value;
            }

            if (retainHandling.HasValue)
            {
                result.RetainHandling = retainHandling.Value;
            }

            return(result);
        }
Ejemplo n.º 4
0
        public IMqttApplicationBuilder Map(
            string topicPattern,
            MqttRequestDelegate middleware,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
        {
            var topicFilter = CreateTopicFilter(topicPattern, qualityOfServiceLevel, noLocal, retainAsPublished, retainHandling);

            TopicFilters.Add(
                topicFilter,
                async context =>
            {
                if (IsMatch(topicFilter, context))
                {
                    return(await middleware.Invoke(context));
                }

                return(false);
            }
                );

            return(this);
        }
Ejemplo n.º 5
0
 protected BaseMqttStatefulEntityConfiguration(
     TEntity entity,
     TEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessage,
     ICommandHandler <TEntity, TEntityDefinition>[] commandHandlers,
     MqttQualityOfServiceLevel?stateMessageQualityOfServiceLevel,
     bool retainStateMessages,
     IStateChangeHandler <TEntity, TEntityDefinition>[] stateChangeHandlers
     )
     : base(
         entity,
         entityDefinition,
         discoveryTopic,
         discoveryMessage,
         deleteMessage,
         discoveryMessageQualityOfServiceLevel,
         retainDiscoveryMessage,
         commandHandlers
         )
 {
     StateMessageQualityOfServiceLevel = stateMessageQualityOfServiceLevel;
     RetainStateMessages = retainStateMessages;
     StateChangeHandlers = stateChangeHandlers ?? throw new ArgumentNullException(nameof(stateChangeHandlers));
 }
 public FanMqttEntityConfiguration(
     IFan entity,
     IFanEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessage,
     ICommandHandler <IFan, IFanEntityDefinition>[] commandHandlers,
     MqttQualityOfServiceLevel?stateMessageQualityOfServiceLevel,
     bool retainStateMessages,
     IStateChangeHandler <IFan, IFanEntityDefinition>[] stateChangeHandlers
     )
     : base(
         entity,
         entityDefinition,
         discoveryTopic,
         discoveryMessage,
         deleteMessage,
         discoveryMessageQualityOfServiceLevel,
         retainDiscoveryMessage,
         commandHandlers,
         stateMessageQualityOfServiceLevel,
         retainStateMessages,
         stateChangeHandlers
         )
 {
 }
Ejemplo n.º 7
0
        public void WriteMaximumQoS(MqttQualityOfServiceLevel?value)
        {
            if (!value.HasValue || value.Value > MqttQualityOfServiceLevel.AtLeastOnce)
            {
                return;
            }

            _packetWriter.Write((byte)MqttPropertyId.MaximumQoS);
            _packetWriter.Write((byte)value.Value);
        }
Ejemplo n.º 8
0
 public IDisposable Bind(
     IMqttMessageBus target,
     TEntity entity,
     TEntityDefinition entityDefinition,
     MqttQualityOfServiceLevel?qualityOfServiceLevel,
     bool retainMessages
     ) =>
 BindObserver(
     target,
     entity,
     entityDefinition,
     qualityOfServiceLevel,
     retainMessages
     );
        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));
        }
        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));
        }
 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));
 }
Ejemplo n.º 12
0
 private ICameraMqttEntityConfiguration Build(
     ICamera entity,
     ICameraEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessages,
     ICommandHandler <ICamera, ICameraEntityDefinition>[] commandHandlers)
 => new CameraMqttEntityConfiguration(
     entity,
     entityDefinition,
     discoveryTopic,
     discoveryMessage,
     deleteMessage,
     discoveryMessageQualityOfServiceLevel,
     retainDiscoveryMessages,
     commandHandlers
     );
Ejemplo n.º 13
0
 protected BaseMqttEntityConfiguration(
     TEntity entity,
     TEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessage,
     ICommandHandler <TEntity, TEntityDefinition>[] commandHandlers
     )
 {
     Entity           = entity ?? throw new ArgumentNullException(nameof(entity));
     EntityDefinition = entityDefinition ?? throw new ArgumentNullException(nameof(entityDefinition));
     DiscoveryTopic   = discoveryTopic ?? throw new ArgumentNullException(nameof(discoveryTopic));
     DiscoveryMessage = discoveryMessage ?? throw new ArgumentNullException(nameof(discoveryMessage));
     DeleteMessage    = deleteMessage ?? throw new ArgumentNullException(nameof(deleteMessage));
     DiscoveryMessageQualityOfServiceLevel = discoveryMessageQualityOfServiceLevel;
     RetainDiscoveryMessage = retainDiscoveryMessage;
     CommandHandlers        = commandHandlers ?? throw new ArgumentNullException(nameof(commandHandlers));
 }
Ejemplo n.º 14
0
 public DeviceTriggerMqttEntityConfiguration(
     IDeviceTrigger entity,
     IDeviceTriggerEntityDefinition entityDefinition,
     string discoveryTopic,
     MqttApplicationMessage discoveryMessage,
     MqttApplicationMessage deleteMessage,
     MqttQualityOfServiceLevel?discoveryMessageQualityOfServiceLevel,
     bool retainDiscoveryMessage,
     ICommandHandler <IDeviceTrigger, IDeviceTriggerEntityDefinition>[] commandHandlers
     )
     : base(
         entity,
         entityDefinition,
         discoveryTopic,
         discoveryMessage,
         deleteMessage,
         discoveryMessageQualityOfServiceLevel,
         retainDiscoveryMessage,
         commandHandlers
         )
 {
 }
 /// <inheritdoc cref="IMqttConsumerEndpointBuilder.WithAtLeastOnceQoS" />
 public IMqttConsumerEndpointBuilder WithAtLeastOnceQoS()
 {
     _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce;
     return(this);
 }
Ejemplo n.º 16
0
 public TSelfInterface WithStateMessageQualityOfServiceLevel(MqttQualityOfServiceLevel?stateMessageQualityOfServiceLevel)
 {
     StateMessageQualityOfServiceLevel = stateMessageQualityOfServiceLevel;
     return((TSelf)this);
 }
 /// <inheritdoc cref="IMqttProducerEndpointBuilder.WithExactlyOnceQoS" />
 public IMqttProducerEndpointBuilder WithExactlyOnceQoS()
 {
     _qualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce;
     return(this);
 }
 /// <inheritdoc cref="IMqttProducerEndpointBuilder.WithQualityOfServiceLevel" />
 public IMqttProducerEndpointBuilder WithQualityOfServiceLevel(MqttQualityOfServiceLevel qosLevel)
 {
     _qualityOfServiceLevel = qosLevel;
     return(this);
 }
Ejemplo n.º 19
0
 private string GetRequestTopic(string source, MqttQualityOfServiceLevel?qos)
 {
     return((source.IsNullOrEmpty() ? "" : $"from/{source}") + $"/rpc/to/{ServerId}/" + (qos == null ? "" : $"qos{(int) qos.Value}"));
 }