ich habe hier ein paar UPnP-fähige Geräte, die ich gerne via Programm monitoren möchte. Leider gibt es ja für Free Pascal keine funktionierende UPnP-Bibliothek, sodass ich versuche, die UPnP-Befehle, die ja im Prinzip HTTP-Requests/Responds sind, zu simulieren.
Das, was ich simulieren möchte, findet sich im ersten Bild, welches ich mit dem UPnP-Tool DeviceSpy erstellt habe.
Ich habe nun die Unit fphttpclient entdeckt, die es ermöglicht, HTTP-Requests zu versenden. Mein Beispielprogramm sieht so aus:
Code: Alles auswählen
var
message : TStringList;
message_string : string;
c : TFPHTTPClient;
return_stream : TMemoryStream;
a_int : array of integer;
i : integer;
begin
c := TFPHTTPClient.Create(nil);
message := TStringList.Create;
// message.Add('POST /MediaRenderer/AVTransport/Control HTTP/1.1');
// message.Add('HOST: 192.168.1.22:1400');
message.Add('SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#GetPositionInfo"');
message.Add('CONTENT-TYPE: text/xml; charset="utf-8"');
message.Add('Content-Length: 351');
message.Add(' ');
message.Add('<?xml version="1.0" encoding="utf-8"?>');
message.Add('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">');
message.Add(' <s:Body>');
message.Add(' <u:GetPositionInfo xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">');
message.Add(' <InstanceID>0</InstanceID>');
message.Add(' </u:GetPositionInfo>');
message.Add(' </s:Body>');
message.Add('</s:Envelope>');
message_string := message.Strings[0];
for i := 1 to message.count - 1 do
message_string := message_string + chr(13) + chr(10) + message.Strings[i];
return_stream := TMemoryStream.Create;
c.HTTPMethod(message_string, 'http://192.168.1.22:1400/MediaRenderer/AVTransport/Control', return_stream, a_int);
writeln(IntToStr(return_stream.Size));
for i:=0 to return_stream.Size - 1 do
begin
return_stream.Position := i;
write(chr(ord(return_stream.ReadByte)));
end;
Leider funktioniert das noch nicht so richtig.
In der obigen Form wird die Nachricht versendet und es gibt auch eine Antwort. Die besagt aber: Bad Request.
Wenn die beiden Kommentarzeilen als Code ausgeführt werden, dann gibt es noch nicht mal eine Antwort. Der Aufruf c.HTTPMethod kehrt nicht zurück.
Mir ist klar, dass ich noch irgendetwas falsch mache. Bloß was? Hat jemand eine Idee?
Liebe Grüße
Wolfram