在尝试使用python连接到wifi网络时获取ConnectionError

问题描述:

要从我的Raspberry Pi连接到网络,我正在使用this python library。我的问题是,我经常得到ConnectionError,即使我在try/except块中处理它,或者至少我认为我正在处理。 该程序扫描wifi网络的空中接口,然后排除没有匹配前缀的空中接口,然后按信号质量对匹配的网络进行排序。之后,connectToGateway()尝试连接到最好的一个,如果失败,它会在列表中寻找第二个,依此类推。如果之前保存了某个网络的方案,则会重新使用它(这是AssertionError异常处理的原因)。 我的代码:在尝试使用python连接到wifi网络时获取ConnectionError

from wifi import Cell, Scheme 
from collections import namedtuple 
from operator import attrgetter 
from wifi.exceptions import ConnectionError 
from optparse import OptionParser 


class NetworkConnection: 
    def __init__(self, prefix, interface, password): 
     self.prefix = prefix 
     self.interface = interface 
     self.password = password 

    def discover_avalible_networks(self, interface=None): 
     all_networks = [] 
     interface = self.interface 
     avalible_networks = Cell.all(interface) 
     for network in avalible_networks: 
      all_networks.append(network) 
     return all_networks 

    def select_appropriate_networks(self, prefix=None): 
     appropriate_network = namedtuple('network', 'ssid quality encrypted encryption_type') 
     appropriate_networks = [] 
     prefix = self.prefix 
     for network in self.discover_avalible_networks(): 
      if network.ssid.startswith(prefix): 
       appropriate_networks.append(
       appropriate_network(network.ssid, network.quality, network.encrypted, network.encryption_type)) 
     return appropriate_networks 

    def sort_appropriate_networks(self): 
     unsorted_appropriate_networks = self.select_appropriate_networks() 
     sorted_appropriate_networks = sorted(unsorted_appropriate_networks, key=attrgetter('quality'), reverse=True) 
     return sorted_appropriate_networks 

    def connect_to_gateway(self, interface=None, password=None): 
     interface = self.interface 
     password = self.password 
     networks = self.sort_appropriate_networks() 
     for network in networks: 
      try: 
       print("Trying to connect to {}").format(network.ssid) 
       scheme = Scheme.for_cell(interface, network.ssid, network, password) 
       scheme.save() 
       scheme.activate() 
       print("Connected to {}").format(network.ssid) 
       break 
      except AssertionError: 
       scheme = Scheme.find(interface, network.ssid) 
       scheme.activate() 
       print("Connected to {}").format(network.ssid) 
       break 
      except ConnectionError: 
       print("Couldn't connect to {}").format(network.ssid) 
       scheme = Scheme.find(interface, network.ssid) 
       scheme.delete() 
       continue 

if __name__ == "__main__": 
    parser = OptionParser() 
    parser.add_option('-p', '--prefix', dest='prefix', help="Specify gateway ssid prefix") 
    parser.add_option('-i', '--interface', dest='interface', help="Specify name of wireless interface of choice") 
    parser.add_option('-q', '--password', dest='password', 
         help="Specify password for the wireless network of choice") 
    options, args = parser.parse_args() 
    wireless_connection = NetworkConnection(prefix=options.prefix, interface=options.interface, 
              password=options.password) 
    wireless_connection.connect_to_gateway() 

和结果: enter image description here

所以看起来它不是赶上这个错误。

ConnectionError没有被捉住,因为它不是由try部分内scheme.activate()呼叫提出,它正在募集的scheme.activate()呼叫线52,except AssertionError段内。

我假设wifi模块文档告诉你这样捕获AssertionError,但它有点奇怪。 AssertionError旨在用于捕获程序中的逻辑错误,IOW,应该从不发生如果程序逻辑正确,它不应该用于捕获不良数据或恶劣环境条件。所以通常情况下,如果一个程序提出AssertionError这表示程序本身需要修复。

我不熟悉wifi模块,所以我不知道如何正确地解决您的问题。但是代码似乎在激活由该except AssertionError部分中的Scheme.find调用返回的Scheme时遇到问题。我想你可以把整个try.. except block放在一个while循环中,并在最后一小段时间延迟,并保持循环,直到你得到一个工作连接。

+0

这个库很小,不能正确覆盖每一个错误,所以通过这种方式捕获'AssertionError'是我的解决方法。我不确定您的想法是否在'while'循环中尝试except'块可以解决任何问题,但是您指出我的方向正确 - 我设法通过在第52行周围添加'try except'块来解决此问题,所以现在当'scheme.activate()'引发错误时,它正在被正确处理。 – PotatoBox