Pingen Sie eine Website an und schalten Sie eine Ausgabe ein, wenn Sie online / offline sind?


7

Ich bin neu in Python und programmiere den Pi. Mein Ziel ist es, einen Server wie einen Spieleserver oder eine Website zu pingen und mir mitzuteilen, ob er online oder offline ist.

Bisher habe ich überall gesucht, aber niemand gibt detaillierte Anweisungen dazu. Es kann sein, dass es für jemanden, der bereits in Python programmiert, so "einfach" ist, dass er annimmt, dass es bekannt ist.

Ist das überhaupt in Python möglich?


1
Trennen Sie es in zwei Teile. Finden Sie heraus, ob der Host gepingt werden kann und dies zu einer Variablen führt, und wie Sie die angegebene Ausgabe ein- und ausschalten. Wenn Sie beide Aufgaben gelöst haben, reduziert sich das Problem auf die Kombination der beiden Lösungen.
Thorbjørn Ravn Andersen

Danke, ich werde PiBorgs einen heute Abend ausprobieren, es scheint der einfachste von allen dreien zu sein, aber danke an alle, die geholfen haben. Ich kann noch nicht upvoten, weil ich nur 6 Wiederholungen habe.
Josh Bannister

Antworten:


5

Hier ist ein schneller und schmutziger Ansatz, der die meisten möglichen Ergebnisse überprüft und eine angemessene Ausgabe liefert:

import socket
from urllib2 import urlopen, URLError, HTTPError

socket.setdefaulttimeout( 23 )  # timeout in seconds

url = 'http://google.com/'
try :
    response = urlopen( url )
except HTTPError, e:
    print 'The server couldn\'t fulfill the request. Reason:', str(e.code)
except URLError, e:
    print 'We failed to reach a server. Reason:', str(e.reason)
else :
    html = response.read()
    print 'got response!'
    # do something, turn the light on/off or whatever

Dieser funktioniert gut, um ein Licht einzuschalten, wenn ich am Ende GPIO.output (18, True) hinzufüge. Allerdings kann ich nicht scheinen, es das Licht auszuschalten, wenn es den Server nicht finden kann? irgendwelche Vorschläge
Josh Bannister

Sie können GPIO.output(18, False)am Anfang (vor der try:Anweisung) hinzufügen , dass die LED kurz blinkt, wenn auf die Website zugegriffen wird, und sich wieder einschaltet, wenn alles in Ordnung ist (oder nicht, wenn etwas nicht stimmt).
Lenik

Alternativ können Sie GPIO.output(18, False)am Ende der beiden exceptBlöcke hinzufügen , um ein Blinken zu verhindern (falls nicht erwünscht)
PiBorg

8

Die RPi.GPIO-Bibliothek ist in Raspbian verfügbar, um GPIO zu steuern. Aufbauend auf der Verwendung der Anforderungsbibliothek können Sie Folgendes tun:

import requests
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

while True:
    response = requests.get('http://game-server.com')
    if response.status_code == requests.codes.ok:
        GPIO.output(17, GPIO.LOW)
    else:
        GPIO.output(17, GPIO.HIGH)
    time.sleep(1)

Dadurch wird GPIO 17 eingeschaltet, wenn ein Problem auftritt. aus, wenn alles in Ordnung ist.

Wenn Sie eines dieser Module installieren müssen, tun Sie dies über die Befehlszeile (Terminal) mit:

sudo apt-get -y install python-dev python-setuptools python-rpi.gpio python-pip
sudo pip install requests

Alternative:

Wenn Sie auch tatsächliche Latenzen erhalten möchten, ist es wahrscheinlich die einfachste Methode, das pingProgramm tatsächlich aufzurufen und die Ergebnisse zu analysieren:

import requests
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

while True:
    # Perform the ping using the system ping command (one ping only)
    rawPingFile = os.popen('ping -c 1 %s' % (pingAddress))
    rawPingData = rawPingFile.readlines()
    rawPingFile.close()
    # Extract the ping time
    if len(rawPingData) < 2:
        # Failed to find a DNS resolution or route
        failed = True
        latency = 0
    else:
        index = rawPingData[1].find('time=')
        if index == -1:
            # Ping failed or timed-out
            failed = True
            latency = 0
        else:
            # We have a ping time, isolate it and convert to a number
            failed = False
            latency = rawPingData[1][index + 5:]
            latency = latency[:latency.find(' ')]
            latency = float(latency)
    # Set our outputs
    if failed:
        # Could not ping
        GPIO.output(17, GPIO.HIGH)
    else:
        # Ping stored in latency in milliseconds
        GPIO.output(17, GPIO.LOW)
        print '%f ms' % (latency)

