[C#] - Sonos-App für Windows Phone ?

ElricM

Core Quäler
Registriert
14 Juli 2013
Beiträge
2.033
Hallo Coder,

ich bin seit einer Woche stolzer Besitzer einer Multi-Roomanlage von SONOS. Besteht derzeit aus 3 Lautsprecher (PLAY1 und PLAY3), einer Bridge und einer Connect.

Es gibt auch eine Windows-Desktop-Software, die so leidlich funktioniert, aber wer will schon die Musikanlage jedes Mal über den PC steuern. Meine Frau ist mir da schon an den Hals gegangen :) Es gibt die üblichen Apps für IPhone und Android, aber nix für Windows Phone.
Zumindest nichts offizielles vom Hersteller. Es existieren zwar zwei Apps aus der "Heimecke", aber die taugen nicht sehr viel. Ich habe dann meiner Frau eine Logitec Harmony Ultimate besorgt, da geht's dann auch über Fernbedienung, aber auch hier ist das Featureset ziemlich traurig (Laut, Leise, Starten, Stoppen und Musik aus einer Favoritenliste auswählen).

Mich ärgert das und gestern Abend habe ich eine Hackingsession mit Wireshark unternommen und der PC-Software mal unter den Rock geschaut. Auf den Abspielgeräten findet sich ein Linux mit einer Webschnittstelle auf Port 1400. Die Kommunikation findet per Webrequests (Soap POSTs) und ... ei ei per UPnP statt.
Jetzt juckt es mich gewaltig, eine eigene App für Windows Phone 8.1 und Windows Store App 8.1 auf der Basis von Universal Apps aus VS 2013 zu schreiben. Hat hier schon jemand praktische Erfahrung mit dem Thema ?

Grüße
ElricM
 
  • Thread Starter Thread Starter
  • #2
UPnP unter Windows RT ist wohl eher untrivial. Unter "normalen" Windows gibt es eine Menge Ansätze, die auf einer guten alten COM-Dll (UPnP 1.0 Type Library (Control Point)) basieren. Das scheidet für Windows Store und Windows Phone aus. Also selbst ist der Entwickler :)

Alles fängt mit dem Auffinden der Devices an, dafür gibt es das ( ).

Ein HTTP-Request mit einem UPD-Multibroadcast auf Port 1900 sollte es regeln.

[src=csharp]
string message = "M-SEARCH * HTTP/1.1\r\n" +
"HOST: 239.255.255.250:1900\r\n" +
"ST:upnp:rootdevice\r\n" +
"MAN:\"ssdp:discover\"\r\n" +
"MX:3\r\n\r\n";
[/src]

Hier gibt es hoffentlich die nötigen Backgrounds:

Dann versuche ich mal mein Glück. :)
 
Hat jetzt zwar nichts mit Programmierung zu tun aber hast du mal nach Yatse oder BubbleUpnP gesucht? Damit sollte eine Steuerung ja möglich sein.
 
Als Sonos und eventuell bald Windowsphone User finde ich das sehr interessant. Falls du da tatsächlich was bastelst, halt uns bitte auf dem Laufenden.
 
  • Thread Starter Thread Starter
  • #5
Hat jetzt zwar nichts mit Programmierung zu tun aber hast du mal nach Yatse oder BubbleUpnP gesucht? Damit sollte eine Steuerung ja möglich sein.

Ist doch beides für Android ? Aber nicht für Windows (Phone).

--- [2015-03-24 21:01 CET] Automatisch zusammengeführter Beitrag ---

Als Sonos und eventuell bald Windowsphone User finde ich das sehr interessant. Falls du da tatsächlich was bastelst, halt uns bitte auf dem Laufenden.

Mache ich :)
 
  • Thread Starter Thread Starter
  • #7
Nach einigen Anregungen aus dem Netz und ein bisschen Inspiration komme ich auf folgendes

[src=csharp] public async void SearchForDevices()
{
var socket = new DatagramSocket();
socket.MessageReceived += async (sender, args) =>
{
DataReader reader = args.GetDataReader();

uint count = reader.UnconsumedBufferLength;
string data = reader.ReadString(count);
var response = new Dictionary<string, string>();
foreach (
string x in
data.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None))
{
if (x.Contains(":"))
{
string[] strings = x.Split(':');
response.Add(strings[0].ToLower(), x.Remove(0, strings[0].Length + 1));
}
}

try
{
Device device = await GetXml(response);
Debug.WriteLine("Device found");
if (DeviceFound != null)
DeviceFound(this, new DeviceFoundEventArgs(device));
}
catch (WebException exp)
{
Debug.WriteLine(exp.Message);
}
};
IOutputStream stream = await socket.GetOutputStreamAsync(new HostName("239.255.255.250"), "1900");


const string message = "M-SEARCH * HTTP/1.1\r\n" +
"HOST: 239.255.255.250:1900\r\n" +
"ST:upnp:rootdevice\r\n" +
"MAN:\"ssdp:discover\"\r\n" +
"MX:3\r\n\r\n";

var writer = new DataWriter(stream) {UnicodeEncoding = UnicodeEncoding.Utf8};
writer.WriteString(message);
await writer.StoreAsync();
}[/src]

Läßt sich auch anzeigen ;)

SonosDetect.jpg
 
Zurück
Oben