/// <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); } }
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&flags=8224&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; } } }
/// <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; } }
public void SubscribeToEvents(UPnPServer server) { _avService.OnLastChangeEvent += AvServiceOnLastChangeEvent; _renderingControlService.OnLastChangeEvent += RenderingControlOnLastChangeEvent; server.SubscribeToControl(_avService); server.SubscribeToControl(_renderingControlService); }
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; } } }
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); } }
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); } }); } }
public UPnPSystemResumeHelper(UPnPServer upnpServer) { _upnpServer = upnpServer; _messageQueue = new AsynchronousMessageQueue(this, new[] { SystemMessaging.CHANNEL }); _messageQueue.PreviewMessage += OnMessageReceived; }
/// <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); }
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); } }); } }