Python 检查树莓Pi是否连接到internet

Python 检查树莓Pi是否连接到internet,python,python-2.7,raspberry-pi,Python,Python 2.7,Raspberry Pi,我想让我的Python脚本检查它是否在线。在这里找到了很多关于堆栈溢出的答案,但由于一些奇怪的原因,所有答案都失败了 场景:树莓Pi 3b+通过Wifi连接到我的路由器。也就是说,路由器是通过电缆连接到互联网的 我希望确定树莓是否有互联网连接,以便在需要时更改其数据源。在这里搜索了一天之后,我发现大多数解决方案使用套接字,对于较好的解决方案,对于最差的解决方案(仍然尝试查看是否有任何更改,但没有更改)urllib.urlopen 以下是我尝试的: def checkOnlineState(sel

我想让我的Python脚本检查它是否在线。在这里找到了很多关于堆栈溢出的答案,但由于一些奇怪的原因,所有答案都失败了

场景:树莓Pi 3b+通过Wifi连接到我的路由器。也就是说,路由器是通过电缆连接到互联网的

我希望确定树莓是否有互联网连接,以便在需要时更改其数据源。在这里搜索了一天之后,我发现大多数解决方案使用套接字,对于较好的解决方案,对于最差的解决方案(仍然尝试查看是否有任何更改,但没有更改)
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而不是urllib2.urlopen

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


无论我做什么,除了输入错误的ip或url,都表示我在线。我怎么知道?好吧,checkOnlineState是循环运行的,如果我取下网线,覆盆子仍然声明它是在线的

您知道android设备如何检查连接的wifi是否连接到互联网吗?是的,它只是不断地向谷歌发送信息,希望能得到预期的回应


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

你知道android设备如何检查连接的wifi是否连接到互联网吗?是的,它只是不断地向谷歌发送信息,希望能得到预期的回应


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

那么,在@Sraw给出答案之后,我终于做到了:

req = requests.get('http://clients3.google.com/generate_204')
if req.status_code != 204:
    raise Exception
是的,没有例外,这是一个心跳信号,我想定期检查我是否可以访问internet,所以无论错误是什么,我希望它发出脱机信号


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

因此,在@Sraw的回答之后,我终于做到了:

req = requests.get('http://clients3.google.com/generate_204')
if req.status_code != 204:
    raise Exception
是的,没有例外,这是一个心跳信号,我想定期检查我是否可以访问internet,所以无论错误是什么,我希望它发出脱机信号


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

你从未真正连接到互联网;您只能通过Internet连接到计算机,因此,您唯一能做的就是检查您是否可以连接到给定的远程主机。不过,不要捕捉并忽略所有引发的异常;至少将异常记录到标准错误中,这样您就可以看到在尝试建立连接时实际发生了什么(如果有的话)。好吧,如果我没有连接,那么连接到google的8.8.8.8怎么可能不会引发异常。我确实试着抓住每个例子中的OSError,当然,你从来没有真正连接到互联网;您只能通过Internet连接到计算机,因此,您唯一能做的就是检查您是否可以连接到给定的远程主机。不过,不要捕捉并忽略所有引发的异常;至少将异常记录到标准错误中,这样您就可以看到在尝试建立连接时实际发生了什么(如果有的话)。好吧,如果我没有连接,那么连接到google的8.8.8.8怎么可能不会引发异常。我试着抓住每个例子中的OSError,当然是一样的