【问题标题】:Check if a Raspberry Pi is connected to internet检查树莓派是否连接到互联网
【发布时间】:2018-11-01 19:09:38
【问题描述】:

我希望我的 Python 脚本检查它是否在线。在 Stack Overflow 上找到了很多答案,但由于一些奇怪的原因都失败了。

场景:Raspberry Pi 3b+ 通过 Wifi 连接到我的路由器。那个路由器通过它的电缆连接到互联网

我希望确定 Raspberry 是否有互联网连接,以便在需要时更改其数据源。在这里搜索了一天后,我发现大多数解决方案都使用套接字,更好的是套接字,而最坏的是套接字(仍然试图看看它是否改变了任何东西,但没有)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 连接到计算机,因此,您唯一能做的就是检查您是否可以事实上连接到给定的远程主机。但是,不要捕获并忽略每个引发的异常;至少将异常记录到标准错误中,这样您就可以查看在尝试建立连接时实际发生了什么(如果有的话)。
  • 好吧,如果我没有连接,如何连接到 8.8.8.8,谷歌,不会引发异常。我确实尝试通过示例来捕捉 OSError,当然它是相同的

标签: python python-2.7 raspberry-pi


【解决方案1】:

你知道android设备如何检查连接的wifi是否连接到互联网吗?是的,它只是不断向 Google 发送消息,并希望得到预期的响应。

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

【讨论】:

    【解决方案2】:

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

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

    是的,没有例外,这是一个心跳,我想定期检查我是否可以访问互联网,所以无论错误是什么,我都希望它发出离线信号

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

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多