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); } }
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); } }