Ping một trang web và bật đầu ra nếu trực tuyến / ngoại tuyến?


7

Tôi chưa quen với python và lập trình Pi, mục đích của tôi là làm cho nó ping một máy chủ như máy chủ chơi game hoặc trang web và cho tôi biết nếu nó trực tuyến hay ngoại tuyến.

Cho đến nay tôi đã tìm kiếm khắp nơi nhưng không ai đưa ra hướng dẫn chi tiết về cách thực hiện, có thể nó rất "dễ dàng" đối với những người đã lập trình trong python mà họ cho rằng nó được biết đến.

Điều này thậm chí có thể trong python?


1
Tách nó thành hai phần. Tìm hiểu xem máy chủ có thể được ping hay không và có kết quả đó trong một biến và cách bật / tắt đầu ra đã cho. Khi bạn đã giải quyết cả hai nhiệm vụ, vấn đề sẽ được giảm xuống thành kết hợp hai giải pháp.
Thorbjørn Ravn Andersen

Cảm ơn bạn, tôi sẽ thử một lần cho PiBorg tối nay có vẻ như đơn giản nhất trong cả ba, nhưng cảm ơn tất cả những người đã giúp đỡ. Tôi chưa thể upvote vì tôi chỉ có 6 rep.
Josh Bannister

Câu trả lời:


5

đây là một cách tiếp cận nhanh và bẩn, kiểm tra hầu hết các kết quả có thể xảy ra và đưa ra một đầu ra hợp lý:

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

Cái này hoạt động tốt để bật đèn khi tôi thêm vào GPIO.output kết thúc (18, True). tuy nhiên tôi dường như không thể làm cho nó tắt đèn khi nó không thể tìm thấy máy chủ? bất kỳ đề xuất nào
Josh Bannister

bạn có thể thêm GPIO.output(18, False)vào lúc bắt đầu (trước try:câu lệnh), đèn LED sẽ nhấp nháy ngay khi trang web được truy cập và bật lại nếu mọi thứ đều ổn (hoặc không, nếu có gì đó không ổn).
lenik

Hoặc thêm GPIO.output(18, False)vào cuối hai exceptkhối, điều này sẽ ngăn nó nhấp nháy (nếu không mong muốn)
PiBorg

8

Thư viện RPi.GPIO có sẵn bằng Raspbian để lái GPIO, dựa trên việc sử dụng thư viện yêu cầu bạn có thể làm một cái gì đó như thế này:

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)

Sẽ bật GPIO 17 khi có sự cố. tắt khi tất cả đều ổn

Nếu bạn cần cài đặt bất kỳ mô-đun nào trong số này, hãy thực hiện từ dòng lệnh (terminal) bằng cách sử dụng:

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

Thay thế:

Nếu bạn cũng muốn nhận được độ trễ thực tế, có lẽ phương pháp đơn giản nhất là thực sự gọi pingchương trình và phân tích kết quả:

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)

bằng cách này, bạn có thể sử dụng nhiều đèn LED và tạo một biểu đồ thanh dựa trên thời gian ping chẳng hạn.


4

Bạn có thể sử dụng thư viện python-request :

import requests

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

Xem tại đây để biết hướng dẫn bắt đầu nhanh: http://www.python-requests.org/en/latest/user/quickstart/


ImportError: Không có mô-đun có tên yêu cầu
lenik

sudo pip install requests
dotancohen

-bash: pip: lệnh không tìm thấy
lenik

sudo apt-get -y install python-dev python-setuptools python-pip
PiBorg

0

Dưới đây là một số chương trình tôi sử dụng để giám sát hệ thống của mình. Bất kỳ biến thể nào trong số này sẽ có thể được sử dụng làm cơ sở cho một chương trình hoạt động dựa trên kết quả thông qua PiGPIO như được mô tả dưới đây.


fping trong Python để theo dõi sự chậm trễ và để xem các hệ thống còn sống hay không.

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()

LƯU Ý R OUTNG ĐẦU RA LÀ TRONG stderr VÀ CUỘC SỐNG NHƯ NÀY:

50.87.249.67 : 6.30       for a positive response

hoặc là

50.87.249.67 : -          for a non response

HOẶC LÀ

Bạn có thể sử dụng cmdchuỗi lệnh thay thế này trong cùng một mã:

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

LƯU Ý R OUTNG ĐẦU RA LÀ TRONG stderr VÀ CUỘC SỐNG NHƯ NÀY:

kết quả là một trong hai

www.myaddress.com is alive

hoặc là

www.myaddress.com: Name or service not known

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

Sau đó, để kiểm soát các thiết bị bên ngoài, tôi luôn khuyên bạn nên piGPIO

Giao diện thư viện piGPIO

Ví dụ về thư viện piGPIO


Tôi sử dụng một phương pháp tương tự cho màn hình trễ ping:

#!/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"

trong khi Đúng:

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)

tạo ra một tệp dữ liệu trông giống như:

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

Dòng với -dòng là không có phản hồi trong 3 giây.

Tôi sử dụng đầu ra này với một chương trình gnuplot để vẽ ra tất cả.

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     

để có được một cốt truyện trực tiếp:

nhập mô tả hình ảnh ở đây


Điều này tương tự với mã tôi sử dụng cho một lệnh khác:

Nhiệt độ chạy tối đa / tối thiểu là bao nhiêu?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.