httputils -> empty answer received

Begonnen von djbone92, 18 Dezember 2019, 12:55:51

Vorheriges Thema - Nächstes Thema

djbone92

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

rudolfkoenig


xenos1984

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.

djbone92

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