在尝试使用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()
所以看起来它不是赶上这个错误。
这ConnectionError
没有被捉住,因为它不是由try
部分内scheme.activate()
呼叫提出,它正在募集的scheme.activate()
呼叫线52,except AssertionError
段内。
我假设wifi
模块文档告诉你这样捕获AssertionError
,但它有点奇怪。 AssertionError
旨在用于捕获程序中的逻辑错误,IOW,应该从不发生如果程序逻辑正确,它不应该用于捕获不良数据或恶劣环境条件。所以通常情况下,如果一个程序提出AssertionError
这表示程序本身需要修复。
我不熟悉wifi
模块,所以我不知道如何正确地解决您的问题。但是代码似乎在激活由该except AssertionError
部分中的Scheme.find
调用返回的Scheme时遇到问题。我想你可以把整个try.. except block
放在一个while
循环中,并在最后一小段时间延迟,并保持循环,直到你得到一个工作连接。
这个库很小,不能正确覆盖每一个错误,所以通过这种方式捕获'AssertionError'是我的解决方法。我不确定您的想法是否在'while'循环中尝试except'块可以解决任何问题,但是您指出我的方向正确 - 我设法通过在第52行周围添加'try except'块来解决此问题,所以现在当'scheme.activate()'引发错误时,它正在被正确处理。 – PotatoBox