(gelöst)Problem mit der Funktion "HttpUtils_NonblockingGet"->Antwort "timed out"

Begonnen von ritchie, 29 Juni 2015, 19:55:48

Vorheriges Thema - Nächstes Thema

ritchie

Hallo Zusammen,

ich möchte mir ein neues Modul für eine FOSCAM WEB Kamera erstellen und bin derzeit bei der Abfrage
des Status der Kamera am hängen.

Ich verwende hierbei folgenden Code


...
$StatusURL="https://$hash->{helper}{ADDRESS}/cgi-bin/CGIProxy.fcgi?cmd=getDevState&usr={USERNAME}&pwd={PASSWORD}";
$StatusURL =~ s/{USERNAME}/$hash->{helper}{USERNAME}/g;
        $StatusURL =~ s/{PASSWORD}/$hash->{helper}{PASSWORD}/g;
# Log3 $name, 1, "FOSCAM_GetStatus: $StatusURL";                                                  # Eintrag fürs Log
$param = {
url        => $StatusURL,
hash       => $hash,                                                                                  # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
callback   =>  \&FOSCAM_ParseHttpResponse                                                             # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
    };
                         
HttpUtils_NonblockingGet($param);                                                                                     # Starten der HTTP Abfrage. Es gibt keinen Return-Code.
....


Hier der Code der Antwort Routine

sub FOSCAM_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, 1, "FOSCAM_ParseHttpResponse ".$param->{url}." - $err";                                                  # Eintrag fürs Log
        readingsSingleUpdate($hash, "fullResponse", "ERROR",1);                                                              # Readings erzeugen
    }

    elsif($data ne "")                                                                                                     # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 1, "FOSCAM_ParseHttpResponse url ".$param->{url}." returned: $data";                                   # Eintrag fürs Log
        # An dieser Stelle die Antwort parsen / verarbeiten mit $data
        readingsSingleUpdate($hash, "fullResponse", $data,1);                                                                # Readings erzeugen
    }
}


Erwartet wird der folgende XML Text, welcher auch von der Kamera zurückgeben wird, wenn ich das Kommando in die Adresszeile eingebe.
Zitat
<CGI_Result>
    <result>0</result>
    <IOAlarm>0</IOAlarm>
    <motionDetectAlarm>1</motionDetectAlarm>
    <soundAlarm>0</soundAlarm>
    <record>0</record>
    <sdState>1</sdState>
    <sdFreeSpace>61956960k</sdFreeSpace>
    <sdTotalSpace>62336096k</sdTotalSpace>
    <ntpState>1</ntpState>
    <ddnsState>0</ddnsState>
    <url>http%3A%2F%2Ffq5994.myfoscam.org%3A88</url>
    <upnpState>0</upnpState>
    <isWifiConnected>1</isWifiConnected>
    <wifiConnectedAP>FlipOnAirSecure</wifiConnectedAP>
    <infraLedState>0</infraLedState>
</CGI_Result>

Es erfolgt aber die folgende Ausgabe
Zitat
FOSCAM_ParseHttpResponse https://<Kamera IP>/cgi-bin/CGIProxy.fcgi?cmd=getDevState&usr=<User>&pwd=<Kennwort> - connect to https://<Kamera IP>:443 timed out

Ich habe den Verboselevel auf 5 gestellt und bekomme aber keine direkten Hinweise auf Fehler.

Gruss R.
IPU662  IPFIRE & Fhem (Homematic + MAX) - Produktiv
Intel iCore 3 / 16GBRAM / 500GB SSD  (1Wire - USB) - Produktiv

Dietmar63

in TW so gelöst:
Der timeout Parameter sollte Besserung bringen

sub Twilight_CreateHttpParameterAndGetData($$) {
  my ($myHash, $mode) = @_;
  my $hash = myGetHashIndirekt($myHash, (caller(0))[3]);
  return if (!defined($hash));   
 
  my $location = $hash->{WEATHER};
  my $verbose  = AttrVal($hash->{NAME}, "verbose", 3 );

  my $param = {
     #noshutdown => 1,
      url        => "http://weather.yahooapis.com/forecastrss?w=".$location."&u=c",
      timeout    => defined($hash->{DEFINE}) ? 5 : 5,
      hash       => $hash,
      method     => "GET",
      loglevel   => 4-($verbose-3),
      header     => "User-Agent: Mozilla/5.0\r\nAccept: application/xml",
      callback   => \&Twilight_WeatherCallback,
      mode       => $mode };
 
  if (defined($hash->{DEFINE})) {
    delete $param->{callback};
    my ($err, $xml) = HttpUtils_BlockingGet($param);
    Twilight_WeatherCallback($param, $err, $xml);
  } else {
    HttpUtils_NonblockingGet($param);
  } 
 
}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

