Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取ConnectionError,同时尝试使用python连接到wifi网络_Python_Raspberry Pi_Wifi_Raspbian - Fatal编程技术网

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

获取ConnectionError,同时尝试使用python连接到wifi网络,python,raspberry-pi,wifi,raspbian,Python,Raspberry Pi,Wifi,Raspbian,要从我的Raspberry Pi连接到网络,我正在使用。我的问题是,即使我在try/except块中处理它,或者至少我认为我正在处理它,我还是不断地得到ConnectionError。 该程序扫描无线网络的空中接口,然后排除没有匹配前缀的网络,然后根据信号质量对匹配的网络进行排序。之后,connectToGateway()尝试连接到最好的一个,如果失败,它将在列表中查找第二个,以此类推。若之前保存了某个网络的scheme,它将重用它(这就是AssertionErrorException所处理的)

要从我的Raspberry Pi连接到网络,我正在使用。我的问题是,即使我在try/except块中处理它,或者至少我认为我正在处理它,我还是不断地得到ConnectionError。 该程序扫描无线网络的空中接口,然后排除没有匹配前缀的网络,然后根据信号质量对匹配的网络进行排序。之后,connectToGateway()尝试连接到最好的一个,如果失败,它将在列表中查找第二个,以此类推。若之前保存了某个网络的scheme,它将重用它(这就是AssertionErrorException所处理的)。 我的代码:

结果:


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

没有捕捉到
连接错误,因为它不是由
方案引发的。activate()
调用在
try
部分中,它是由第52行的
方案引发的。activate()
调用,在
部分内,断言错误除外

我假设
wifi
模块文档会告诉您捕捉类似的
AssertionError
,但这有点奇怪
AssertionError
用于捕获程序中的逻辑错误,注意,如果程序逻辑正确,则不应使用它捕获坏数据或坏环境条件。因此,通常情况下,如果程序引发断言错误,则表明程序本身需要修复


我不熟悉
wifi
模块,因此我不知道如何正确解决您的问题。但是代码似乎在激活由
方案返回的方案时遇到问题。请在该
部分中查找
调用,除了AssertionError
部分。我想你可以把整个
放进去试试。。除了
内部的block
,而
在最后以一个小的时间延迟进行循环,并保持循环,直到您获得一个工作连接。

这个库非常小,不能正确地覆盖所有错误,因此用这种方式捕获
断言者错误是我的解决方法。我不确定你在
while
循环中放置
try-except
块的想法是否能解决任何问题,但你给我指明了正确的方向-我只需在第52行附近添加
try-except
块,就解决了这个问题,所以现在当
scheme.activate()
引发错误时,它被正确地处理了。
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()