/// <summary>
        /// Initializes a new instance of the <see cref="SsdpServerPublisher"/> class.
        /// </summary>
        /// <param name="configuration">The <see cref="IConfigurationManager"/> instance.</param>
        /// <param name="logger">The <see cref="ILogger"/> instance.</param>
        /// <param name="loggerFactory">The <see cref="ILoggerFacory"/> instance.</param>
        /// <param name="networkManager">The <see cref="INetworkManager"/> instance.</param>
        /// <param name="interfaces">The interfaces IP's to advertise on.</param>
        /// <param name="messageInterval">The discovery message interval.</param>
        /// <param name="enableWindowsSupport">True to enable windows support.</param>
        public SsdpServerPublisher(
            IConfigurationManager configuration,
            ILogger logger,
            ILoggerFactory loggerFactory,
            INetworkManager networkManager,
            IPNetAddress[] interfaces,
            int messageInterval,
            bool enableWindowsSupport)
        {
            _aliveMessageInterval = messageInterval;
            _devices              = new List <SsdpRootDevice>();
            _logger               = logger;
            _networkManager       = networkManager;
            _random               = new Random();
            _readOnlyDevices      = new ReadOnlyCollection <SsdpRootDevice>(_devices);
            _recentSearchRequests = new Dictionary <string, SearchRequest>(StringComparer.OrdinalIgnoreCase);

            Server = SsdpServer.GetOrCreateInstance(
                configuration,
                loggerFactory,
                interfaces,
                networkManager);

            DlnaServerPlugin.Instance !.ConfigurationChanging += UpdateConfiguration;
            _networkManager.NetworkChanged += NetworkChanged;
            EnableWindowsExplorerSupport    = enableWindowsSupport;

            _logger.LogDebug("DLNA Server : Starting DLNA advertisements using DLNA version {Version}", Server.DlnaVersion.ToString());
        }
Exemple #2
0
        static void Main(string[] args)
        {
            SsdpServer ssdp = new SsdpServer();

            ssdp.Start();

            //foreach (string deviceUrl in ssdp.Discover())
            //    Console.WriteLine(deviceUrl);


            string udn = "uuid:" + Guid.NewGuid();

            ssdp.RegisterDevice(new SsdpDevice {
                Type = DeviceType.InternetGatewayDevice, Name = "MyControl" + DateTime.Now.Second, UDN = udn
            });

            Thread.Sleep(5000);

            Console.WriteLine("Searching for all devices...");

            foreach (string deviceUrl in ssdp.Discover())
            {
                Console.WriteLine(deviceUrl);
            }

            Console.WriteLine("Waiting for requests (M-SEARCH)...");
            Thread.Sleep(20 * 1000);

            ssdp.UnregisterDevice(udn);

            Console.WriteLine("Unregister done.");

            Console.ReadLine();
        }
Exemple #3
0
        public void RootDeviceAsyncSearchTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    server.CreateAnnouncer("upnp:rootdevice", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::upnp:rootdevice");
                    server.StartListening();

                    client.StartListening();

                    var search = client.CreateSearch(false);
                    search.SearchType   = "upnp:rootdevice";
                    search.ResultFound += RootResultFound;

                    lock (mutex)
                    {
                        search.SearchAsync();

                        if (!Monitor.Wait(mutex, TimeSpan.FromSeconds(30)))
                        {
                            Assert.Fail("The announcement timed out.");
                        }
                    }
                }
        }
Exemple #4
0
        public void FilteredAnnouncementTest2()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    client.Filter = message => message.Type == "urn:schemas-upnp-org:service:test:1";
                    client.StartListening();

                    client.ServiceFound += (sender, args) =>
                    {
                        lock (mutex)
                        {
                            if (args.Value.Type != "urn:schemas-upnp-org:service:test:1")
                            {
                                Monitor.Pulse(mutex);
                            }
                        }
                    };


                    lock (mutex)
                    {
                        server.CreateAnnouncer("upnp:test:fail", "uuid:upnp-tests:test1");
                        server.CreateAnnouncer("upnp", "uuid:upnp-tests:test2");
                        server.CreateAnnouncer("urn:schemas-upnp-org:service:test:1", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::urn:schemas-upnp-org:service:test:1");
                        server.StartListening();

                        if (Monitor.Wait(mutex, TimeSpan.FromSeconds(10)))
                        {
                            Assert.Fail("The client recieved invalid announcements.");
                        }
                    }
                }
        }
