Soru:
Bir web sitesine ping atın ve çevrimiçi / çevrimdışı ise bir çıktı açık mı?
Josh Bannister
2013-08-02 13:50:25 UTC
view on stackexchange narkive permalink

Python'da ve Pi'yi programlamada yeniyim, amacım oyun sunucusu veya web sitesi gibi bir sunucuya ping atmasını sağlamak ve bana bunun çevrimiçi mi yoksa çevrimdışı mı olduğunu söylemek.

Şimdiye kadar yaptım her yere baktı ama kimse bunun nasıl yapılacağına dair ayrıntılı talimat vermiyor. Python'da zaten program yapan biri için bunun bilindiğini düşündüğü kadar "kolay" olabilir.

Bu python'da bile mümkün mü ?

İki parçaya ayırın. Ana bilgisayarın pinglenebilir olup olmadığını ve bunun bir değişkenle sonuçlanıp sonuçlanmayacağını ve verilen çıktının nasıl açılıp kapatılacağını bulma Her iki görevi de çözdüğünüzde, sorun daha sonra bu iki çözümü birleştirmeye indirgenir.
Teşekkürler, bu gece PiBorg'u deneyeceğim, bu üçü arasında en basit olanı gibi görünüyor, ama yardım eden herkese teşekkür ederim. Henüz oy veremiyorum çünkü sadece 6 temsilcim var.
Dört yanıtlar:
PiBorg
2013-08-02 15:43:21 UTC
view on stackexchange narkive permalink

RPi.GPIO kitaplığı, GPIO'yu çalıştırmak için Raspbian'da mevcuttur ve istek kitaplığını kullanarak şunun gibi bir şey yapabilirsiniz:

  içe aktarma istekleri zaman ithalatı RPi.GPIO'yu GPIO.BCM) GPIO.setup (17, GPIO.OUT) True: response = request.get ('http://game-server.com') ise response.status_code == request.codes.ok: GPIO.output (17, GPIO.LOW) else: GPIO.output (17, GPIO.HIGH) time.sleep (1)  

Bir sorun olduğunda GPIO 17'yi açacak. her şey yolunda olduğunda kapanır.

Bu modüllerden herhangi birini yüklemeniz gerekiyorsa, bunu komut satırından (terminal) kullanarak yapın:

  sudo apt-get -y install python-dev python-setuptools python-rpi.gpio python-pipsudo pip yükleme istekleri  

Alternatif:

Gerçekleşmek istiyorsanız gecikmeler de, muhtemelen en basit yöntem aslında ping programını çağırmak ve sonuçları ayrıştırmaktır:

  içe aktarma istekleri zaman içe aktarma RPi.GPIO GPIOGPIO.setmode (GPIO. BCM) GPIO.setup (17, GPIO.OUT) True iken: # Sistem ping komutunu kullanarak ping gerçekleştirin (yalnızca bir ping) rawPingFile = os.popen ('ping -c 1% s'% (pingAddress)) rawPingData = rawPingFile.readlines () rawPingFile.close () # len (rawPingData) < 2 ise ping zamanını çıkartın: # DNS çözümlemesi veya yol bulunamadı = Gerçek gecikme = 0 else: index = rawPingData [1] .find (' time = ') eğer index == -1: # Ping başarısız oldu veya zaman d-out başarısız = True latency = 0 else: # Bir ping süremiz var, izole ediyoruz ve başarısız bir sayıya dönüştürüyoruz = False latency = rawPingData [1] [index + 5:] latency = latency [: latency.find (' ')] latency = float (latency) # Başarısız olursa çıktılarımızı ayarlayın: # GPIO.output'a ping atılamadı (17, GPIO.HIGH), başka: # Milisaniye cinsinden gecikmede depolanan ping
GPIO.output (17, GPIO.LOW) print '% f ms'% (gecikme)  

bu şekilde birçok LED kullanabilir ve ping süresine dayalı bir çubuk grafik oluşturabilirsiniz. örnek.

dotancohen
2013-08-02 14:12:36 UTC
view on stackexchange narkive permalink

python-istekleri kitaplığını kullanabilirsiniz:

  import requestresponse = request.get ('http://game-server.com') print ( int (response.status_code))  

Hızlı başlangıç ​​kılavuzu için buraya bakın: http://www.python-requests.org/en/latest/user/quickstart/

ImportError: Adlandırılmış modül isteği yok
"sudo pip yükleme istekleri"
-bash: pip: komut bulunamadı
`sudo apt-get -y install python-dev python-setuptools python-pip`
lenik
2013-08-02 15:38:34 UTC
view on stackexchange narkive permalink

İşte olası sonuçların çoğunu kontrol eden ve makul bir çıktı veren hızlı ve kirli bir yaklaşım:

  import socketfrom urllib2 import urlopen, URLError, HTTPErrorsocket.setdefaulttimeout (23) # saniyeurl cinsinden zaman aşımı = 'http://google.com/'try: response = urlopen (url) HTTPError dışında, e: print' Sunucu isteği yerine getiremedi. Nedeni: ', str (e.code) dışında URLError, e: print' Bir sunucuya ulaşamadık. Nedeni: ', str (e.reason) else: html = response.read () print' yanıt aldı! ' # bir şeyler yapın, ışığı açın / kapatın veya her neyse  
