Modifiche

Da GolemWiki.

Arduino ed Internet

7 036 byte aggiunti, 21:17, 1 giu 2018
Risistemata, riscritta la parte sulle reti in maniera semplificata, eliminati imprecisioni e errori, tuttavia rimane un "corso molto molto accelerato sulle reti"
Ci sono applicazioni per cui è comodo avere {{Guide|immagine=Pulsante-arduino.gif|guida=Arduino collegato adinternet, ad esempio per un sistema di '''domotica''' per gestire le luci|precedente=Arduino_e_comunicazione_serialedi casa online, oppure per '''monitorare''' dei sensori ambientali dal cellulare.|indice=Elettronica_Opensource|successiva=Elettronica_Opensource}}
Per questi piccoli progetti Ci sono applicazioni per cui è adatta la Ethernet Shieldcomodo avere Arduino collegato in rete, una schedagià pronta ad esempio per essere "incastrata" su un Arduino e che mette a disposizioneuna porta Ethernet coordinata da un chip dedicato, ed uno slot permicroSD, utile per esempio in progetti sistema di monitoraggio per salvarele informazioni catturate.Esiste anche una ''wireless shield'domotica''', molto similecioè di controllo intelligente della casa: per controllare le luci da remoto, che però usa per accendere il riscaldamento o controllare la retesenza filitemperatura dall'ufficio o dal cellulare.
Ma ''Per questi piccoli progetti è adatta la 'attenzione'Ethernet Shield'', questa una schedadipende molto dalla potenza del microprocessore di già pronta per essere montata su un Arduino, poiché è luie che deve occuparsi, come vedremo, di tutti i ''protocolli di rete''.mette a disposizione:Scordatevi quindi di poter tirare su in questo modo * una porta Ethernet controllata tramite un server webcon tante paginechip dedicato, database, eccetera.per la connettività in rete;In questo caso bisognerà optare * uno slot per schede come [Raspberry Pi http://www.glgprograms.it/?p=tricks/raspberrypi-1] o BeagleBonemicroSD,anziché Arduino.utile per salvare le informazioni catturate (monitor);
Esistono anche delle ''wireless shield'', molto simili, che però usano le reti senza fili, tra cui WiFi.
=Concetti Ma '''attenzione''': questa scheda dipende molto dalla potenza del microprocessore di base=Arduino, poiché è lui che deve occuparsi, come vedremo, di diversi ''protocolli di rete''.
Dimenticatevi quindi di poter tirare su in questo modo un sito web con tante pagine, database, eccetera: per questo serve un computer ad uso generale, per quanto piccolo, ad esempio un [https://www.raspberrypi.org/ Raspberry Pi], una [https://beagleboard.org/bone BeagleBone] o un [https://www.olimex.com/Products/OLinuXino/open-source-hardware Olinuxino], anziché Arduino. =Concetti di base sulle reti =TCP/IP In questa sezione sono introdotti alcuni concetti '''fondamentali''' sulle reti, che è bene aver chiaro '''prima''' di cimentarsi nella realizzazione di dispositivi di rete. Alcuni concetti sono stati volutamente trascurati o omessi per semplicità di trattazione (e si vedrà che già così la strada è lunga). Si consiglia comunque di leggere la parte di teoria anche a coloro che già la sanno, a mo' di ripasso, dopodiché passare alla pratica. {{Note|type=warning|text=I concetti espressi nella seguente trattazione non sono sufficienti per la creazione di dispositivi sicuri, perciò è bene utilizzarli solo come punto di partenza per la realizzazione di prototipi, e protocollisuccessivamente approfondire. Potrebbe essere molto fastidioso - o addirittura pericoloso - che qualcuno possa, dalla rete Internet, accendere la nostra caldaia mentre non siamo a casa o spiare i nostri familiari.}} == Teoria ===== Livelli di astrazione ===[[File:osi-network-stack.png|thumb|Livelli di astrazione nelle reti]]Tutti i dispositivi collegati in rete devono rispettare un certoprotocollocerte regole per potersi identificare, ovvero seguire regole e per poter identificarsi parlare fra lorosenza creare conflitti, così come ogni persona ha un proprio nome, e segue delle regole durante una conversazione (es.non parla mentre altri stanno già parlando).  Per avere connettività, è stato pensato uno schema che permette la connettività a 7 diversi livelli. Ne descriveremo 5, fondamentali per capire il funzionamento, ma ci preoccuperemo solo dei "dettagli" dei 3 a più alto livello. ==== Livello fisico ====Ogni dispositivo Non ci interesseremo del livello fisico, basta sapere che - com'è ovvio immaginare - una rete cablata su Ethernet è ben diversa da una rete senza fili WiFi già a partire dal mezzo fisico in cui si propagano le informazioni. ==== Livello di collegamento ====Permette ai dispositivi in particolare identificato da una (piccola) rete di parlare tra di loro. A questo livello appartiene il '''MAC Address''', un nome sullaindirizzo univoco per ogni dispositivo esistente.Esso viene assegnato in fabbrica ad ogni dispositivo e non cambia mai. ==== Livello di rete ====Permette ai dispositivi di parlare non solo con i dispositivi della stessa rete, detto ma anche con quelli di reti diverse. A questo livello appartiene l''''indirizzo IP. Ad esempio''', un indirizzo univoco nella mia rete . ===== IP vs MAC =====Perché c'è bisogno di casadue indirizzi, un MAC e un IP, per presentarsi in rete? Non sarebbe sufficiente il computer MAC che è già univoco di suo? I due indirizzi hanno uno scopo e una struttura completamente diversa:* l'indirizzo MAC (Media Access Control) serve per permettere la comunicazione in presenza di più dispositivi, serve cioè per identificarli. Ogni produttore assegna gli indirizzi MAC ai propri dispositivi facendo uso ha di un registro in comune con gli altri produttori, in modo da evitare che due dispositivi diversi possano avere lo stesso indirizzo. Come i ''codici fiscali'', anche gli indirizzi MAC quindi sono molto variegati tra loro, e non danno alcuna informazione su come raggiungere il dispositivo, ma si limitano ad identificarlo.* l'indirizzo IP (Internet protocol) serve invece per permettere la comunicazione tra dispositivi di reti diverse, per trovare la loro collocazione, e per creare reti logiche di dispositivi, raggruppandone un sottoinsieme. Come gli ''indirizzi geografici'', anche gli indirizzi IP di dispositivi "vicini" tra loro sono simili (cioè di dispositivi che si trovano nella stessa rete), e forniscono una chiara identificazione di dove si trovano. Un dispositivio con indirizzo MAC <code>AA:BB:CC:DD:EE:FF</code> lo conserverà per sempre, ma potrà cambiare il suo indirizzo IP da <code>192.1680.2.142100</code>, e il cellularea <code>192.168.10.119100</code>a seconda della rete in cui si trova. Tutti gli indirizzi Si rifletta sull'analogia (MAC = codice fiscale) e (IP = indirizzo geografico). ==== Livello di trasporto ====Il livello di rete permette di trasportare i dati da un dispositivo ad un altro, ma, quando questi dati sono composti da una quartina giunti al dispositivo di destinazione, a chi vanno consegnati? Se un dispositivo esegue più applicazioni di numerirete, a quale applicazione devo dare questi dati?compresi fra 0 Si pensi al computer, che permette di navigare sul web e 255contemporaneamente vedere un film in streaming: quando i dati giungono al computer, separati da come fa a sapere se sono un puntopezzo di film o una pagina web? Questo problema viene risolto dal livello di trasporto. Solitamente, nellereti Il '''protocollo TCP''' che utilizziamo si occupa anche del controllo di casatrasmissione, cioè di rendere affidabile la prima coppia comunicazione dati in rete tra mittente e destinatario: farà di tutto per impedire che i dati vengano persi o giungano corrotti a destinazione, eventualmente trasmettendoli più volte. TCP si occupa anche di controllare il flusso della trasmissione e evitare congestione all'interno della rete. Una caratteristica importante di TCP è fissa il concetto di '''porta''', un numero che permette di distinguere i diversi processi a 192 cui sono destinati i dati trasmessi. Un Arduino, pur eseguendo un solo compito, dovrà comunque offrire il suo servizio ''rimanendo in ascolto dietro una certa porta''. ==== Livello applicazione ====Una volta giunti al dispositivo giusto e 168al servizio giusto, i dati vengono finalmente letti dal nostro programma, mentre secondo un altro protocollo detto ''di livello applicativo''. Dovremo preoccuparci di scrivere le azioni che deve eseguire il terzoprotocollo nel nostro sketch di Arduino. Il protocollo che useremo è '''HTTP''' (Hyper Text Transfer Protocol), che sta alla base del web. {{Note|type=info|text=Ogni livello realizza un''''astrazione''', ossia può essere utilizzato senza doversi preoccupare di come funzionino i livello sottostanti.Per esempio, se abbiamo in casa uno smartphone collegato tramite WiFi e un computer fisso tramite Ethernet, se ci preoccupiamo di farli dialogare a livello di rete, ci basta conoscere i loro indirizzi IP senza doversi preoccupare dei livelli sottostanti (collegamento e fisico) che sono realizzati con due tecnologie differenti.}} == Pratica ===== MAC Address ===La libreria per lo shield necessita dell'indirizzo MAC del dispositivo, che è solitamente scritto su un adesivo sotto l'Ethernet Shield. Ha una forma del tipo <code>d8:ab:cd:ef:03:69</code> === IP Address ===La libreria necessita anche dell'indirizzo IP del dispositivo. Questo viene solitamente scritto nella forma <code>1.Quello 2.3.4</code>, dove ogni numero rappresenta un byte (e quindi può assumere valori che vanno da <code>0</code> a <code>255</code>). Ricordiamo che l'IP cambia a seconda della rete in cui siamo interessati questo è quindi inserito: pertanto, può darsi che debba essere modificato nello sketch quando ci si sposta tra casa, ufficio, officina. ==== Come scegliere l'ultimo numero, indirizzo IP? ====Chi è che variadà gli indirizzi in una rete? da Teoricamente ogni dispositivo può autoassegnarsi un indirizzo, ma questo non viene fatto su oggetti "quotidiani" (cellulari, computer, etc..) perché verrebbero a dispositivocrearsi altrimenti conflitti quando due o più si assegnano lo stesso indirizzo. C'è quindi un computer dedicato che esegue il protocollo '''DHCP''' ''Dynamic Host Configuration Protocol'' che ha l'autorità di dare ad ognuno il suo indirizzo evitando i conflitti; nelle reti domestiche questo compito viene svolto dal modem del gestore telefonico. Fa eccezione Il server DHCP dispone di un insieme di indirizzi da cui ''pescarne a caso'' uno libero da assegnare a chi ne faccia richiesta. Nelle reti domestiche, questo insieme è in genere nell'intervallo <code>192.168.0.2</code>-<code>192.168.0.254</code> oppure <code>192.168.1.2552</code>-<code>192.168.1.254</code>. Per i dispositivi che ''si collegano'' a servizi offerti da ''altri'' su Internet non ci interessa che abbiano un IP particolare, e quindi lo possono anche chiedere al modem col meccanismo del DHCP: ogni volta che è si collegano, può essergli assegnato un indirizzo speciale dettodiverso: si dice che hanno un ''IP dinamico''. I dispositivi a cui invece ''ci dobbiamo collegare'', che sono essi stessi fornitori di servizi, dovrebbero avere sempre lo stesso IP, noto e indipendente dalle volontà del server DHCP, così da poter essere facilmente raggiungibili: si dice che hanno un ''IP statico''. broadcast Anche il nostro Arduino dovrà avere un IP statico, che equivale gli assegneremo nel programma. Prima però dovremo assicurarci di due cose:* quale rete di IP è in uso nella propria rete domestica;* se l'IP scelto è disponibile, ovvero se il server DHCP non l'ha già assegnato a parlare contemporaneamente con tutti iqualcuno; dispositivi connessi alla Da un computer connesso, vediamo la rete di casa: Su Linux: $ '''ip addr''' 1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff inet 192.168.0.6/24 brd 192.168.0.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::aabb:ccff:fedd:eeff/64 scope link valid_lft forever preferred_lft forever Su Windows: > '''ipconfig''' Connection-specific DNS Suffix . : golem.linux.it. IP Address. . . . . . . . . . . . : 192.168.0.6 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.0.1
In questi casi la rete è <code>192.168.0.0</code>.
Chi è che dà gli indirizzi nella rete casalinga?Teoricamente ogni dispositivo può autoassegnarsi un indirizzo,ma questo non viene fatto su oggetti "quotidiani" (cellulari,Sempre dal computerconnesso, etc..) perché verrebbero proviamo a crearsi altrimenti conflittiquando due o più si assegnano lo stesso contattare un indirizzoa caso per vedere se è già stato assegnato.È quindi il router che ha lPer scegliere un indirizzo, basterà scegliere casualmente un numero da inserire al posto dell'autorità ultimo byte. (Questo è vero solo se la maschera di dare ad ognuno il suoindirizzo evitando i conflitti; si dice che il router "rete è il DHCP(Dynamic Host Configuration Protocol)"255. Il router sbriga tutta questa burocrazia, e cerca anche di associaread uno stesso dispositivo lo stesso IP255. Riesce a far ciò perchéc'è una seconda informazione necessaria per "presentarsi sulla rete",il MAC address255.Questo è un secondo codice0 o /24, univococome nella totalità delle reti domestiche, che viene assegnato in fabbricaad ogni dispositivocome nell'esempio).
Può sorgere la domanda "perché allora non si usa il MAC addressper presentarsi in rete?". Senza perdersi in cose complicate,rispondo dicendo che sono due indirizzi che hanno un significatocompletamente diverso: l'indirizzo IP può variare a secondadelle reti, e inserisce il dispositivo in un "gruppo" Supponiamo di altri dispositivi connessi insieme(ricordi la parte fissa aver scelto <code>192.168? Dice che tutti quelli che hannoquesto indirizzo appartengono alla stessa rete casalinga).Il MAC è invece statico, tipico del dispositivo0. Per fare un paragone che renda chiaro il tutto,l'indirizzo IP è come fosse il soprannome di una persona,mentre il MAC address è il codice fiscale del dispositivo, chepermette di "beccarlo" in qualsiasi gruppo80</code>.
ping 192.168.0.80
BeneSe il comando risponde ''Destination Host Unreachable'', detto questo, sappiamo che anche il nostro Arduino on the internetdovrà avere una coppia di indirizzi IP allora l'indirizzo è libero e un MAC.Il MAC possiamo usarlo; altrimenti è solitamente scritto su già occupato e occorre sceglierne un adesivo sotto l'ethernet shieldaltro.
{{NotePer quanto riguarda |type=warning|text=Il fatto che l'IPindirizzo sia libero in questo momento non dà nessuna garanzia sul fatto che lo sarà anche in futuro: il server DHCP, bisogna aggiungere qualcoscompletamente ignaro dei vostri esperimenti, potrebbe decidere di assegnare quell'altro:indirizzo a qualche nuovo dispositivo che si collega, per i dispositivi esempio allo smartphone di un vostro amico che è venuto a farvi visita. E quando lo inviterete a collegarsi al vostro sensore perfettamente funzionante con Arduino, non funzionerà niente e farete una brutta figura. Perciò, è bene modificare le impostazioni del server DHCP sul vostro modem e ridurre l'intervallo degli indirizzi liberi, per esempio <bcode>si collegano192.168.0.2</code>-<code>192.168.0.127</bcode> ad internet non ci interessache abbiano un IP particolare, e quindi lo possono anche chiedereassegnare al router col meccanismo del DHCP: si dice che hanno vostro Arduino un IPindirizzo al di fuori, per esempio <code>192.168.0.128</code>.dinamico.}}
I dispositivi a cui invece <b>=== Servizi e Servitori ===Quando ci dobbiamo collegare</b> dovrebberocolleghiamo ad un server, questo può offrire diversi servizi: trasferimento files (FTP), posta elettronica (POP3, IMAP, SMTP), e tanti altri. avere sempre lo Uno stesso IPcomputer può offrire più servizi contemporaneamente e, noto e indipendente dalle volontàdel router: si dice che hanno per poter discriminare a chi mandare cosa, il protocollo TCP prevede una struttura a porte. Ad ogni servizio è associato un IP staticonumero di porta.
Anche il nostro Arduino dovrà avere Per esempio, quando con un IP staticobrowser si richiede una pagina web, si ''bussa'' alla sua porta TCP numero 80, che gli assegneremonel programmae tramite quella porta fluisce la comunicazione. Prima però dovremo assicurarci di due cose:
<ul> <li>quale "serie" Metteremo il nostro Arduino in grado di IP è in uso nella propria rete casalinga;</li> <li> se l'IP scelto è disponibilepoter rispondere alle richieste fatte sulla porta 80, ovvero se il router non l'ha già assegnato a qualcuno;</li></ul>così basterà collegarsi ad esso con un comune browser per poterci interagire.
Per === HTTP ===Dopo che il primo punto basta controllare a quale IP risponde il router:solitamente infatti browser ha ip 192.168.1.1 oppure 192.168.0.1.Basta quindi aprire un browser e digitare il primo e poiil secondo indirizzo.A noi interessa sapere se il terzo numero è 1 oppure 0inviato la richiesta di connessione al server, incomincia uno scambio di informazioni fra i due che gli permette di accordarsi sul tipo di dati che si stanno scambiando.
Noto questoIn particolare, basta tirare un numero a caso il browser invia la richiesta della pagina web, seguita da aggiungere in codaa <code>192.168.1.</code> una linea bianca per avere un IP, e verificare tramite un terminale(o indicare il prompt di DOS su windows) se è disponibiletermine:digita ping <code>192.168.1.245</code> e se nessuno rispondeil comando dovrebbe dare come output un errore come<code>Destination Unreachable</code>.Appuntati quindi questo IP.
===Servizi e Servitori=== GET /sensore.html HTTP/1.1Quando ti colleghi ad un sito internet, chi ti dà la pagina nonè una magica entità immateriale, bensì uno (o più) computer Host: 192.168.0.80Il questo caso il computer con cui ti colleghi al sito è uncliente (client), mentre il computer che risponde inviandola pagina è un server, ovvero offre un servizio.
Di servizi offribili sulla rete ve ne sono molti: oltre allaclassica pagina web (gentilmente offerta dai e il server web), si possonoavere servizi cioè il nostro Arduino, gli deve rispondere con un codice di approvazione o di trasferimento files errore (ftp oppure sftpa seconda se la pagina è disponibile o no), servizi dispecificando il formato e-mail la lunghezza della pagina (POP3, IMAP, SMTPtesto semplice di 3 bytes nel nostro caso), e tanti altri. Uno stesso computerpuò offrire più servizi contemporaneamente, e per poter discriminarea chi mandare cosa, accodare finalmente il protocollo TCP/IP prevede una struttura a porte.contenuto:
Quando con un browser si richiede, ad esempio, una pagina web ad un computer, si HTTP/1.1 200 OK"bussa" alla porta numero 80 del suo indirizzo IP, e tramite quella Content-Length: 3porta fluisce la compunicazione. Content-Type: text/plain; charset=utf-8Ogni servizio ha una porta dedicata, in particolare il servizio di trasferimento pagine web (HTTP) ha il numero 80.<br/> 497
Lo stesso dovrà succedere con Interrogando il nostro Arduinocon un browser all'indirizzo <code>http: lo metteremo in gradodi poter "rispondere" alle richieste fatte sulla porta //192.168.0.80./</pcode>vedremo quindi ''497''.
===HTTP &amp; HTML===Ed eccoci quasi arrivati al termine.Dopo che il browser ha inviato la richiesta di connessioneal serverQuesto può essere visto nel dettaglio direttamente nel seguente codice Arduino, incomincia uno in particolare lo scambio di informazionifra i due, seguendo un protocollo molto rigorosodati: l'HTTP(HyperText Transfer Protocol). Il browser invia attivando la richiesta della pagina web, seguita da unalinea bianca per indicare il termine,e il server gli deve rispondere con un codice di approvazionetrasmissioneo di errore (a seconda se USB si vede in diretta tutta la pagina è disponibile o no),specificare il formato della pagina (HTML nel nostro caso)comunicazione HTTP fra lui e accodare finalmente il contenutobrowser.
Vedremo queste cose direttamente nel Si osservi che in realtà questo codice Arduinonon è strettamente conforme al protocollo HTTP,in particolare lo scambio di quanto esegue nessun controllo sulla pagina che viene richiesta (risponde sempre con la stessa pagina), né tantomeno specifica la lunghezza dei dati: attivando (chiude brutalmente la trasmissioneUSB si vede in diretta tutta la comunicazione HTTP fra luie il browserconnessione dopo che ha trasmesso tutti i dati).
==Il codice Arduino==
}
</pre>
 
Prossimamente vedremo come interagire via Ethernet con i componenti collegati
alla scheda.
[[Category:Howto]]

Menu di navigazione