9.4. Activarea legăturii¶
Stratul de legătură tratat pe pagina anterioară este în mare parte automat, dar există un loc în care un script Python trebuie să intervină: să îi spună camerei la ce rețea să se alăture. Până când acest pas reușește, niciuna dintre funcționalitățile de rețea acoperite în restul acestei secțiuni nu va funcționa.
9.4.1. Modulul network¶
Modulul network expune hardware-ul de rețea al camerei către Python. Setul exact de interfețe depinde de placă: multe camere au un cip wireless și expun o clasă WLAN (denumită după Wireless Local Area Network); unele plăci au de asemenea un port Ethernet încorporat și expun o clasă LAN (denumită după Local Area Network, adică versiunea cablată). Tiparul de utilizare este același pentru ambele, cu o diferență importantă: unei interfețe wireless trebuie să i se spună la ce rețea să se alăture, în timp ce Ethernet preia orice se află pe cablu.
9.4.2. Fluxul Wi-Fi¶
Alăturarea unei rețele Wi-Fi presupune trei pași: construiește interfața, activeaz-o, cere-i să se conecteze la o rețea numită cu o parolă. Interfața negociază cu punctul de acces în fundal; un apel isconnected() raportează când legătura a terminat de activat:
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")
Argumentul IF_STA selectează modul station (stație) – camera se alătură unei rețele găzduite de altcineva. Modul opus, IF_AP, face camera să găzduiască propria sa mică rețea la care se pot alătura alte dispozitive; util pentru interfețe de configurare și configurare la fața locului, dar nu este cazul obișnuit.
Odată ce isconnected() returnează True, camera este în rețea. Tot ce mai aveau nevoie straturile superioare pentru a se configura s-a întâmplat automat în timp ce legătura se activa; paginile care urmează detaliază aceste elemente unul câte unul.
9.4.3. Ce poate merge prost¶
Câteva moduri practice de eșec apar la acest pas.
Nume de rețea sau parolă greșite. Încercarea de conectare reîncearcă în tăcere până când aplicația renunță. Înfășoară așteptarea cu un timp de expirare, astfel încât bucla de mai sus să nu se blocheze la nesfârșit:
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)
În afara razei. Camera și punctul de acces trebuie să fie suficient de aproape încât semnalul să fie destul de puternic pentru a menține o legătură.
status()returnează un cod care indică de ce legătura nu este activă;scan()returnează lista rețelelor pe care le poate vedea radioul, ceea ce reprezintă diagnosticul de rulat atunci cândconnectnu reușește.Punctul de acces cere mai mult decât o parolă. Rețelele deschise (fără parolă) și cele obișnuite protejate prin parolă sunt acoperite de
connectașa cum s-a arătat mai sus. Rețelele mai mari de la locuri de muncă și școli folosesc uneori o schemă diferită în care camera trebuie să se autentifice față de un server de autentificare separat; acestea necesită argumente suplimentare pentruconnect. Consultă clasa WLAN – controlul interfețelor WiFi integrate pentru suprafața completă.
9.4.4. Menținerea conexiunii¶
Activarea legăturii este jumătate din problemă. Menținerea conexiunii este cealaltă jumătate – punctele de acces repornesc, camera iese din rază, leasing-urile DHCP expiră, firmware-ul radio se blochează ocazional. O cameră care urmează să trăiască în rețea luni de zile trebuie să observe asta și să se recupereze singură.
Tiparul de detectare este să apelezi isconnected() o dată per iterație a buclei principale și să reacționezi când returnează False. isconnected() poate minți pe scurt atunci când o conexiune a căzut fără ca radioul să fi observat încă – o trimitere prin soclu care eșuează atunci când legătura „ar trebui” să fie activă este cealaltă dovadă a aplicației privind o cădere. status() este sursa mai autoritară atunci când cele două nu concordă.
Tiparul de reconectare este disconnect() urmat de connect() cu aceleași credențiale, cu așteptarea înfășurată într-un timp de expirare ca la conexiunea inițială. Aplică o pauză crescătoare între încercări – o secundă, două, patru, dublând până la un minut sau cam așa ceva – astfel încât o pană lungă să nu bombardeze punctul de acces și să nu consume bugetul de energie al radioului în bucle de așteptare activă:
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
Atunci când acea funcție ajutătoare continuă să returneze False, firmware-ul radio în sine poate fi blocat. Ultima soluție este repornirea alimentării radioului: active(False), o scurtă pauză, active(True), reconectare de la zero. Acest lucru readuce firmware-ul radio la o stare cunoscută, cu prețul câtorva secunde suplimentare de inactivitate:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
O cameră care a fost în afara rețelei timp de minute întregi este un eșec real pe care aplicația trebuie să îl vadă. Codul de recuperare ar trebui să expună acea stare – să marcheze rețeaua ca nesănătoasă într-un indicator pe care bucla principală îl verifică și să lase aplicația să sară peste trimiterile de rețea pe care le-ar fi făcut cât timp indicatorul este nesetat – astfel încât o pană lungă să nu blocheze aplicația în așteptarea unor socluri care nu vor scrie niciodată.
9.4.5. Ethernet, atunci când este prezent¶
Plăcile cu Ethernet încorporat expun același tipar fără pasul connect. Interfața LAN este activată cu active(), iar de îndată ce cablul este conectat, interfața este gata de utilizare:
import network
lan = network.LAN()
lan.active(True)
print("link up")
După acest punct, restul paginilor acestei secțiuni se aplică la fel, indiferent de interfața care a adus camera în rețea. Straturile superioare nu țin cont dacă legătura de sub ele este Wi-Fi sau Ethernet – „conectat” înseamnă „conectat”.
Pentru referința completă WLAN și LAN, inclusiv butoanele de configurare care nu au încăput aici, consultă network — configurarea rețelei.