コード例 #1
0
 /// <summary>
 /// Walks through the tree of all root devices and services of the specified UPnP <paramref name="server"/>
 /// and calls the <see cref="ISSDPDiscoveryMessageSender.SendMessage"/>
 /// method of the <paramref name="messageSender"/> for each device and service. As specified in (DevArch),
 /// the message sender method will be called three times for the root device, twice for each device and once for
 /// each service with the NT/USN parameter constellation described in (DevArch), section 1.2.2.
 /// </summary>
 /// <param name="server">UPnP server of the root UPnP device tree to send discovery messages for.</param>
 /// <param name="messageSender">Message producer and sender class which creates the actual messages to be sent
 /// for each of the given NT/USN parameter combinations.</param>
 public static void SendMessagesServer(UPnPServer server, ISSDPDiscoveryMessageSender messageSender)
 {
     foreach (DvDevice rootDevice in server.RootDevices)
     {
         SendMessagesRootDevice(rootDevice, messageSender);
     }
 }
コード例 #2
0
        private static void Run()
        {
            IList <SonosSpeaker> speakers = new SonosDiscoveryService().FindSpeakers().Result;

            foreach (SonosSpeaker sonosSpeaker in speakers)
            {
                Console.WriteLine(sonosSpeaker.Name + " (" + sonosSpeaker.Uuid + ")");
            }

            SonosSpeaker speaker = speakers.FirstOrDefault(x => x.Name.StartsWith("J"));

            speaker.Control.OnUpdate += Control_OnUpdate;
            Console.WriteLine("Controlling " + speaker.Name);


            UPnPServer server = new UPnPServer();

            server.Start(24452);

            speaker.Control.SubscribeToEvents(server);

            while (true)
            {
                string line = Console.ReadLine();

                if (line.StartsWith("a"))
                {
                    speaker.Control.Play().Wait();
                }
                else if (line.StartsWith("s"))
                {
                    speaker.Control.Pause().Wait();
                }
                else if (line.StartsWith("n"))
                {
                    speaker.Control.Next().Wait();
                }
                else if (line.StartsWith("v"))
                {
                    speaker.Control.SetVolume(int.Parse(line.Remove(0, 1).Trim())).Wait();
                }
                else if (line.StartsWith("b"))
                {
                    Console.WriteLine(speaker.Control.GetVolume().Result);
                }
                else if (line.StartsWith("u"))
                {
                    AddUriQueueResponse result =
                        speaker.Control.AddURITOQueue(
                            "x-sonos-spotify:spotify%3atrack%3a456lFrF5OrYuCffSHSaYfs?sid=9&amp;flags=8224&amp;sn=1", "", 0, true).Result;
                    Console.WriteLine("TRACK NR: " + result.FirstTrackNumberEnqueued);
                    speaker.Control.Seek(SeekUnitType.TrackNumber, result.FirstTrackNumberEnqueued.ToString()).Wait();
                    speaker.Control.Play().Wait();;
                }
                else if (line.StartsWith("q"))
                {
                    break;
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Starts this UPnP control point. All device templates should be configured at the time this method gets called.
        /// The network tracker must be started after this method is called, else we might miss some connect events.
        /// </summary>
        public void Start()
        {
            lock (_cpData.SyncObj)
            {
                if (_isActive)
                {
                    throw new IllegalCallException("UPnP control point mustn't be started multiple times");
                }

                UPnPConfiguration.LOGGER.Debug("Will listen on IPs filtered by [{0}]", (UPnPConfiguration.IP_ADDRESS_BINDINGS != null ? String.Join(",", UPnPConfiguration.IP_ADDRESS_BINDINGS) : null));

                var servicePrefix = "/MediaPortal/UPnPControlPoint_" + Guid.NewGuid().GetHashCode().ToString("X");
                _cpData.ServicePrefix = servicePrefix;
                var startOptions = UPnPServer.BuildStartOptions(servicePrefix);

                IDisposable server = null;
                try
                {
                    server = WebApp.Start(startOptions, builder => { builder.Use((context, func) => HandleHTTPRequest(context)); });
                    UPnPConfiguration.LOGGER.Info("UPnPControlPoint: HTTP listener started on addresses {0}", String.Join(", ", startOptions.Urls));
                    _httpListeners.Add(server);
                }
                catch (SocketException e)
                {
                    server?.Dispose();
                    UPnPConfiguration.LOGGER.Warn("UPnPControlPoint: Error starting HTTP server", e);
                }

                _networkTracker.RootDeviceRemoved += OnRootDeviceRemoved;
                _networkTracker.DeviceRebooted    += OnDeviceRebooted;

                _isActive = true;
            }
        }
コード例 #4
0
        public void SubscribeToEvents(UPnPServer server)
        {
            _avService.OnLastChangeEvent += AvServiceOnLastChangeEvent;
            _renderingControlService.OnLastChangeEvent += RenderingControlOnLastChangeEvent;

            server.SubscribeToControl(_avService);
            server.SubscribeToControl(_renderingControlService);
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: JonasMH/UPnPNet
        public static void Main()
        {
            UPnPDiscovery discovery = new UPnPDiscovery
            {
                SearchTarget = DiscoverySearchTargetFactory.ServiceTypeSearch("AVTransport", "1")
            };
            IList <UPnPDevice> devices = discovery.Search().Result;

            UPnPServer server = new UPnPServer();

            IList <UPnPDevice> sonosDevices =
                devices.Where(x => x.Properties["friendlyName"].ToLower().Contains("sonos")).ToList();

            IList <UPnPService> avServices = sonosDevices
                                             .SelectMany(x => x.SubDevices)
                                             .SelectMany(x => x.Services)
                                             .Where(x => x.Type == "urn:schemas-upnp-org:service:AVTransport:1").ToList();

            IList <AvTransportServiceControl> speakers = avServices.Select(x => new AvTransportServiceControl(x)).ToList();


            server.Start(24458);

            speakers.Foreach(x =>
            {
                server.SubscribeToControl(x);
                x.OnLastChangeEvent += (sender, args) => { Console.WriteLine("SOMETHING: " + args.TransportState); };
            });


            while (true)
            {
                ConsoleKeyInfo info = Console.ReadKey();

                switch (info.Key)
                {
                case ConsoleKey.Q:
                    return;

                case ConsoleKey.A:
                    speakers.Foreach(
                        x => x.SendAction("Play", new Dictionary <string, string>()
                    {
                        { "InstanceID", "0" }, { "Speed", "1" }
                    }).Wait());
                    break;

                case ConsoleKey.S:
                    speakers.Foreach(x => x.SendAction("Pause", new Dictionary <string, string>()
                    {
                        { "InstanceID", "0" }
                    }).Wait());
                    break;
                }
            }
        }
コード例 #6
0
        private void CreateAndStartServer()
        {
            try
            {
                ServerSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <ServerSettings>();
                List <string>  filters  = settings.IPAddressBindingsList;

                _servicePrefix = ResourceHttpAccessUrlUtils.RESOURCE_SERVER_BASE_PATH + Guid.NewGuid().GetHashCode().ToString("X");
                var startOptions = UPnPServer.BuildStartOptions(_servicePrefix, filters);

                try
                {
                    lock (_syncObj)
                    {
                        _httpServer = WebApp.Start(startOptions, builder =>
                        {
                            foreach (Type middleWareType in _middleWares)
                            {
                                builder.Use(middleWareType);
                            }
                        });
                    }
                }
                catch (Exception ex)
                {
                    if (filters.Count > 0)
                    {
                        ServiceRegistration.Get <ILogger>().Warn("ResourceServer: Error starting HTTP server with filters. Fallback to no filters", ex);
                    }
                    else
                    {
                        throw ex;
                    }

                    _httpServer?.Dispose();
                    startOptions = UPnPServer.BuildStartOptions(_servicePrefix, new List <string>());
                    lock (_syncObj)
                    {
                        _httpServer = WebApp.Start(startOptions, builder =>
                        {
                            foreach (Type middleWareType in _middleWares)
                            {
                                builder.Use(middleWareType);
                            }
                        });
                    }
                }
            }
            catch (Exception ex)
            {
                ServiceRegistration.Get <ILogger>().Error("ResourceServer: Error starting HTTP servers", ex);
            }
        }
コード例 #7
0
        private void CreateAndStartServer()
        {
            ServerSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <ServerSettings>();
            List <string>  filters  = settings.IPAddressBindingsList;

            _servicePrefix = ResourceHttpAccessUrlUtils.RESOURCE_SERVER_BASE_PATH + Guid.NewGuid().GetHashCode().ToString("X");
            var startOptions = UPnPServer.BuildStartOptions(_servicePrefix, filters);

            lock (_syncObj)
            {
                _httpServer = WebApp.Start(startOptions, builder =>
                {
                    foreach (Type middleWareType in _middleWares)
                    {
                        builder.Use(middleWareType);
                    }
                });
            }
        }
コード例 #8
0
 public UPnPSystemResumeHelper(UPnPServer upnpServer)
 {
     _upnpServer   = upnpServer;
     _messageQueue = new AsynchronousMessageQueue(this, new[] { SystemMessaging.CHANNEL });
     _messageQueue.PreviewMessage += OnMessageReceived;
 }
コード例 #9
0
 /// <summary>
 /// Walks through the tree of all root devices and services of the specified UPnP <paramref name="server"/>
 /// and calls the <see cref="ISSDPDiscoveryMessageSender.SendMessage"/>
 /// method of the <paramref name="messageSender"/> for each device and service. As specified in (DevArch),
 /// the message sender method will be called three times for the root device, twice for each device and once for
 /// each service with the NT/USN parameter constellation described in (DevArch), section 1.2.2.
 /// </summary>
 /// <param name="server">UPnP server of the root UPnP device tree to send discovery messages for.</param>
 /// <param name="messageSender">Message producer and sender class which creates the actual messages to be sent
 /// for each of the given NT/USN parameter combinations.</param>
 public static void SendMessagesServer(UPnPServer server, ISSDPDiscoveryMessageSender messageSender)
 {
   foreach (DvDevice rootDevice in server.RootDevices)
     SendMessagesRootDevice(rootDevice, messageSender);
 }
コード例 #10
0
        private void CreateAndStartServer()
        {
            ServerSettings settings = ServiceRegistration.Get <ISettingsManager>().Load <ServerSettings>();
            List <string>  filters  = settings.IPAddressBindingsList;

            _serverPort    = UPnPServer.DEFAULT_UPNP_AND_SERVICE_PORT_NUMBER;
            _servicePrefix = ResourceHttpAccessUrlUtils.RESOURCE_SERVER_BASE_PATH;
            var startOptions = UPnPServer.BuildStartOptions(_servicePrefix, filters, _serverPort);

            lock (_syncObj)
            {
                if (_httpServer != null) //Already started
                {
                    return;
                }

                _httpServer = WebApp.Start(startOptions, builder =>
                {
                    // Configure OAuth Authorization Server
                    builder.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
                    {
                        AuthenticationType              = MEDIAPORTAL_AUTHENTICATION_TYPE,
                        TokenEndpointPath               = new PathString("/Token"),
                        ApplicationCanDisplayErrors     = true,
                        AuthorizationCodeExpireTimeSpan = TimeSpan.FromDays(7),
#if DEBUG
                        AllowInsecureHttp = true,
#endif
                        // Authorization server provider which controls the lifecycle of Authorization Server
                        Provider = new OAuthAuthorizationServerProvider
                        {
                            OnValidateClientAuthentication  = ValidateClientAuthentication,
                            OnGrantResourceOwnerCredentials = GrantResourceOwnerCredentials,
                        }
                    });
                    builder.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

                    // Configure Web API
                    HttpConfiguration config = new HttpConfiguration();

                    // Support conventional routing
                    var routeTemplate = (_servicePrefix + "/api/{controller}/{id}").TrimStart('/'); // No leading slash allowed
                    config.Routes.MapHttpRoute(
                        "DefaultApi",
                        routeTemplate,
                        new { id = RouteParameter.Optional }
                        );

                    // Support attribute based routing
                    config.MapHttpAttributeRoutes();

                    // Set json as default instead of xml
                    config.Formatters.JsonFormatter.MediaTypeMappings
                    .Add(new System.Net.Http.Formatting.RequestHeaderMapping(
                             "Accept", "text/html", StringComparison.InvariantCultureIgnoreCase, true, "application/json"));

                    builder.UseWebApi(config);

                    // Configure MiddleWare
                    foreach (Type middleWareType in _middleWares)
                    {
                        builder.Use(middleWareType);
                    }
                });
            }
        }