Ich habe mich in den letzten Tagen mit der Möglichkeit auseinandergesetzt, Geräte im WLAN zu entdecken und daraufhin diverse Aktionen auszuführen. Eine davon ist die Methode die IP anzupingen.
Voraussetzung ist, dass das anzupingende Gerät (z.B. Smartphone) im Heimnetz eine feste IP vom Router zugewiesen bekommen hat. Der Programmieraufwand in Python ist sehr gering und auch leicht umzusetzen:
Wichtig ist zuerst der import von „os“.
import os
Dadurch können wir Befehle an die Shell senden. Und genau das machen wir nun:
ip = "localhost" os.system("ping " + ip)
Der Einfachheit halber, wird in diesem Beispiel „localhost“ angepingt. Dieser sollte in der Regel immer antworten 😉
Führt man das Script nun aus, so erhält man folgende Ausgabe:
Es wird deutlich, dass nun so lange gepingt wird, bis man das Programm mit STRG+C abbricht. Um das zu ändern, kann man an den Befehl die Anzahl der Zyklen (c) anhängen. Dies geschieht wie folgt:
os.system("ping -c 1 " + ip)
Jetzt wird der Ping genau einmal ausgeführt.
Um nun weiter mit dem Ergebnis des Pings zu arbeiten, schauen wir uns die Ausgabe an. Mit der Zeile:
print os.system("ping -c 1 " + ip)
sollte im Fall „localhost“ eine „0“ ausgegeben werden. Eine nicht erreichbare Adresse gibt z.B den Wert „256“ zurück.
Also kann nun eine einfach „If-Abfrage“ gebaut werden, die eine Aktion ausführt, wenn die IP antwortet, bzw nicht antwortet:
if os.system("ping -c 1 " + ip) == 0: print "IP ist erreichbar" else: print "IP ist NICHT erreichbar"
Ich habe die Methode z.B. angewendet damit der Pi erkennt ob ich Zuhause bin.
Handy im WLAN = Ping erfolgreich (Zuhause)
Handy NICHT im WLAN = Ping NICHT erfolgreich (Unterwegs)
Bei mir gibt die Konsole immer nur den wert 512 aus. Egal welche Ip.
Mein Test-code:
import os
Import time
ip="localhost"
while (True):
os.system ("ping -c 1"+ip)
print os.system ("ping -c 1"+ip)
time.sleep(1)
Weis jemand was ich falsch mache??
LG André
while (True):
ist Falsch geschrieben. Das True ist ohne Klammern (jedenfalls bei Python 2.7)
Hallo,
wenn ich die IF Abfrage in mein Script einbaue bekomme ich folgende Fehlermeldung:
SyntaxError: EOL while scanning string literal
Was mache ich denn da falsch?
Gruß
Walker
Hey, hast Du alles genau kopiert? Das klingt nach einem Syntaxfehler. Überprüfe mal alle "-Zeichen.
Ansonsten poste mal deinen Code.
Gruß
Christoph
Hallo, der Code hat aus meiner Sicht 3 Fehler
1. while True: —> ohne Klammer
2. danach TAB für die folgenden 3 Zeilen wenn es nicht von der Konsole gestartet wird
3. nach der 1 muss ein blank
while True:
os.system (“ping -c 1 ″+ip)
print os.system (“ping -c 1 ″+ip)
time.sleep(1)
Hallo, ich wollte das mal ausprobieren und hab alles kopiert und meine ip eingegeben aber es funktioniert nicht kannst du mir helfen?
Hallo,
kannst du ein paar mehr Infos geben? Welche Fehlermeldung erhälst du?
Was geschieht genau nach Ausführen des Programms?
Gruß
Christoph
Habe eine ähnliche (Anfänger!) Aufgabenstellung: bei im WLAN erkannter IP soll das Script allerdings (erst mal) Ruhe geben.
Ich möchte das Script als Türöffner nutzen: loggt sich mein Handy in mein WLAN ein, soll der elektr. Türöffner öffnen (für 1 Sek. schliessen). Bin ich dann eingeloggt (=zu Hause) soll das Script / der Türöffner natürlich gar nix machen, sondern erst, wenn ich wieder eine gewisse Zeit (hier 60 Min.) außer Haus (=ausgeloggt) bin.
An der Definition ‚LED‘ bitte nicht stören.
Mein Code funktioniert aber nicht (steckt sicher voller [Denk-]Fehler!).
Bitte Denkanstösse zum Überprüfen warum da was nicht funktioniert.
#!/usr/bin/python
import RPi.GPIO as GPIO
import os
Import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.cleanup ()
LED = 23
GPIO.setup(LED, GPIO.OUT)
# setzt öffner -sicherheitshalber- auf AUS
GPIO.output (LED, 1)
ip=“192.168.178.XX“
# ping alle 60 sek nach der ip
if os.system(„ping -c 60 “ + ip) != 0:
# wenn ip nicht gefunden wurde mache garnix bzw. lasse/schalte öffner auf AUS
GPIO.output (LED, 1)
else:
# wenn ip gefunden wurde mache folgendes
# schalte öffner für eine sek an
GPIO.output (LED, 0)
time.sleep (1)
GPIO.output (LED, 1)
# pinge dann alle 60 Min. erneut ob ip immer noch eingeloggt
while True:
os.system(„ping -c 3600 “ + ip) == 0:
# mache garnix bzw. lasse/schalte öffner auf AUS
GPIO.output (LED, 1)
»Zugriff verweigert. Für die Option „-c“ sind Administratorberechtigungen erforderlich.«
Nun, ja…