Пример #1
0
        public async Task ExecuteAsync(string clientId, IPacket input, IMqttChannel <IPacket> channel)
        {
            if (input.Type != MqttPacketType.Connect)
            {
                return;
            }

            var connect = input as Connect;

            if (!authenticationProvider.Authenticate(clientId, connect.UserName, connect.Password))
            {
                throw new MqttConnectionException(MqttConnectionStatus.BadUserNameOrPassword);
            }

            var session        = sessionRepository.Read(clientId);
            var sessionPresent = connect.CleanSession ? false : session != null;

            if (connect.CleanSession && session != null)
            {
                sessionRepository.Delete(session.Id);
                session = null;

                tracer.Info(Server.Properties.Resources.Server_CleanedOldSession, clientId);
            }

            var sendPendingMessages = false;

            if (session == null)
            {
                session = new ClientSession(clientId, connect.CleanSession);

                sessionRepository.Create(session);

                tracer.Info(Server.Properties.Resources.Server_CreatedSession, clientId);
            }
            else
            {
                sendPendingMessages = true;
            }

            if (connect.Will != null)
            {
                var connectionWill = new ConnectionWill(clientId, connect.Will);

                willRepository.Create(connectionWill);
            }

            await channel.SendAsync(new ConnectAck (MqttConnectionStatus.Accepted, sessionPresent))
            .ConfigureAwait(continueOnCapturedContext: false);

            if (sendPendingMessages)
            {
                await SendPendingMessagesAsync(session, channel)
                .ConfigureAwait(continueOnCapturedContext: false);
                await SendPendingAcknowledgementsAsync(session, channel)
                .ConfigureAwait(continueOnCapturedContext: false);
            }
        }
        public async Task ExecuteAsync(string clientId, IPacket input, IMqttChannel <IPacket> channel)
        {
            if (input.Type != MqttPacketType.Connect)
            {
                return;
            }

            Connect connect = input as Connect;

            if (!_authenticationProvider.Authenticate(clientId, connect.UserName, connect.Password))
            {
                throw new MqttConnectionException(MqttConnectionStatus.BadUserNameOrPassword);
            }

            ClientSession session        = _sessionRepository.Read(clientId);
            bool          sessionPresent = connect.CleanSession ? false : session != null;

            _tracer.Info($"Client connecting with protocol level {connect.ProtocolLelvel}.");

            if (connect.CleanSession && session != null)
            {
                _sessionRepository.Delete(session.Id);
                session = null;

                _tracer.Info(ServerProperties.Server_CleanedOldSession(clientId));
            }

            bool sendPendingMessages = false;

            if (session == null)
            {
                session = new ClientSession(clientId, connect.CleanSession);

                _sessionRepository.Create(session);

                _tracer.Info(ServerProperties.Server_CreatedSession(clientId));
            }
            else
            {
                sendPendingMessages = true;
            }

            if (connect.Will != null)
            {
                ConnectionWill connectionWill = new ConnectionWill(clientId, connect.Will);

                _willRepository.Create(connectionWill);
            }

            await channel.SendAsync(new ConnectAck( MqttConnectionStatus.Accepted, sessionPresent ));

            if (sendPendingMessages)
            {
                await SendPendingMessagesAsync(session, channel);
                await SendPendingAcknowledgementsAsync(session, channel);
            }
        }
Пример #3
0
        public async Task SendWillAsync(string clientId)
        {
            ConnectionWill will = _willRepository.Read(clientId);

            if (will != null && will.Will != null)
            {
                Publish willPublish = new Publish(will.Will.Topic, will.Will.QualityOfService, will.Will.Retain, duplicated: false)
                {
                    Payload = will.Will.Payload
                };

                _tracer.Info(ServerProperties.ServerPublishReceiverFlow_SendingWill(clientId, willPublish.Topic));

                await DispatchAsync(willPublish, clientId, isWill : true);
            }
        }