Esempio n. 1
0
 public void Notify(NetworkDeviceFoundMessage message)
 {
     _log.Info($"{message.GetType().Name} received with {message.Protocol}: IP={message.IpAddress} MAC={message.MacAddress.MacAddressToString()}");
 }
        private async Task UpnpDeviceFound(DiscoveredSsdpDevice device)
        {
            try
            {
                UpnpDeviceResponse response;

                using (await _lock.LockAsync())
                {
                    response = await CreateUpnpDeviceAsync(device);

                    if (response == null)
                    {
                        return;
                    }

                    var key = $"{device.DescriptionLocation.Host}/{response.Usn}";

                    DateTime lastOccurrence;
                    if (_occurrences.TryGetValue(key, out lastOccurrence))
                    {
                        if ((DateTime.UtcNow - lastOccurrence) < TimeSpan.FromMinutes(5))
                        {
                            return;
                        }
                    }

                    _occurrences.AddOrUpdate(key, DateTime.UtcNow, (k, v) => DateTime.UtcNow);
                }

                var message = new NetworkDeviceFoundMessage("UPNP", response.IpAddress, new byte[0], response.FriendlyName);
                message.Values.Add("Location", response.Location);
                message.Values.Add("Manufacturer", response.Manufacturer);
                message.Values.Add("ModelName", response.ModelName);
                message.Values.Add("Server", response.Server);
                message.Values.Add("USN", response.Usn);

                foreach (var pair in response.OtherHeaders)
                {
                    if (!message.Values.ContainsKey(pair.Key))
                    {
                        message.Values.Add(pair);
                    }
                }

                _messageQueue.Publish(message);
            }
            catch (HttpRequestException)
            {
            }
            catch (WebException)
            {
            }
            catch (TaskCanceledException)
            {
                _log.Error($"TaskCanceledException for device {device.DescriptionLocation.OriginalString}");
            }
            catch (XmlException e)
            {
                _log.Error($"Xml exception in {device.DescriptionLocation.OriginalString}: {e.Message}");
            }
            catch (Exception e)
            {
                _log.Error(e.Message, e);
            }
        }