예제 #1
0
        /// <inheritdoc cref="IMqttRepositoryGrain" />
        /// <summary>
        ///     Proceeds the disconnection for one client identifier.
        /// </summary>
        /// <param name="eventArgs">The event args.</param>
        /// <returns>A <see cref="Task" /> returning any asynchronous operation.</returns>
        /// <seealso cref="IMqttRepositoryGrain" />
        public async Task ProceedDisconnect(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            try
            {
                if (eventArgs == null)
                {
                    return;
                }

                // Save disconnect to the database
                var eventLog = new EventLog
                {
                    EventType    = EventType.Disconnect,
                    EventDetails = $"Disconnected: ClientId = {eventArgs.ClientId}, DisconnectType = {eventArgs.DisconnectType}."
                };

                await this.eventLogRepository.InsertEventLog(eventLog);

                // Handle disconnect in grain
                var mqttClientGrain = this.GrainFactory.GetGrain <IMqttClientGrain>(eventArgs.ClientId);
                mqttClientGrain.ProceedDisconnect(eventArgs);
            }
            catch (Exception ex)
            {
                this.logger.Error("An error occured: {ex}.", ex);
            }
        }
예제 #2
0
 internal void Server_ClientDisconnected(IMqttServerEx server, MqttServerClientDisconnectedEventArgs args)
 {
     Task.Run(async() =>
     {
         try
         {
             var dev = await FoundDevice(args.ClientId);
             if (dev != null)
             {
                 using (var scope = _scopeFactor.CreateScope())
                     using (var _dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>())
                     {
                         var devtmp        = _dbContext.Device.FirstOrDefault(d => d.Id == dev.Id);
                         devtmp.LastActive = DateTime.Now;
                         devtmp.Online     = false;
                         _dbContext.SaveChanges();
                         _logger.LogInformation($"Server_ClientDisconnected   ClientId:{args.ClientId} DisconnectType:{args.DisconnectType}  Device is {devtmp.Name }({devtmp.Id}) ");
                     }
             }
             else
             {
                 _logger.LogWarning($"Server_ClientDisconnected ClientId:{args.ClientId} DisconnectType:{args.DisconnectType}, 未能在缓存中找到");
             }
         }
         catch (Exception ex)
         {
             _logger.LogError(ex, $"Server_ClientDisconnected ClientId:{args.ClientId} DisconnectType:{args.DisconnectType},{ex.Message}");
         }
     });
 }
예제 #3
0
        public async Task Fire_Client_Disconnected_Event()
        {
            using (var testEnvironment = CreateTestEnvironment())
            {
                var server = await testEnvironment.StartServer();

                MqttServerClientDisconnectedEventArgs eventArgs = null;
                server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
                {
                    eventArgs = e;
                });

                var client = await testEnvironment.ConnectClient(o => o.WithCredentials("TheUser"));

                await client.DisconnectAsync();

                await LongTestDelay();

                Assert.IsNotNull(eventArgs);

                Assert.IsTrue(eventArgs.ClientId.StartsWith(nameof(Fire_Client_Disconnected_Event)));
                Assert.IsTrue(eventArgs.Endpoint.Contains("127.0.0.1"));
                Assert.AreEqual(MqttClientDisconnectType.Clean, eventArgs.DisconnectType);
            }
        }
예제 #4
0
 internal void Server_ClientDisconnected(IMqttServerEx server, MqttServerClientDisconnectedEventArgs args)
 {
     try
     {
         if (_device.Exists(args.ClientId))
         {
             var _xdev = _device.Get <Device>(args.ClientId);
             var dev   = _xdev.Value;
             using (var scope = _scopeFactor.CreateScope())
                 using (var _dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>())
                 {
                     var devtmp = _dbContext.Device.FirstOrDefault(d => d.Id == dev.Id);
                     devtmp.LastActive = DateTime.Now;
                     _dbContext.SaveChanges();
                     _logger.LogInformation($"Server_ClientDisconnected   ClientId:{args.ClientId} DisconnectType:{args.DisconnectType}  Device is {devtmp.Name }({devtmp.Id}) ");
                 }
         }
         else
         {
             _logger.LogWarning($"Server_ClientDisconnected ClientId:{args.ClientId} DisconnectType:{args.DisconnectType}, 未能在缓存中找到");
         }
     }
     catch (Exception ex)
     {
         _logger.LogError(ex, $"Server_ClientDisconnected ClientId:{args.ClientId} DisconnectType:{args.DisconnectType},{ex.Message}");
     }
 }
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            System.Console.WriteLine($"Disconnected: {eventArgs.ClientId}");
            var zigbeeClientId = _zigbeeSettings.Id;
            var hubClientId    = _clientSettings.Id;

            if (eventArgs.ClientId != zigbeeClientId && eventArgs.ClientId != hubClientId)
            {
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var mediator = scope.ServiceProvider.GetService <IMediator>();
                    var device   = await mediator.Send(new GetMqttDeviceByIdQuery()
                    {
                        Id = eventArgs.ClientId
                    });

                    await mediator.Send(
                        new UpdateMqttDeviceCommand()
                    {
                        Id = device.Id, isAvailable = false, isConfirmed = device.IsConfirmed
                    });

                    await _mqttServer.PublishAsync(_brokerEvents.NewClientDisconnected, eventArgs.ClientId);
                }
            }
        }
