【问题标题】:Getting ConnectionError, while trying to connect to wifi network using python尝试使用python连接到wifi网络时出现ConnectionError
【发布时间】:2017-07-22 23:20:02
【问题描述】:

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

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

结果:

所以看起来它没有捕捉到这个错误。

【问题讨论】:

    标签: python raspberry-pi wifi raspbian


    【解决方案1】:

    ConnectionError 没有被捕获,因为它不是由 try 部分内的 scheme.activate() 调用引发的,而是由第 52 行的 except AssertionError 部分内的 scheme.activate() 调用引发的。

    我假设wifi 模块文档告诉您像这样捕获AssertionError,但这有点奇怪。 AssertionError 旨在用于捕获程序中的逻辑错误,IOW,如果程序逻辑正确,则应该永远不会发生的事情,它不应该用于捕获不良数据或不良环境条件.所以通常情况下,如果程序引发AssertionError,则表明程序本身需要修复。

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

    【讨论】:

    • 这个库相当小,并不能正确覆盖所有错误,因此以这种方式捕获AssertionError 是我的解决方法。我不确定您将try except 块放入while 循环中的想法是否可以解决任何问题,但您指出我的方向是正确的——我通过简单地在第52 行附近添加try except 块来解决这个问题,所以现在当scheme.activate() 引发错误时,它正在被正确处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多