rudolfkoenig

Zitatconnect to https://<Kamera IP>:443 timed out
Die Kamera braucht laenger als die voreingestellten 4 Sekunden fuer den Aufbau der HTTPS Verbindung.
Der Vorschlag von Dietmar63, timeout zu setzen/erhoehen ist richtig, allerdings sind 5 Sekunden vmtl. zu knapp.

ritchie

Hi,

danke für die Infos.

Aufruf:

...
$StatusURL="https://$hash->{helper}{ADDRESS}/cgi-bin/CGIProxy.fcgi?cmd=getDevState&usr={USERNAME}&pwd={PASSWORD}";
$StatusURL =~ s/{USERNAME}/$hash->{helper}{USERNAME}/g;
        $StatusURL =~ s/{PASSWORD}/$hash->{helper}{PASSWORD}/g;
Log3 $name, 1, "FOSCAM_GetStatus: $StatusURL"; # Eintrag fürs Log
$param = {
url        => $StatusURL,
hash       => $hash, # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
timeout    => $hash->{helper}{TIMEOUT}, # warte erst mal auf Antwort
header     => "User-Agent: Mozilla/5.0\r\nAccept: application/xml",
callback   =>  \&FOSCAM_ParseHttpResponse # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
    };
HttpUtils_NonblockingGet($param); # Starten der HTTP Abfrage. Es gibt keinen Return-Code.

InternalTimer(gettimeofday()+$hash->{helper}{INTERVAL}, "FOSCAM_GetStatus", $hash, 0) unless($local == 1);
...

Callback:

sub FOSCAM_ParseHttpResponse(@)
{
    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $name = $hash->{NAME};

   Log3 $name, 1, "FOSCAM_ParseHttpResponse: $data Err: $err";                                                  # Eintrag fürs Log
   
    if($err ne "")                                                                                                         # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 $name, 1, "FOSCAM_ParseHttpResponse ".$param->{url}." - $err";                                                  # Eintrag fürs Log
        readingsSingleUpdate($hash, "fullResponse", "ERROR",1);                                                              # Readings erzeugen
    }

    elsif($data ne "")                                                                                                     # wenn die Abfrage erfolgreich war ($data enthält die Ergebnisdaten des HTTP Aufrufes)
    {
        Log3 $name, 1, "FOSCAM_ParseHttpResponse url ".$param->{url}." returned: $data";                                   # Eintrag fürs Log
        # An dieser Stelle die Antwort parsen / verarbeiten mit $data
        readingsSingleUpdate($hash, "fullResponse", $data,1);                                                                # Readings erzeugen
    }
}


Nur bekomme ich derzeit gar keine Antwort und bin auf der Suche warum.

Ich hatte gestern noch festgestellt, das ich mein Testsystem noch nicht den Zugriff auf mein Netzwerk erlaubt habe. Das habe ich jetzt gemacht und sehe
derzeit keine Antwort im Logfile von der Kamera.
Die Antwort der Kamera vom Webinterface dauert ca. 4-5 Sekunden.

Ich prüfe derzeit ob meine SSL Protokolle alle auf dem aktuellen Stand sind (Update des RP's). Ich habe einen nackte RP's für meine Tests, da ich an meinem Hauptsystem das nicht machen will.

Gibt es ein Tool für den RP'i, womit man CGI's und deren Antwort auf Kommandozeile prüfen kann ?


Edit: Es ist ein Problem meiner Sicherheitseinstellungen, da ich WLAN Verbindungen nur beschränkt zulasse. Mit einer Kabelverbindung arbeitet die oben gezeigt Routine wie erwartet.
Sicherheit hat so auch seinen Preis  ???


Gruss R.

IPU662  IPFIRE & Fhem (Homematic + MAX) - Produktiv
Intel iCore 3 / 16GBRAM / 500GB SSD  (1Wire - USB) - Produktiv