Exemple #5
0
        public void AsyncSearchTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    server.CreateAnnouncer("urn:schemas-upnp-org:service:test:1", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::urn:schemas-upnp-org:service:test:1");
                    server.StartListening();

                    client.StartListening();

                    var search = client.CreateSearch(false);
                    search.SearchType   = "urn:schemas-upnp-org:service:test:1";
                    search.ResultFound += (sender, e) =>
                    {
                        lock (mutex)
                        {
                            if (IsTestAnnouncement(e.Value))
                            {
                                Monitor.Pulse(mutex);
                            }
                        }
                    };

                    lock (mutex)
                    {
                        search.SearchAsync();

                        if (!Monitor.Wait(mutex, TimeSpan.FromSeconds(30)))
                        {
                            Assert.Fail("The announcement timed out.");
                        }
                    }
                }
        }
Exemple #6
0
        public UpnpServer(UpnpRoot root, SsdpServer ssdp = null, GenaServer gena = null)
        {
            this.Root = root;
            this.Root.ChildDeviceAdded += OnChildDeviceAdded;
            this.SsdpServer             = ssdp ?? new SsdpServer();
            this.GenaServer             = gena ?? new GenaServer();

            BuildAdvertisements();
        }
 public Task InitializeAsync(string serverAddress, string deviceAddress, IDataLibrary dataLibrary, IHttpServer httpServer)
 {
     return(Task.Factory.StartNew(() => {
         this.httpServer = httpServer as HttpServer;
         IPAddress pAddress = IPAddress.Parse(serverAddress);
         Uri uri = new Uri(string.Concat(httpServer.ServerUrl, "/description.xml"));
         this.ssdpServer = new SsdpServer();
         this.ssdpServer.RegisterNotification(DlnaServer.ServerGuid, uri, pAddress);
         this.httpServer.AddHandler(new DescriptionHandler());
         this.httpServer.AddHandler(new ContentDirectoryHandler());
         this.httpServer.AddHandler(new ControlHandler(httpServer, dataLibrary));
         this.httpServer.AddHandler(new FileHandler(dataLibrary));
         this.httpServer.AddHandler(new CoverHandler(dataLibrary));
     }));
 }
Exemple #8
0
        public void SearchTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    server.CreateAnnouncer("urn:schemas-upnp-org:service:test:1", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::urn:schemas-upnp-org:service:test:1");
                    server.StartListening();

                    client.StartListening();

                    var search  = client.CreateSearch(false);
                    var results = search.Search();
                    Assert.That(results.Exists(IsTestAnnouncement));
                }
        }
Exemple #9
0
        public void RootDeviceSearchTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    server.CreateAnnouncer("upnp:rootdevice", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::upnp:rootdevice");
                    server.StartListening();
                    client.StartListening();

                    var search = client.CreateSearch(false);
                    search.SearchType = "upnp:rootdevice";
                    var results = search.Search();
                    Assert.AreEqual(0, results.Count(msg => msg.Type != "upnp:rootdevice"));
                    Assert.That(results.Exists(IsRootAnnouncement));
                }
        }
Exemple #10
0
        public void SynchronousAnnouncementTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    client.Filter = message => message.Type == "urn:schemas-upnp-org:service:test:1";
                    client.StartListening();

                    server.CreateAnnouncer("urn:schemas-upnp-org:service:test:1", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::urn:schemas-upnp-org:service:test:1");
                    server.StartListening();

                    var result = client.FindFirst(TimeSpan.FromSeconds(30));
                    Assert.IsNotNull(result);
                    Assert.That(IsTestAnnouncement(result));
                }
        }
