Pour me connecter au réseau depuis mon Raspberry Pi, j'utilise this python library. Mon problème est que je reçois constamment ConnectionError, même si je le gère dans try/except block, ou du moins je pense que je gère. Ce programme analyse l'interface radio pour les réseaux Wi-Fi, puis exclut ceux sans préfixe correspondant, puis trie les correspondants par qualité de signal. Après cela, connectToGateway() essaie de se connecter au meilleur et s'il échoue, il cherche le second dans la liste et ainsi de suite. Si le schéma d'un réseau a été enregistré auparavant, il le réutilise (c'est ce que gère l'exception AssertionError). Mon code:Obtenir ConnectionError, tout en essayant de se connecter au réseau wifi en utilisant python
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()
il semble donc que ça ne pas attraper cette erreur.
Cette librairie est plutôt petite et ne couvre pas toutes les erreurs correctement, donc attraper 'AssertionError' de cette façon est ma solution de contournement. Je ne sais pas si votre idée de placer le bloc try try dans une boucle while corrigera quoi que ce soit, mais vous m'avez indiqué dans la bonne direction - j'ai réussi à résoudre ce problème en ajoutant simplement un bloc try try autour de la ligne 52 , alors maintenant quand 'scheme.activate()' déclenche une erreur, il est géré correctement. – PotatoBox