9.4. Uspostavljanje veze¶
Sloj veze obrađen na prethodnoj stranici uglavnom je automatski, ali postoji jedno mjesto na kojem Python skripta mora uskočiti: reći kameri kojoj se mreži treba pridružiti. Dok taj korak ne uspije, nijedna od mrežnih značajki koje ostatak ovog odjeljka pokriva neće raditi.
9.4.1. Modul network¶
Modul network izlaže Pythonu mrežni hardver kamere. Točan skup sučelja ovisi o ploči: mnoge kamere imaju bežični čip i izlažu klasu WLAN (nazvanu po Wireless Local Area Network); neke ploče također imaju ugrađeni Ethernet priključak i izlažu klasu LAN (nazvanu po Local Area Network, tj. žičanoj verziji). Obrazac upotrebe isti je za obje, uz jednu važnu razliku: bežičnom sučelju treba reći kojoj se mreži treba pridružiti, dok Ethernet preuzima ono što se nalazi na kabelu.
9.4.2. Wi-Fi tok¶
Pridruživanje Wi-Fi mreži ima tri koraka: konstruirati sučelje, podići ga, zatražiti od njega da se poveže s imenovanom mrežom uz lozinku. Sučelje pregovara s pristupnom točkom u pozadini; poziv isconnected() izvještava kada je veza dovršena s podizanjem:
import network
import time
wlan = network.WLAN(network.WLAN.IF_STA)
wlan.active(True)
wlan.connect("my-network", "my-password")
while not wlan.isconnected():
time.sleep_ms(100)
print("link up")
Argument IF_STA odabire station način rada – kamera se pridružuje mreži koju netko drugi hostira. Suprotni način rada, IF_AP, čini da kamera hostira vlastitu malu mrežu kojoj se drugi uređaji mogu pridružiti; korisno za konfiguracijska sučelja i postavljanje na licu mjesta, ali nije uobičajeni slučaj.
Kada isconnected() vrati True, kamera je na mreži. Sve ostalo što su viši slojevi trebali kako bi se sami postavili dogodilo se automatski dok se veza podizala; stranice koje slijede izlažu te dijelove jedan po jedan.
9.4.3. Što može poći po zlu¶
Nekoliko praktičnih načina neuspjeha pojavljuje se u ovom koraku.
Pogrešno ime mreže ili lozinka. Pokušaj povezivanja tiho ponavlja dok aplikacija ne odustane. Omotajte čekanje vremenskim ograničenjem kako gornja petlja ne bi blokirala zauvijek:
start = time.ticks_ms() while not wlan.isconnected(): if time.ticks_diff(time.ticks_ms(), start) > 10000: raise OSError("Wi-Fi did not come up in 10 s") time.sleep_ms(100)
Izvan dometa. Kamera i pristupna točka moraju biti dovoljno blizu da signal bude dovoljno jak za održavanje veze.
status()vraća kod koji označava zašto veza nije uspostavljena;scan()vraća popis mreža koje radio može vidjeti, što je dijagnostika koju treba pokrenuti kadaconnectne uspijeva.Pristupna točka traži više od lozinke. Otvorene mreže (bez lozinke) i uobičajene mreže zaštićene lozinkom pokriva
connectkako je prikazano gore. Veće mreže na radnim mjestima i u školama ponekad koriste drugačiju shemu u kojoj se kamera mora autentificirati protiv zasebnog poslužitelja za prijavu; one zahtijevaju dodatne argumente zaconnect. Pogledajte klasa WLAN – upravljanje ugrađenim WiFi sučeljima za potpunu površinu.
9.4.4. Ostati povezan¶
Uspostavljanje veze je polovica problema. Ostati povezan je druga polovica – pristupne točke se ponovno pokreću, kamera odluta izvan dometa, DHCP zakupi isteknu, radio firmware se povremeno zaglavi. Kamera koja će živjeti na mreži mjesecima mora to primijetiti i sama se oporaviti.
Obrazac detekcije je pozvati isconnected() jednom po iteraciji glavne petlje i reagirati kada vrati False. isconnected() može nakratko lagati kada je veza prekinuta a da radio to još nije primijetio – slanje preko socketa koje ne uspije kada bi veza „trebala” biti uspostavljena drugi je dokaz prekida koji aplikacija ima. status() je mjerodavniji izvor kada se to dvoje ne slaže.
Obrazac ponovnog povezivanja je disconnect() praćen s connect() s istim vjerodajnicama, uz čekanje omotano vremenskim ograničenjem kao i pri početnom povezivanju. Pravite stanku između pokušaja – jedna sekunda, dvije, četiri, udvostručujući do otprilike minute – kako dugotrajni prekid ne bi bombardirao pristupnu točku i ne bi trošio energetski proračun radija na petlje praznog hoda:
import network
import time
_BACKOFF_S = (1, 2, 4, 8, 16, 32, 60)
def reconnect(wlan, ssid, password):
for delay in _BACKOFF_S:
wlan.disconnect()
wlan.connect(ssid, password)
deadline = time.ticks_add(time.ticks_ms(), 10_000)
while not wlan.isconnected():
if time.ticks_diff(deadline, time.ticks_ms()) < 0:
break
time.sleep_ms(100)
if wlan.isconnected():
return True
time.sleep(delay)
return False
Kada taj pomoćnik nastavi vraćati False, sam radio firmware možda je zaglavljen. Posljednje sredstvo je ponovno uključivanje radija: active(False), kratka stanka, active(True), ponovno povezivanje od nule. Ovo vraća radio firmware u poznato stanje po cijenu dodatnih nekoliko sekundi nedostupnosti:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
Kamera koja je bila izvan mreže minutama predstavlja stvaran kvar koji aplikacija mora vidjeti. Kod za oporavak trebao bi iznijeti to stanje na površinu – označiti mrežu kao nezdravu u zastavici koju glavna petlja provjerava, i pustiti aplikaciju da preskoči mrežna slanja koja bi inače obavila dok je zastavica postavljena – kako dugotrajni prekid ne bi zaustavio aplikaciju u čekanju na socketima koji nikada neće pisati.
9.4.5. Ethernet, kada je prisutan¶
Ploče s ugrađenim Ethernetom izlažu isti obrazac bez koraka connect. Sučelje LAN podiže se s active(), i čim se kabel uključi sučelje je spremno za upotrebu:
import network
lan = network.LAN()
lan.active(True)
print("link up")
Nakon ove točke ostatak stranica ovog odjeljka primjenjuje se na isti način bez obzira na to koje je sučelje dovelo kameru na mrežu. Viši slojevi ne mare je li veza ispod njih Wi-Fi ili Ethernet – „povezano” je „povezano”.
Za potpunu referencu WLAN i LAN, uključujući konfiguracijske postavke koje ovdje nisu stale, pogledajte network — konfiguracija mreže.