Exemple #11
0
        public void AnnoucementTest()
        {
            using (var client = new SsdpClient())
                using (var server = new SsdpServer())
                {
                    client.ServiceFound += TestResultFound;
                    client.StartListening();

                    lock (mutex)
                    {
                        server.CreateAnnouncer("urn:schemas-upnp-org:service:test:1", "uuid:979F4CE8-64AF-4653-B207-D7514908356F::urn:schemas-upnp-org:service:test:1");
                        server.StartListening();

                        if (!Monitor.Wait(mutex, TimeSpan.FromSeconds(30)))
                        {
                            Assert.Fail("The announcement timed out.");
                        }
                    }
                }
        }
Exemple #12
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SsdpServerPublisher"/> class.
        /// </summary>
        /// <param name="dlnaServerManager">The <see cref="IDlnaServerManager"/> instance.</param>
        /// <param name="configuration">The <see cref="IConfigurationManager"/> instance.</param>
        /// <param name="logger">The <see cref="ILogger"/> instance.</param>
        /// <param name="loggerFactory">The <see cref="ILoggerFacory"/> instance.</param>
        /// <param name="networkManager">The <see cref="INetworkManager"/> instance.</param>
        public SsdpServerPublisher(
            IDlnaServerManager dlnaServerManager,
            IConfigurationManager configuration,
            ILogger logger,
            ILoggerFactory loggerFactory,
            INetworkManager networkManager)
        {
            _dlnaServerManager    = dlnaServerManager;
            _networkManager       = networkManager;
            _logger               = logger;
            _devices              = new List <SsdpRootDevice>();
            _readOnlyDevices      = new ReadOnlyCollection <SsdpRootDevice>(_devices);
            _recentSearchRequests = new Dictionary <string, SearchRequest>(StringComparer.OrdinalIgnoreCase);
            _random               = new Random();

            Server = SsdpServer.GetOrCreateInstance(
                configuration,
                loggerFactory,
                networkManager.GetInternalBindAddresses(),
                networkManager);

            _dlnaServerManager.ConfigurationChanged += UpdateConfiguration;
            _networkManager.NetworkChanged          += NetworkChanged;
        }
Exemple #13
0
        static void Main(string[] args)
        {
            using (var server = new SsdpServer())
            {
                server.StartListening();

                var announcer = server.CreateAnnouncer();
                announcer.Location         = "http://localhost/test";
                announcer.NotificationType = "test";
                announcer.MaxAge           = 3;
                announcer.Start();

                SsdpClient client = new SsdpClient();
                using (var search = client.CreateSearch(true))
                {
                    search.SearchType = "upnp:rootdevice";

                    Console.WriteLine("Searching for first result:");
                    SsdpMessage first = search.FindFirst(Protocol.DiscoveryEndpoints.IPv4, Protocol.DiscoveryEndpoints.Broadcast);
                    if (first == null)
                    {
                        Console.WriteLine("No results found from FindFirst.");
                    }
                    else
                    {
                        Console.WriteLine("First device found at: {0}", first.Location);
                    }
                }

                using (var search = client.CreateSearch(true))
                {
                    search.SearchType = Protocol.SsdpAll;

                    // Attach our events for async search
                    search.ResultFound    += new EventHandler <EventArgs <SsdpMessage> >(search_ResultFound);
                    search.SearchComplete += new EventHandler(search_SearchComplete);

                    Console.WriteLine();
                    Console.WriteLine("Performing asynchronous search:");
                    //search.SearchAsync();
                    search.SearchAsync(Protocol.DiscoveryEndpoints.IPv4, Protocol.DiscoveryEndpoints.Broadcast);

                    // Wait for our async search to complete before doing the synchronous search
                    search.WaitForSearch();
                }

                using (var search = client.CreateSearch(true))
                {
                    search.SearchType = "upnp:rootdevice";

                    Console.WriteLine();
                    Console.WriteLine("Performing synchronous search:");
                    search.Search(Protocol.DiscoveryEndpoints.IPv4, Protocol.DiscoveryEndpoints.Broadcast).ForEach(msg =>
                    {
                        Console.WriteLine(msg.Location);
                    });
                }

                Console.ReadLine();
            }
        }