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);
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); } } );
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); }
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); }
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 ) { }
public void WriteMaximumQoS(MqttQualityOfServiceLevel?value) { if (!value.HasValue || value.Value > MqttQualityOfServiceLevel.AtLeastOnce) { return; } _packetWriter.Write((byte)MqttPropertyId.MaximumQoS); _packetWriter.Write((byte)value.Value); }
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)); }
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 );
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)); }
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); }
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); }
private string GetRequestTopic(string source, MqttQualityOfServiceLevel?qos) { return((source.IsNullOrEmpty() ? "" : $"from/{source}") + $"/rpc/to/{ServerId}/" + (qos == null ? "" : $"qos{(int) qos.Value}")); }