9.3. Il cavo e il frame¶
I due livelli più bassi dello stack sono i più facili da dare per scontati sulla camera, perché tutto ciò che fanno avviene all’interno del chip e la camera li gestisce senza che sia coinvolto alcun codice Python. Vale comunque la pena dare loro una rapida occhiata, perché spiegano cosa significa «rete locale» e dove inizia il confine con il resto dell’infrastruttura.
9.3.1. Il livello fisico¶
Il livello più basso è la segnalazione vera e propria: i fili, le fibre ottiche o le onde radio che trasportano i bit tra due dispositivi. Ethernet su cavi a doppino intrecciato codifica ogni bit come una transizione di tensione a una frequenza fissa. Il Wi-Fi modula gli stessi bit su una portante radio nella banda a 2,4 GHz o 5 GHz. Entrambi producono un flusso di cifre binarie tra due componenti hardware; entrambi sono il tipo di dettaglio che il silicio della camera gestisce senza che il software debba preoccuparsene.
Dal punto di vista di uno script Python, il livello fisico è «il collegamento è attivo» oppure «il collegamento è inattivo». Il modulo network riporta tale stato attraverso il suo metodo isconnected() sull’interfaccia Wi-Fi e attraverso lo stato del collegamento su un’interfaccia Ethernet cablata. Oltre a questo, tutto il resto di ciò che fa questo livello rimane nascosto.
9.3.2. Il livello di collegamento¶
Un gradino più in alto si trova il livello di collegamento: le regole per inviare un blocco di byte (un frame) tra due dispositivi che condividono lo stesso segmento fisico. Il livello di collegamento aggiunge due cose alla segnalazione grezza:
Indirizzamento hardware. Ogni interfaccia di rete è dotata di un identificatore univoco a 48 bit chiamato indirizzo MAC (Media Access Control). Su Ethernet è inciso nel chip; sul Wi-Fi è lo stesso tipo di identificatore inciso nel modulo wireless. Gli indirizzi MAC sono ciò che uno switch – la scatola con più porte Ethernet a cui i dispositivi vicini si collegano – utilizza per decidere su quale porta debba uscire un determinato frame. Un access point Wi-Fi svolge lo stesso ruolo per i dispositivi wireless sul suo canale.
Framing. I byte che un livello superiore passa verso il basso vengono confezionati in un frame con una piccola intestazione, il payload e un checksum alla fine. L’intestazione contiene gli indirizzi MAC di origine e di destinazione; il checksum permette al ricevente di rilevare un frame i cui byte sono stati corrotti durante il transito. I frame che non superano il controllo vengono scartati silenziosamente: chiunque tenga all’affidabilità deve ripristinarla a un livello superiore.
Un segmento locale è qualunque gruppo di dispositivi in grado di vedere direttamente i frame degli altri: le porte cablate di uno switch, tutti i dispositivi associati a un unico access point Wi-Fi, oppure una piccola maglia di switch interconnessi. Il livello di collegamento non può raggiungere nulla al di fuori di quel segmento. Non appena la destinazione si trova su un segmento diverso, il messaggio deve essere passato al livello superiore.
9.3.3. Cosa espone la camera¶
La camera ha un indirizzo MAC per ciascuna interfaccia di rete che possiede: uno Wi-Fi se la cam ha il supporto wireless, uno Ethernet se la scheda ha la porta corrispondente. Il modulo network vi dà accesso tramite network_interface.config("mac") sull’oggetto interfaccia che l’applicazione sta utilizzando, quando ha bisogno di leggere l’indirizzo. Alcune applicazioni ne hanno bisogno, ad esempio per registrare il dispositivo presso un sistema di gestione della flotta. Altrimenti, questa è l’unica manopola che il livello di collegamento mette a disposizione di Python.
Tutto il resto – il framing, il traffico MAC effettivo sul filo o nell’aria, la negoziazione tra la camera e l’access point su quale canale e velocità utilizzare – avviene interamente all’interno dell’hardware wireless o Ethernet. La pagina successiva tratta l’unico punto in cui uno script Python ha effettivamente voce in capitolo nel livello di collegamento: indicare alla camera a quale rete unirsi.