检查是否连接到互联网

时间:2018-11-01 19:09:39

标签: python python-2.7 raspberry-pi

开始大量搜索有关如何让我的python脚本检查是否在线的信息。在stackoverflow上找到了很多答案,但是由于某些奇怪的原因而全部失败了

场景:通过Wifi连接到我的路由器的树莓派3b +。该路由器通过其电缆连接到互联网

我希望确定树莓是否已连接互联网,以便在需要时更改其数据源。在这里搜索了一天之后,我发现大多数解决方案都使用socket,而其中最好的解决方案是使用socket,最坏的解决方案(仍然试图查看它是否有任何改变,但没有改变)urllib.urlopen

这是我尝试的方法:

def checkOnlineState(self, addr='http://www.google.com'):
    try:
        urllib2.urlopen(addr, timeout=2)

        if not self._onlineMode:
            print('Internet connection is back!')

        self._onlineMode = True
        return
    except:
        pass

    if self._onlineMode:
        print('I lost internet connection')

    self._onlineMode = False

我也尝试过使用套接字,所以我使用的不是urllib2.urlopen

socket.create_connection((addr, 80), timeout=2)

socket.create_connection(('8.8.8.8', 0), timeout=2)

无论我做什么,除了输入格式错误的ip或url,都说我在线。我怎么知道好吧,checkOnlineState循环运行,并且如果我断开Internet电缆的连接,树莓派仍然表示它处于在线状态!

有人可以帮忙把这个形象化吗?

2 个答案:

答案 0 :(得分:1)

您知道Android设备如何检查连接的wifi是否已连接到互联网吗?是的,它只是一直向Google发送消息,希望能收到预期的答复。

所以你必须做同样的事情。

答案 1 :(得分:0)

所以,在@Sraw回答之后,这就是我最终要做的:

req = requests.get('http://clients3.google.com/generate_204')
if req.status_code != 204:
    raise Exception

是的,也不例外,这是一个心跳,我想定期检查我是否可以访问互联网,因此无论发生什么错误,我都希望它表示为脱机

这不会失败,因为我们检查了请求状态。我在Stackoverflow上的不同问题上发现了这种方法