9.4. Estabelecer a ligação¶
A camada de ligação abordada na página anterior é maioritariamente automática, mas há um ponto onde um script Python tem de intervir: dizer à câmara a que rede se juntar. Até que esse passo tenha êxito, nenhuma das funcionalidades de rede abordadas no resto desta secção funcionará.
9.4.1. O módulo network¶
O módulo network expõe o hardware de rede da câmara ao Python. O conjunto exato de interfaces depende da placa: muitas câmaras têm um chip sem fios e expõem uma classe WLAN (denominada para Wireless Local Area Network); algumas placas também têm uma porta Ethernet integrada e expõem uma classe LAN (denominada para Local Area Network, ou seja, a versão com fios). O padrão de uso é o mesmo para ambas, com uma diferença importante: uma interface sem fios tem de ser informada a que rede se juntar, enquanto a Ethernet recebe o que estiver no cabo.
9.4.2. O fluxo Wi-Fi¶
Juntar-se a uma rede Wi-Fi são três passos: construir a interface, ativá-la, pedir-lhe que se ligue a uma rede com nome e palavra-passe. A interface negoceia com o ponto de acesso em segundo plano; uma chamada isconnected() informa quando a ligação terminou de se estabelecer:
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")
O argumento IF_STA seleciona o modo estação – a câmara junta-se a uma rede que outra entidade está a alojar. O modo oposto, IF_AP, faz a câmara alojar a sua própria pequena rede à qual outros dispositivos se podem juntar; útil para interfaces de configuração e configuração no local, mas não o caso comum.
Assim que isconnected() retornar True, a câmara está na rede. Todo o resto que as camadas superiores precisavam para se configurarem aconteceu automaticamente enquanto a ligação estava a estabelecer-se; as páginas seguintes explicam essas peças uma de cada vez.
9.4.3. O que pode correr mal¶
Alguns modos de falha práticos surgem neste passo.
Nome de rede ou palavra-passe errados. A tentativa de ligação repete silenciosamente até que a aplicação desista. Envolva a espera num tempo limite para que o ciclo acima não bloqueie para sempre:
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)
Fora de alcance. A câmara e o ponto de acesso têm de estar suficientemente próximos para que o sinal seja forte o suficiente para manter uma ligação.
status()retorna um código indicando por que a ligação não está ativa;scan()retorna a lista de redes que o rádio consegue ver, que é o diagnóstico a executar quandoconnectnão consegue ter êxito.O ponto de acesso pede mais do que uma palavra-passe. As redes abertas (sem palavra-passe) e as protegidas por palavra-passe comuns são cobertas por
connectcomo mostrado acima. Redes maiores em locais de trabalho e escolas por vezes usam um esquema diferente onde a câmara tem de se autenticar contra um servidor de login separado; estas precisam de argumentos adicionais paraconnect. Consulte class WLAN – controlo das interfaces WiFi integradas para a superfície completa.
9.4.4. Manter a ligação¶
Estabelecer a ligação é metade do problema. Manter a ligação é a outra metade – os pontos de acesso reiniciam, a câmara sai de alcance, as concessões DHCP expiram, o firmware do rádio fica ocasionalmente bloqueado. Uma câmara que vai viver na rede durante meses tem de notar isso e recuperar por conta própria.
O padrão de deteção é chamar isconnected() uma vez por iteração do ciclo principal e reagir quando retorna False. isconnected() pode mentir brevemente quando uma ligação caiu sem que o rádio ainda o tenha notado – um envio de socket que falha quando a ligação «devia» estar ativa é a outra evidência de uma quebra que a aplicação tem. status() é a fonte mais autoritativa quando os dois discordam.
O padrão de reconexão é disconnect() seguido de connect() com as mesmas credenciais, com a espera envolvida num tempo limite como na ligação inicial. Recue entre tentativas – um segundo, dois, quatro, duplicando até cerca de um minuto – para que uma interrupção longa não sobrecarregue o AP e não consuma o orçamento de energia do rádio em ciclos de espera activa:
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
Quando esse auxiliar continua a retornar False, o próprio firmware do rádio pode estar bloqueado. O último recurso é desligar e ligar novamente o rádio: active(False), uma breve pausa, active(True), reconectar do zero. Isto coloca o firmware do rádio de volta a um estado conhecido ao custo de alguns segundos extra de inatividade:
def radio_power_cycle(wlan, ssid, password):
wlan.active(False)
time.sleep(1)
wlan.active(True)
return reconnect(wlan, ssid, password)
Uma câmara que esteve fora da rede durante minutos é uma falha real que a aplicação tem de ver. O código de recuperação deve expor esse estado – marcar a rede como não saudável numa flag que o ciclo principal verifica, e deixar a aplicação ignorar os envios de rede que teria feito enquanto a flag está ativa – para que uma longa interrupção não paralise a aplicação à espera de sockets que nunca escreverão.
9.4.5. Ethernet, quando presente¶
As placas com Ethernet integrada expõem o mesmo padrão sem o passo connect. A interface LAN é ativada com active(), e assim que o cabo estiver ligado a interface está pronta a usar:
import network
lan = network.LAN()
lan.active(True)
print("link up")
A partir deste ponto, o resto das páginas desta secção aplica-se da mesma forma independentemente de qual interface colocou a câmara na rede. As camadas superiores não se importam se a ligação abaixo delas é Wi-Fi ou Ethernet – «ligado» é «ligado».
Para a referência completa de WLAN e LAN, incluindo os controlos de configuração que não couberam aqui, consulte network — configuração de rede.