9.1. Perché le reti

Il controllo hardware ha dato alla camera modi per comunicare con un altro dispositivo specifico su un altro cavo specifico. UART tra la camera e una singola scheda companion. I2C tra la camera e i sensori collegati allo stesso bus corto. CAN tra un piccolo insieme di moduli che condividono un unico bus robusto. Ogni caso segue la stessa forma: due parti (o un piccolo gruppo noto), un mezzo condiviso, un accordo tra di esse su cosa significhino i byte su quel mezzo.

9.1.1. Quella forma smette di scalare

Il modello punto-a-punto funziona finché entrambe le estremità sono vicine, entrambe le estremità sono note in anticipo e lo script può scegliere su quale cavo comunicare. Non appena uno di questi vincoli viene meno, il cablaggio smette di bastare.

  • Molti interlocutori. Una rete di cinquanta camere che riportano a un singolo server non può essere cablata uno-a-uno; non ci sono abbastanza UART sul server e le tratte di cavo sarebbero impossibili.

  • Interlocutori non sullo stesso cavo. Una camera in una fabbrica e un dashboard in un ufficio dall’altra parte della città non possono condividere un cavo seriale. Deve esistere un qualche percorso tra di essi attraverso l’infrastruttura che già collega i due edifici.

  • Interlocutori non noti in anticipo. Una camera che pubblica i propri risultati sul cloud non sceglie con quale server comunicare nello schema di cablaggio; l’indirizzo del cloud è qualcosa che lo script ricerca in fase di esecuzione e verso cui instrada i dati.

  • Molti programmi su un unico cavo. Un laptop oggi esegue un browser, un’app di chat, una videochiamata e un backup, tutti che comunicano attraverso la stessa interfaccia di rete contemporaneamente. Il cavo non può essere «posseduto» da una sola conversazione come accade per una UART.

Ciascuno di questi fallimenti è un tipo diverso di problema di indirizzamento. Risolverli tutti insieme richiede più di un cavo e di un baud rate.

9.1.2. Cos’è una rete

Una rete è l’infrastruttura che consente a uno qualsiasi di un gran numero di computer di scambiare messaggi con qualsiasi altro, senza che ogni coppia abbia bisogno del proprio collegamento dedicato. Tre proprietà rendono una rete qualcosa di più di un grande cavo seriale:

  • Mezzo condiviso. Molti dispositivi si collegano allo stesso cavo, switch o canale radio. Si alternano o multiplexano in modo che più di una conversazione possa stare sullo stesso collegamento fisico.

  • Indirizzi logici. Ogni dispositivo ha un numero che lo identifica indipendentemente dal cavo a cui è collegato. Inviare un messaggio significa scrivere quel numero sul messaggio, non collegare un cavo specifico.

  • Routing. Quando il mittente e il destinatario non sono sullo stesso segmento locale, l’infrastruttura tra di essi trasporta il messaggio salto dopo salto. Gli endpoint non conoscono il percorso; conoscono solo l’indirizzo reciproco.

Un laptop sul Wi-Fi dell’ufficio che raggiunge un server in un data center lontano usa tutti e tre. Il collegamento Wi-Fi è un mezzo radio condiviso; il laptop e il server hanno ciascuno il proprio indirizzo logico; il messaggio si fa strada attraverso qualunque infrastruttura si trovi tra i due, inoltrato un salto alla volta. L’utente clicca su un link, il laptop invia un pacchetto e la rete gestisce il resto.

9.1.3. E la cam?

La camera svolge esattamente lo stesso ruolo su una rete del laptop. Acquisisce un indirizzo logico quando si unisce alla rete, indirizza i messaggi in uscita agli indirizzi logici di altri dispositivi e lascia che l’infrastruttura li instradi.

Ciò che cambia rispetto ai capitoli sul controllo hardware è l”interfaccia. Invece di aprire un’istanza UART e scrivervi byte, lo script apre un socket e vi scrive byte. Il socket è un endpoint verso la rete, allo stesso modo in cui un’istanza UART è un endpoint verso un cavo. Le parti tra il socket e il cavo – frame, pacchetti, tabelle di routing, switch, radio – si trovano tutte al di sotto e sono per lo più invisibili al codice Python.

Le pagine che seguono spiegano nel dettaglio queste parti, livello per livello, in modo che l’astrazione «apri un socket e invia byte» appaia inevitabile anziché magica.