예제 #6
0
 public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     var serializedData = Utf8Json.JsonSerializer.Serialize(new { ClientId = eventArgs.ClientId });
     var message        = new MqttApplicationMessageBuilder().WithTopic(eventTopics.NewClientDisconnected)
                          .WithPayload(serializedData)
                          .Build();
     await mqttServer.PublishAsync(message);
 }
예제 #7
0
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            lbxMessage.BeginInvoke(this.updateListBoxAction, $"<Client DisConnected:ClientId:{eventArgs.ClientId}");

            var s = await this.mqttServer.GetClientStatusAsync();

            this.sslMessage.Text = $"總連接數:{s.Count}";
        }
예제 #8
0
        private Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            EventId eventId = GetNextEventId();

            _logger.LogInformation(eventId, $"Client disconnected (Id: {eventArgs.ClientId})");

            return(Task.CompletedTask);
        }
예제 #9
0
 public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     client--;
     if (client < 1)
     {
         mqtt.StopAsync();
     }
     return(Task.FromResult(true));
 }
예제 #10
0
 internal void Server_ClientDisconnected(IMqttServerEx server, MqttServerClientDisconnectedEventArgs args)
 {
     try
     {
         Devices.Remove(args.ClientId);
     }
     catch (Exception)
     {
     }
 }
예제 #11
0
 /// <inheritdoc cref="IMqttClientGrain" />
 /// <summary>
 /// Proceeds the disconnection message for one client identifier.
 /// </summary>
 /// <param name="eventArgs">The event args.</param>
 /// <seealso cref="IMqttClientGrain" />
 public void ProceedDisconnect(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     try
     {
         this.users.Remove(eventArgs.ClientId);
     }
     catch (Exception ex)
     {
         this.logger.Error("An error occured: {ex}.", ex);
     }
 }
예제 #12
0
        /// <summary>
        ///     Handles the disconnect event.
        /// </summary>
        /// <param name="eventArgs">The MQTT client unsubscribed event args.</param>
        private void HandleDisconnect(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            if (this.cancellationToken.IsCancellationRequested)
            {
                return;
            }

            var repositoryGrain = this.clusterClient.GetGrain <IMqttRepositoryGrain>(0);

            repositoryGrain.ProceedDisconnect(eventArgs);
        }
예제 #13
0
 internal void Server_ClientDisconnected(object sender, MqttServerClientDisconnectedEventArgs e)
 {
     Task.Run(async() =>
     {
         var svr = ((IMqttServer)sender);
         var lst = await svr?.GetSessionStatusAsync();
         if (_sessions.ContainsKey(e.ClientId))
         {
             _sessions.Remove(e.ClientId);
         }
     });
 }
예제 #14
0
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            var message = new MqttDisconnectMessage()
            {
                ClientId = eventArgs.ClientId,
            };

            if (string.Equals(message.ClientId, _configuration.GetSection("MQTT").GetSection("MqttClientEnactorName").Value) == false)
            {
                await _endpoint.Request <HttpStatusCode>(message).ConfigureAwait(false);
            }
        }
예제 #15
0
 /// <summary>
 /// Validates the MQTT client disconnect.
 /// </summary>
 /// <param name="eventArgs">The event args.</param>
 /// <returns>A <see cref="Task"/> representing any asynchronous operation.</returns>
 public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     try
     {
         var repositoryGrain = clusterClient.GetGrain <IMqttRepositoryGrain>(0);
         await repositoryGrain.ProceedDisconnect(eventArgs);
     }
     catch (Exception ex)
     {
         this.logger.Error("An error occurred: {@ex}.", ex);
     }
 }
예제 #16
0
 public static void ClientDisconnectedHandler(MqttServerClientDisconnectedEventArgs args)
 {
     try
     {
         var clientID = args.ClientId;
         var mqttClientDisconnectType = args.DisconnectType;
     }
     catch (Exception ex)
     {
         mqttServiceLogger.LogError(ex.Message);
     }
 }
        public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs context)
        {
            try
            {
                _logger.LogInformation($"Client disconnected: {context.ClientId}, Disconnect Type: {context.DisconnectType}");
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Error while handling client disconnected event.");
            }

            return(Task.CompletedTask);
        }
예제 #18
0
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            _logger.LogInformation($"Client: {eventArgs.ClientId} disconnected!");

            var message = new MqttApplicationMessageBuilder()
                          .WithTopic($"clients/{eventArgs.ClientId}/disconnect")
                          .WithPayload(eventArgs.ClientId)
                          .WithExactlyOnceQoS()
                          .WithContentType("client_event")
                          .Build();

            await this._mqttServer.PublishAsync(message);
        }