Auf diese Weise können Sie beispielsweise viele LEDs verwenden und ein Balkendiagramm erstellen, das auf der Ping-Zeit basiert.



0

Hier sind einige Programme, mit denen ich meine Systeme überwache. Jede Variation davon könnte als Grundlage für ein Programm verwendet werden, das wie unten beschrieben über PiGPIO auf die Ergebnisse einwirkt.


fping in Python, um Verzögerungen zu überwachen und festzustellen, ob Systeme aktiv sind.

sudo apt-get update
sudo apt-get install fping

from subprocess import Popen, PIPE
.
.
.
cmd = 'fping -C 1 -q www.myaddress.com'
p = Popen(cmd,stdout=PIPE, stderr=PIPE, shell=True)
stdout, stderr = p.communicate()

Beachten Sie, dass der Ausgang in stderr ist und so aussieht:

50.87.249.67 : 6.30       for a positive response

oder

50.87.249.67 : -          for a non response

ODER

Sie können diese alternative cmdBefehlszeichenfolge im selben Code verwenden:

from subprocess import Popen, PIPE
.
.
.
cmd = 'fping www.myaddress.com'
p = Popen(cmd,stdout=PIPE, stderr=PIPE, shell=True)
stdout, stderr = p.communicate()

Beachten Sie, dass der Ausgang in stderr ist und so aussieht:

wo das Ergebnis entweder ist

www.myaddress.com is alive

oder

www.myaddress.com: Name or service not known

-----------------------------------------------

Um dann externe Geräte zu steuern, empfehle ich immer piGPIO

piGPIO-Bibliotheksschnittstelle

Beispiele für piGPIO-Bibliotheken


Ich verwende eine ähnliche Methode für einen Ping-Delay-Monitor:

#!/usr/bin/python
import os 
import time 
from subprocess import Popen, PIPE
from datetime import datetime
os.system('clear') 
os.chdir("/home/pi/pymon"
tab = "\t"

während wahr:

tt = datetime.now()
ts = " "
ts = str(getattr(tt,'hour')) + ":"
if getattr(tt,'minute')<10: 
    ts = ts + '0'
ss = ts + str(getattr(tt,'minute')) + ":"
if getattr(tt,'second')<10: 
  ts = ts + '0'
ts = ts + str(getattr(tt,'second'))
td = datetime.today()
ds = " "
ds = str(td.year)
if td.month<10 :
    ds = ds +"0"
ds = ds + str(td.month)
if td.day<10 :
    ds = ds + "0"
ds = ds + str(td.day) 
datestr   = str(datetime.now().date())
datestr   = datestr[:10]            
timestr   = str(datetime.now().time())
timestr   = timestr[:8]

cmd = 'fping -C 1 -q www.SDsolarBlog.com'
p = Popen(cmd,stdout=PIPE, stderr=PIPE, shell=True)
stdout, stderr = p.communicate()

outline = datestr + tab + timestr + tab + stderr

f = open("/home/pi/pymon/today.dat","a")
f.write(outline)
f.close()

os.system("tail -n 1 today.dat")
print

time.sleep(60.0)

Dadurch wird eine Datendatei erstellt, die wie folgt aussieht:

2018-04-04  00:17:52    50.87.249.67 : 6.56
2018-04-04  00:18:52    50.87.249.67 : -
2018-04-04  00:19:52    50.87.249.67 : 7.41
2018-04-04  00:20:52    50.87.249.67 : 10.99

Die Zeile mit dem -ist eine Zeile, in der innerhalb von 3 Sekunden keine Antwort erfolgte.

Ich benutze diese Ausgabe mit einem Gnuplot-Programm, um alles zu zeichnen.

set title "Ping Times"
set xlabel "Time"
set ylabel "Ping Times"
set yrange [0:*]
set grid
set timestamp
unset mouse
unset log
set key top left
set xdata time
set timefmt '%H:%M:%S'
set xtics format '%H:%M'
set datafile missing "-"
set y2tics
set terminal x11
set style fill solid 1.0
plot 50 lw 1 lc rgb "black" notitle, \
    100 lw 1 lc rgb "gray" notitle, \
    "today.dat" using 2:5 skip 2 with lines lc rgb "red" t "Delay"
pause 11
reread     

um eine Live-Handlung zu bekommen:

Geben Sie hier die Bildbeschreibung ein


Dies ähnelt dem Code, den ich für einen anderen Befehl verwende:

Was ist die maximale / minimale Betriebstemperatur?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.