9.4. Yhteyden pystyttäminen¶
Edellisellä sivulla käsitelty linkkikerros on enimmäkseen automaattinen, mutta on yksi paikka, johon Python-skriptin on puututtava: kameran kertominen siitä, mihin verkkoon liittyä. Ennen kuin tuo vaihe onnistuu, mikään tämän osion käsittelemistä verkko-ominaisuuksista ei toimi.
9.4.1. network-moduuli¶
network-moduuli paljastaa kameran verkkolaitteiston Pythonille. Tarkka rajapintajoukko riippuu kortista: monilla kameroilla on langaton siru ja ne paljastavat WLAN-luokan (nimetty sanoista Wireless Local Area Network); joillakin korteilla on myös sisäänrakennettu Ethernet-portti ja ne paljastavat LAN-luokan (nimetty sanoista Local Area Network, eli langallisen version). Käyttötapa on sama molemmille, yhdellä tärkeällä erolla: langattomalle rajapinnalle on kerrottava, mihin verkkoon liittyä, kun taas Ethernet poimii sen, mitä kaapelissa onkin.
9.4.2. Wi-Fi-kulku¶
Wi-Fi-verkkoon liittyminen on kolme vaihetta: rakenna rajapinta, pystytä se, pyydä sitä yhdistymään nimettyyn verkkoon salasanalla. Rajapinta neuvottelee tukiaseman kanssa taustalla; isconnected()-kutsu raportoi, kun yhteys on saatu pystyyn:
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")
Argumentti IF_STA valitsee asematilan – kamera liittyy verkkoon, jota joku muu ylläpitää. Päinvastainen tila, IF_AP, saa kameran ylläpitämään omaa pientä verkkoaan, johon muut laitteet voivat liittyä; hyödyllinen konfigurointirajapintoja ja paikan päällä tehtävää asennusta varten, mutta ei yleinen tapaus.
Kun isconnected() palauttaa True, kamera on verkossa. Kaikki muu, mitä ylemmät kerrokset tarvitsivat asettuakseen, on tapahtunut automaattisesti yhteyden pystyyntulon aikana; tulevat sivut erittelevät nämä osat yksitellen.
9.4.3. Mikä voi mennä pieleen¶
Tässä vaiheessa ilmenee muutamia käytännön vikatiloja.
Väärä verkon nimi tai salasana. Yhteysyritys yrittää hiljaa uudelleen, kunnes sovellus luovuttaa. Kääri odotus aikakatkaisulla, jotta yllä oleva silmukka ei estyisi ikuisesti:
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)
Kantaman ulkopuolella. Kameran ja tukiaseman on oltava riittävän lähellä toisiaan, jotta signaali on tarpeeksi vahva pitämään yhteyden.
status()palauttaa koodin, joka ilmoittaa miksi yhteys ei ole pystyssä;scan()palauttaa luettelon verkoista, jotka radio näkee, ja se on diagnostiikka, joka ajetaan kunconnectei onnistu.Tukiasema pyytää enemmän kuin salasanaa. Avoimet verkot (ei salasanaa) ja yleiset salasanasuojatut verkot kattaa
connectyllä esitetyllä tavalla. Suuremmat verkot työpaikoilla ja kouluissa käyttävät joskus eri menetelmää, jossa kameran on todennettava itsensä erillistä kirjautumispalvelinta vastaan; ne tarvitsevat lisäargumentteja kutsulleconnect. Katso täysi pinta kohdasta class WLAN – sisäänrakennettujen WiFi-rajapintojen ohjaus.
9.4.4. Yhteyden ylläpitäminen¶
Yhteyden pystyttäminen on puolet ongelmasta. Yhteyden ylläpitäminen on toinen puoli – tukiasemat käynnistyvät uudelleen, kamera kulkeutuu kantaman ulkopuolelle, DHCP-vuokrasopimukset vanhenevat, radion laiteohjelmisto jumiutuu satunnaisesti. Kameran, joka aikoo elää verkossa kuukausia, on huomattava tämä ja toivuttava itsenäisesti.
Havaintomalli on kutsua isconnected()-kutsua kerran pääsilmukan iteraatiota kohden ja reagoida, kun se palauttaa False. isconnected() voi valehdella hetken, kun yhteys on katkennut ilman, että radio on vielä huomannut sitä – soketin lähetys, joka epäonnistuu kun yhteyden ”pitäisi” olla pystyssä, on sovelluksen toinen todiste katkoksesta. status() on luotettavampi lähde, kun nämä kaksi ovat eri mieltä.
Uudelleenyhdistämismalli on disconnect() ja sen jälkeen connect() samoilla tunnuksilla, odotus aikakatkaisulla käärittynä kuten alkuperäisessä yhteydessä. Pidä taukoa yritysten välillä – yksi sekunti, kaksi, neljä, kaksinkertaistaen jopa minuuttiin asti – jotta pitkä katkos ei kuormita tukiasemaa eikä polta radion virtabudjettia pyörintäsilmukoissa:
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
Kun tuo apufunktio palauttaa jatkuvasti False, radion laiteohjelmisto itse voi olla jumissa. Viimeinen keino on radion virtakierto: active(False), lyhyt tauko, active(True), uudelleenyhdistäminen tyhjästä. Tämä palauttaa radion laiteohjelmiston tunnettuun tilaan muutaman ylimääräisen sekunnin käyttökatkoksen hinnalla:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
Kamera, joka on ollut poissa verkosta minuutteja, on todellinen vika, joka sovelluksen on nähtävä. Palautuskoodin tulisi tuoda tämä tila näkyviin – merkitä verkko epäterveeksi lippuun, jota pääsilmukka tarkistaa, ja antaa sovelluksen ohittaa verkkolähetykset, jotka se olisi tehnyt sillä aikaa kun lippu on nostettuna – jotta pitkä katkos ei pysäytä sovellusta odottamaan soketteja, jotka eivät koskaan kirjoita.
9.4.5. Ethernet, kun saatavilla¶
Kortit, joissa on sisäänrakennettu Ethernet, paljastavat saman mallin ilman connect-vaihetta. LAN-rajapinta pystytetään metodilla active(), ja heti kun kaapeli on kytketty, rajapinta on valmis käytettäväksi:
import network
lan = network.LAN()
lan.active(True)
print("link up")
Tämän jälkeen tämän osion loput sivut pätevät samalla tavalla riippumatta siitä, mikä rajapinta toi kameran verkkoon. Ylemmät kerrokset eivät välitä siitä, onko niiden alla oleva yhteys Wi-Fi vai Ethernet – ”yhdistetty” on ”yhdistetty”.
Täydellinen WLAN- ja LAN-viite, mukaan lukien tähän mahtumattomat konfigurointisäätimet, katso network — verkkomääritykset.