예제 #19
0
        /// <summary>
        ///     Fired when a client disconnects
        /// </summary>
        /// <param name="eventArgs">MqttServerClientDisconnectedEventArgs</param>
        /// <returns>Task</returns>
        public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            // Ignore uncategorized nodes / UI clients
            if (!nodeStates.TryRemove(eventArgs.ClientId, out var state) || state == null)
            {
                return(Task.CompletedTask);
            }

            Helper.Log(new LogMessage(LogSeverity.Info, nameof(MqttService), $"Disconnected from client {eventArgs.ClientId}"));
            state.IsActive = false;
            Helper.SendClientStatus(mqtt, eventArgs.ClientId, state).GetAwaiter().GetResult();
            Helper.SendConnectedClients(mqtt, nodeStates).GetAwaiter().GetResult();
            return(Task.CompletedTask);
        }
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            Debug.WriteLine($"Client disconnected {eventArgs.ClientId}");
            await _mqttServer.ClearRetainedApplicationMessagesAsync();

            try
            {
                await _restClient.DisableLightPoint(Guid.Parse(eventArgs.ClientId));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
예제 #21
0
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            var clientStatus = await mqttServer.GetClientStatusAsync();

            var client = clientStatus.Where(c => c.ClientId == eventArgs.ClientId).FirstOrDefault();

            if (client == null)
            {
                Publisher publisher;
                if (publishers.Remove(eventArgs.ClientId, out publisher))
                {
                    publisher.DeregisterAll();
                }
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
예제 #22
0
        public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            try
            {
                var pythonEventArgs = new PythonDictionary
                {
                    { "client_id", eventArgs.ClientId },
                    { "type", PythonConvert.Pythonfy(eventArgs.DisconnectType) }
                };

                _pythonScriptHostService.InvokeOptionalFunction("on_client_disconnected", pythonEventArgs);
            }
            catch (Exception exception)
            {
                _logger.LogError(exception, "Error while handling client disconnected event.");
            }

            return(Task.CompletedTask);
        }
        public async Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            if (string.IsNullOrEmpty(eventArgs.ClientId))
            {
                await Task.CompletedTask;
            }

            var message = new MqttApplicationMessageBuilder()
                          .WithTopic($"disconnected/{eventArgs.ClientId}")
                          .WithPayload(eventArgs.ClientId)
                          .WithExactlyOnceQoS()
                          .Build();

            await _mqttServer.PublishAsync(message);

            _logger.LogInformation($"Device disconnected - {eventArgs.ClientId}, {eventArgs.DisconnectType} ");

            await Task.CompletedTask;
        }
예제 #24
0
        /// <inheritdoc cref="IMqttRepositoryGrain" />
        /// <summary>
        ///     Proceeds the disconnection for one client identifier.
        /// </summary>
        /// <param name="eventArgs">The event args.</param>
        /// <returns>A <see cref="Task" /> returning any asynchronous operation.</returns>
        /// <seealso cref="IMqttRepositoryGrain" />
        public Task ProceedDisconnect(MqttServerClientDisconnectedEventArgs eventArgs)
        {
            if (eventArgs == null)
            {
                throw new ArgumentNullException(nameof(eventArgs));
            }

            if (string.IsNullOrWhiteSpace(eventArgs.ClientId))
            {
                throw new ArgumentNullException(nameof(eventArgs.ClientId));
            }

            // Save disconnect to the database
            var eventLog = new EventLog
            {
                EventType    = EventType.Disconnect,
                EventDetails = $"Disconnected: ClientId = {eventArgs.ClientId}, DisconnectType = {eventArgs.DisconnectType}."
            };

            this.eventLogQueue.Enqueue(eventLog);

            return(Task.CompletedTask);
        }
        /// <summary>
        /// 客户连接断开
        /// </summary>
        private void MqttNetServer_ClientDisConnected(MqttServerClientDisconnectedEventArgs e)
        {
            string ClientId = e.ClientId;

            log.LogInformation($"client [{ClientId}] disconnected");
        }
예제 #26
0
 public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     Disconnected?.Invoke(this, eventArgs);
     return(null);
 }
예제 #27
0
 private void OnDisconnected(MqttServerClientDisconnectedEventArgs e)
 {
     Console.WriteLine("Client Disconnected:" + e.ClientId);
     clientSession.Remove(e.ClientId);
 }
예제 #28
0
        /// <summary>
        /// 客户连接断开
        /// </summary>
        /// <param name="e"></param>
        private static void MqttNetServer_ClientDisConnected(MqttServerClientDisconnectedEventArgs e)
        {
            var ClientId = e.ClientId;

            Console.WriteLine($"客户端[{ClientId}]已断开连接");
        }
예제 #29
0
 private static Task ClientDisconnectedHandler(MqttServerClientDisconnectedEventArgs arg)
 {
     //Console.WriteLine($"Client {arg.ClientId} disconnected");
     return(Task.FromResult(12));
 }
 public Task HandleClientDisconnectedAsync(MqttServerClientDisconnectedEventArgs eventArgs)
 {
     _logger.LogInformation($"Client Disconnect {eventArgs.ClientId} , {eventArgs.DisconnectType}");
     return(Task.CompletedTask);
 }