UPNP AV Discovery

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
RonnyO.
User
Beiträge: 6
Registriert: Freitag 6. Februar 2009, 08:40

Freitag 6. Februar 2009, 13:11

Hallo liebes Forum!

Ich habe meine ersten Gehversuche in Python unternommen nachdem ich schon einiges in C# programmiert habe. Ich muss aber sagen, dass ich kein ausgewiesener Programmierer bin, also bitte ich um nachsicht... geschweige denn habe ich Ahnung von Netzwerk-Programmierung also bitte doppelte Nachsicht für eventuelle dumme Fragen :)

Nun zum eigentlichen... was will ich machen....

Ich habe zu Hause ein kleines Netzwerk, bestehend aus zwei PCs, einem NAS, natürlich ein Router und einem MediaRenderer, oder vielleicht sagt man auch MediaStreamer es ist auf jeden Fall ein Linn Sneaky DS, falls ihn wer kennt. Nun möchte ich mir gerne einen UPNP Control-Point basteln und das in Python. Die erste Aufgabe, die zu lösen wäre ist die M-Search Discovery der UPNP Geräte in meinem Netzwerk. Da sollte es ja zumindest den Twonky-Server am Nas und eben den MediaRenderer geben.

Ich habe mich auch schon im Internet schlau gemacht und habe erfahren, dass das ganze über SSDP läuft, was wiederum über UDP geht... so habe ich es zumindest verstanden.

Ich habe dann folgenden Code für einen Client gebastelt:

Code: Alles auswählen

# Client
from socket import *

# Socket Parameter festlegen
host = '239.255.255.250'
port = 1900
buf = 1024
addr = (host,port)

# Erstellen des Sockets
UDPSock = socket(AF_INET,SOCK_DGRAM)

#SSDP Discovery request
data = "M-SEARCH * HTTP/1.1\nHost: 239.255.255.250:1900\nMan: \"ssdp:discover\"\nST:ssdp:all\nMX:10"

#Ausgabe des zu sendenden Requests
print data

#Senden der Daten
UDPSock.sendto(data,addr)

# Close socket
UDPSock.close()

Was denke ich im obigen code zu tun...

Ich mache mir ein Socket, sage es soll ein UDP socket sein und spezifiziere die UPNP Multicastadr. und das entsprechende Port. Dann schicke ich den MSearch request and die Multicastadrs...

So, nun hab ich gedacht, dass ich Antworten bekommen sollte... nämlich wer alles seine Dienste anbietet... dazu habe ich folgendes geschrieben...

Code: Alles auswählen


# Server
from socket import *

# Socket Parameter festlegen
host = 'localhost'
port = 1900
buf = 1024
addr = (host,port)

# Erstellen des Sockets und Binden an eine Adresse
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Empfangen von Daten
while True:
	data,addr = UDPSock.recvfrom(buf)
	if not data:
		print "Der Client wurde geschlossen!"
		break
	else:
		print "\nEmpfangen von Daten '", data,"'"
UDPSock.close()
Dazu habe ich mir einen "Server" gebastelt, der auf meinem PC, von dem ich das Request sende (localhost) auf dem Port 1900 lauscht...

Dort höre ich aber nichts....

Im SSDP Standard ( http://tools.ietf.org/html/draft-cai-ssdp-v1-03 ) hab ich gelesen, dass die Antwort auf den Request genau auf die ip:port zurück kommt, von der die Anfrage geschickt wurde. Mir ist nun aber aufgefallen, dass ich keine Ahnung habe von welchem Port ich den SSDP request sende... ich schnapp mir ja nur ein Socket und sende Daten... ich denke hier verstehe ich was nicht ganz. Was ich auch nicht weiß, ist in welcher form die Daten überhaupt zu mir zurückkommen??

Ich würde euch bitten mir zu helfen....

Danke und liebe Grüße,

RonnyO.
dev
User
Beiträge: 49
Registriert: Montag 23. Januar 2006, 09:52
Kontaktdaten:

Montag 9. Februar 2009, 10:47

RonnyO. hat geschrieben: Ich habe zu Hause ein kleines Netzwerk, bestehend aus zwei PCs, einem NAS, natürlich ein Router und einem MediaRenderer, oder vielleicht sagt man auch MediaStreamer es ist auf jeden Fall ein Linn Sneaky DS, falls ihn wer kennt.
Im Idealfall ist es ein MediaRenderer, wenn Du Pech hast ist es nur ein 'autistischer' Client der die Befehle eines ControlPoints ignoriert.

Aber das kannst Du z.B. mit dem Inspector herausfinden.
RonnyO. hat geschrieben: Nun möchte ich mir gerne einen UPNP Control-Point basteln und das in Python. Die erste Aufgabe, die zu lösen wäre ist die M-Search Discovery der UPNP Geräte in meinem Netzwerk. Da sollte es ja zumindest den Twonky-Server am Nas und eben den MediaRenderer geben.
Ich arbeite nun schon seit ~ 3 Jahren an Coherence, einem DLNA/UPnP Framework in Python.

Ein Beispiel wie Du da die ControlPoint API nutzen kannst findest Du z.B. hier.

Vielleicht kannst Du ja davon was nutzen oder Dir die entsprechenden Inspirationen holen.

Ciao,
dev
Antworten