Bu, GPIO.output'un sonuna (18, True) eklediğimde ışığı yakmak için iyi çalışıyor. ancak sunucuyu bulamadığında ışığı kapatmasını sağlayamıyorum? herhangi bir öneri
Başta `GPIO.output (18, False) '' ekleyebilirsiniz (` try: 'ifadesinden önce), web sitesine erişildiğinde LED kısa bir süre yanıp sönecek ve her şey yolundaysa (veya değilse) tekrar yanacaktır. bir şey yanlış).
Alternatif olarak, iki "dış" bloğun sonuna "GPIO.output (18, False)" ekleyin, bu, yanıp sönmesini önleyecektir (istenmiyorsa)
SDsolar
2018-04-05 06:09:28 UTC
view on stackexchange narkive permalink

İşte sistemlerimi izlemek için kullandığım bazı programlar. Bunların herhangi bir varyasyonu, aşağıda açıklandığı gibi PiGPIO aracılığıyla sonuçlara etki eden bir program için temel olarak kullanılabilir.


Python'da fping gecikmeleri izlemek ve sistemlerin çalışıp çalışmadığını görmek için.

  sudo apt-get updatesudo apt-get install fping  

  alt işlemden içe aktar Popen, PIPE ... cmd = 'fping -C 1 -q www.myaddress.com'p = ​​Popen (cmd, stdout = PIPE, stderr = PIPE, shell = True) stdout, stderr = p. communication ()  

ÇIKTININ STERR İÇİNDE OLDUĞUNU VE BUNUN GİBİ GÖRÜNÜMÜNÜ NOT EDİN:

  50.87.249.67: 6.30 olumlu yanıt  

veya

  50.87.249.67: - yanıtsız  

VEYA

Bu alternatif cmd komut dizesini aynı kodda kullanabilirsiniz:

  alt işlem içe aktarma Popen, PIPE .. .cmd = 'fping www.myaddress.com'p = ​​Popen (cmd, stdout = PIPE, stderr = PIPE, shell = True) stdout, stderr = p.communicate ()  

ÇIKTININ STDERR İÇİNDE OLDUĞUNU VE BUNA BENZER OLDUĞUNU DİKKAT EDİN:

burada sonuç ya

  www.myaddress.com yaşıyor  

veya

  www.myaddress.com: Ad veya hizmet bilinmiyor  

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

O halde harici cihazları kontrol etmek için her zaman piGPIO

piGPIO Kitaplık Arayüzü

piGPIO Kitaplık Örnekleri


Ping gecikmesi izleyicisi için benzer bir yöntem kullanıyorum:

  #! / usr / bin / pythonimport os alt işlem içe aktarma Popen, PIPE veri saatinden içe aktarma datetimeos.system ('clear') os.chdir ("/ home / pi / pymon" tab = "\ t"  

while True:

  tt = datetime.now () ts = "" ts = str (getattr (tt, 'saat')) + ":" if getattr (tt, 'dakika') <10: ts = ts + '0'ss = ts + str (getattr (tt,' dakika ')) + ":"
getattr (tt, 'saniye') <10: ts = ts + '0'ts = ts + str (getattr (tt,' saniye ')) td = datetime.today () ds = "" ds = str (td. yıl) eğer td.month<10: ds = ds + "0" ds = ds + str (td.month) eğer td.day<10: ds = ds + "0" ds = ds + str (tg.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 = BORU, stderr = BORU, kabuk = Doğru) stdout, stderr = p.communicate () anahat = datestr + tab + timestr + tab + stderrf = open ("/ home / pi / pymon / today.dat "," a ") f.write (anahat) f.close () os.system (" tail -n 1 today.dat ") printtime.sleep (60.0)  

şuna benzeyen bir veri dosyası oluşturur:

  2018-04-04 00:17:52 50.87.249.67: 6.562018-04-04 00:18:52 50.87 .249.67: -2018-04-04 00:19:52 50.87.249.67: 7.412018-04-04 00:20:52 50.87.249.67: 10.99  

Satır - cod e>, 3 saniyede yanıtın olmadığı bir satırdır.

Bu çıktıyı bir gnuplot programıyla birlikte her şeyi planlamak için kullanıyorum.

  başlığı ayarla "Ping Zamanları" xlabel "Zaman" ayarla ylabel "Ping Zamanları" ayarla yrange [0: *] gridset zaman damgasını ayarla mouseunset logset anahtarı üst sol ayar xveri zaman seti zaman çizelgesi '% H:% M:% S'set xtics biçimi '% H:% M'set veri dosyası eksik "-" set y2ticsset terminal x11set stili dolgu katı 1.0plot 50 lw 1 lc rgb "siyah" notitle, \ 100 lw 1 lc rgb "gri" notitle , \ "today.dat" 2: 5 kullanarak lc rgb "red" t "Delay" pause 11rokunmak 

satırları ile 2: 5 atlayın ve canlı bir olay örgüsü elde etmek için:

enter image description here


Bu, farklı bir komut için kullandığım koda benzer:

Maksimum / minimum çalışma sıcaklığı nedir ?



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...