Hallo Leute
Ich versuche gerade ein "Modul" zu schreiben, welches den Status meiner Samsung Soundbar abruft.
Mit Curl klappt alles:
curl -v 'http://192.168.240.16:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E'
* Trying 192.168.240.16...
* TCP_NODELAY set
* Connected to 192.168.240.16 (192.168.240.16) port 55001 (#0)
> GET /UIC?cmd=%3Cname%3EGetFunc%3C/name%3E HTTP/1.1
> Host: 192.168.240.16:55001
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 02 Jan 1970 12:14:10 GMT
< Server: Samsung/1.0
< Content-Type: text/html
< Content-Length: 311
< Connection: close
< Last-Modified: Fri, 02 Jan 1970 12:14:10 GMT
<
* Curl_http_done: called premature == 0
* Closing connection 0
<?xml version="1.0" encoding="UTF-8"?><UIC><method>CurrentFunc</method><version>1.0</version><speakerip>192.168.240.16</speakerip><user_identifier></user_identifier><response result="ok"><function>hdmi2</function><submode></submode><connection></connection><devicename><![CDATA[]]></devicename></response></UIC>
Nun versuche ich das ganze mittels httputils in einem Modul zu verwenden:
sub SamsungUtils_Http($$)
{
my ( $hash, $name ) = @_;
my $param = {
#url => "http://soundbar.gruber.wohnung:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E",
url => "http://192.168.240.16:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E",
timeout => 5,
hash => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
method => "GET", # Lesen von Inhalten
#header => "User-Agent: TeleHeater/2.2.3\r\nAccept: application/json", # Den Header gemäß abzufragender Daten ändern
#Header => "User-Agent: Mozilla/1.22\r\nContent-Type: application/xml\r\nAccept: application/xml",
Header => { "User-Agent" => "None", "Content-Type" => "text/html;charset=utf-8" },
#Header => "",
callback => \&SamsungUtils_ParseHttpResponse # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
};
HttpUtils_NonblockingGet($param);
}
sub SamsungUtils_ParseHttpResponse($)
{
my ($param, $err, $data) = @_;
my $hash = $param->{hash};
my $name = $hash->{NAME};
if($err ne "") # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
{
Log3 $name, 3, "error while requesting ".$param->{url}." - $err"; # Eintrag fürs Log
readingsSingleUpdate($hash, "fullResponse", "ERROR", 0); # Readings erzeugen
}
elsif($data ne "") # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
{
Log3 $name, 3, "url ".$param->{url}." returned: $data"; # Eintrag fürs Log
# An dieser Stelle die Antwort parsen / verarbeiten mit $data
readingsSingleUpdate($hash, "fullResponse", $data, 0); # Readings erzeugen
}
# Damit ist die Abfrage zuende.
# Evtl. einen InternalTimer neu schedulen
}
Ich habe mich schon mit verschiedenen Header gespielt, bekomme aber immer:
error while requesting http://192.168.240.16:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E - http://192.168.240.16:55001/UIC?cmd=%3Cname%3EGetFunc%3C/name%3E: empty answer received
Liegt das am header?
Wie kann ich mehr herausfinden / den Fehler eingrenzen?
mfg
Mike
Mit "attr global verbose 5"
Du könntest auch mit einem Netzwerk-Monitor wie z.B. WireShark schauen, welche Daten genau an die Soundbar übertragen werden und was zurück kommt, in beiden Fällen (curl und Perl / FHEM), und dann vergleichen.
Ich hab die Antwort im oberen Post geschrieben.. nur nicht gleich erkannt...
Curl hängt (warum auch immer) an die URL noch "HTTP/1.1" dran...
Das hab ich in meinem Modul auch angehängt und siehe da... Es klappt
Danke für die schnellen Antworten!
Mfg
Mike
Gesendet von meinem ONEPLUS A6013 mit Tapatalk