RPI Ping

Hallo,
hat jemand eine Lösung um vom RPI einen Ping auszuführen? Leider funktionert werder die Function Sys_Ping() noch dieses Script.

function check_connection($ip) {
    $online=exec("ping $ip -c 5 -w 8", $output, $error);
       if ($error == 0)  {
        return true;
    } else {
        return false;
    }
}

Kurzerhand hier geliehen (http://stackoverflow.com/a/16650339) und für ganz gut befunden:


if(ping("172.17.31.200") === false)
    echo "Nicht erreichbar";
else
    echo "Alles tutti!";

function ping($host, $timeout = 1) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket  = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $host, null);
    $ts = microtime(true);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {
        $result = microtime(true) - $ts;
    } else {
        $result = false;
    }
    socket_close($socket);
    return $result;
}

Vielen Dank für die Hilfe!

Läuft Super!

Gruß Axel

Danke, hat mir auch gefehlt

Wo setze ich denn die Funktion am besten ein?

Muss die Funktion überall wo der ping Befehl genutzt wird hin?

ansonsten funktioniert das ganz gut!

LG
duk64

Hi duk64,

glaube da sollte jemand noch etwas Grundkenntnisse sammeln :wink:

Die Funktion kannst du entweder in jedes Script kopieren, wo du die Funktion benötigst, ODER du machst dir ein allgemeines Script mit Funktionen und kopierst die Funktion dort hinein und wenn du dann die Funktion in einem anderen Script verwenden möchtest, dann machst du ein „include(„Funktionen_Sammlung.ips.php“);“ und schon kannst du die Funktion nutzen, als wäre sie im jeweiligen Script :slight_smile:

Grüße,
Chris

Ja bayaro, hast ja recht :wink:

Danke das hatte ich gemeint, ich versuche mich zu bessern!

Schönen Restmontag!!

Leider funktionert werder die Function Sys_Ping() noch dieses Script.

SYS_Ping geht seit dem letztem Update

@tomgr: sys_ping() geht bei mir aber nicht?!?

PS: Ich habe gerade ein update gemacht und musste

> sudo dpkg --configure -a
machen.
Danach kam ein Gerödel ohne Ende.
Nach eine Fehlermeldung:

> dpkg: Fehler beim Bearbeiten von symcon (–configure):
> Paket ist in einem sehr schlechten inkonsistenten Zustand - Sie sollten es
> nochmal installieren, bevor Sie die Konfiguration versuchen.
> Fehler traten auf beim Bearbeiten von:
> symcon

Nach einem upgrade und jede Menge Zeilen, startete symcon normal! juhu

Ich habe deb Befehl: SYS_Ping („10.1.1.10“,1000);
ausgeführt und bekomme folgende Fehlermeldung:

Warning: socket_set_option(): unable to set socket option [33]: Numerical argument out of domain in /etc/symcon/scripts/__extensions.inc.php on line 94

und nun???

Im Moment, keine Ahnung was anders ist.
Bei mir ging es, muss aber jetzt nochmal nach schauen

Hast du nochmal probiert?
geht das bei dir?

SYS_Ping ("10.1.1.10",1000);

LG
duk64

<?
print_r(SYS_Ping ("192.168.1.38",999));
?>

Liefert : 0.0046408176422119

,1000 bringt :
Warning: socket_set_option(): unable to set socket option [33]: Numerical argument out of domain in /etc/symcon/scripts/__extensions.inc.php on line 94
0.0017960071563721

Schau ich mir an. Ist bestimmt noch ein Fehler.

paresy

Ja, das ist bei mir auch so!

Fix im nächsten Update.

paresy

Danke paresy :loveips:

SYS_Ping funktioniert jetzt einwandfrei!!

LG
duk64

Schönen guten Abend.

Ich hänge mich hier gerade mal dran.
IPS aktuellste Version auf Raspberry.

sys_ping scheint zwar zu funktionieren, aber bei der Skriptausführung, bzw. im Log sehe ich häufig folgende Meldung.

Warning:  socket_connect(): Host lookup failed [-10001]: Unknown host in /etc/symcon/scripts/__extensions.inc.php on line 8

Warning:  socket_send(): unable to write to socket [89]: Destination address required in /etc/symcon/scripts/__extensions.inc.php on line 9

Das sind die entsprechenden Einträge aus der __extensions.inc.php:

function Sys_Ping($host, $timeout) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket  = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => floor($timeout/1000), 'usec' => ($timeout%1000)*1000));
    socket_connect($socket, $host, null);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {
        $result = true;
    } else {
        $result = false;
    }
    socket_close($socket);
    return $result;
}

Muss das so :D?

Gruß
Thorsten

Das klingt nach einem Fehler :smiley: Werden wir ausbessern!

paresy

Danke :slight_smile:

Gruß
Thorsten

Hallo zusammen,

ich habe gerade im Sonos Modul eingebaut, dass eine Exception geworfen wird, wenn die Box nicht ewrreichbar ist.

Jetzt scheint SyS_Ping() aber auf der Symbox nicht zu funktionieren. Kann das jemand bestätigen?
EDIT: Oh, gerade im Symbox Forum den Eintrag von ISI gesehen, der das Problem hat…

Bei meiner weiteren Analyse ist mir aufgefallen, das anscheinen der Timeout nicht berücksichtigt wird.
192.168.2.230 gibt es bei mir nicht.


<?
$ip = '192.168.2.230';
$timeout = 500;

var_dump(Sys_Ping($ip, $timeout));
?>

hat eine Laufzeit von recht zuverlässig 10037ms mit der Ausgabe „bool(false)“.


<?
$ip = '192.168.2.230';

var_dump(Sys_Ping($ip, 2));
?>

hat eine Laufzeit von recht zuverlässig 10037ms mit der Ausgabe „bool(false)“.

192.168.1.230 gibt es bei mir auch nicht, aber mein Netzmaske ist 192.168.1.0/24


<?
$ip = '192.168.1.230';

var_dump(Sys_Ping($ip, 2));
?>

hat eine Laufzeit von recht zuverlässig 3030ms mit der Ausgabe „bool(false)“.


<?
$ip = '192.168.1.10';
$timeout = 500;

var_dump(Sys_Ping($ip, $timeout));
?>

hat eine Laufzeit von ca. 40ms mit der Ausgabe „bool(true)“.


<?
$ip = '192.168.1.10';
$timeout = 2;

var_dump(Sys_Ping($ip, $timeout));
?>

hat eine Laufzeit von ca. 40ms mit der Ausgabe „bool(true)“.

Da stimmt doch was nicht, oder?

Gruß,
Thorsten