Ethernet TCP povezava z Arduinom

Ethernet TCP povezava z Arduinom

Ethernet TCP povezava z Arduinom

S programskega vidika vzpostavitev povezave Ethernet z Arduino Je zelo preprosto. Če želite to narediti, uporabite Ethernet knjižnica. Ta knjižnica je zasnovana za a Ethernetni ščit ki temelji na integriranem W5100, vendar obstajajo druge različne plošče ali moduli in/ali ki uporabljajo druge integrirane, kot je ENC28J60. Da bi poenostavili njegovo uporabo in povečali združljivost, druge knjižnice uporabljajo (skoraj) enako API da Ethernet knjižnica, boste morali samo zamenjati alternativno knjižnico z izvirno ali jo vključiti (če je ime drugačno) na njeno mesto, tudi če so v kodi uporabljene iste (ali zelo podobne) funkcije. V mojem primeru uporabljam Knjižnica UIPEthernet de Norbert Truchsess po istem postopku, ki ga bom opisal v tem besedilu.

Modul ENC28J60 za uporabo s knjižnico UIPEthernet

1. Določite povezavo Ethernet

Ne glede na to, ali boste prevzeli vlogo stranke kot tisto strežnik, morate najprej določiti povezavo s funkcijo začeti () ki se lahko posreduje kot parameter samo MAC naslov in počakajte na strežnik DHCP v omrežju dodeli a IP naslov in ostalo konfiguracijo ali pa je možno navesti (neobvezno) več parametrov, dokler ni definirana popolna konfiguracija:

  1. Dirección MAC (kar je bilo že omenjeno)
  2. IP naslov ščita ali modula
  3. IP naslov strežnika DNS (samo en strežnik)
  4. IP naslov za Prehod
  5. Maska mreže

Priporočljivo je, da navedete vse parametre, razen če je njihov odbitek običajen, da preprečite, da konfiguracija ni pravilna (na primer, da prehod ni prvi naslov omrežja).

Iz zgoraj navedenega se zdi, da je jasno, da je treba podatke, ki predstavljajo naslove IP, uporabljati precej pogosto, zato knjižnica vključuje razred IP naslov iz katerega ustvariti objekte naslova IP. Parametri, ki ga definirajo, so štirje bajti naslova IPV4

La MAC naslov Za to knjižnico je definiran kot 6-bajtno polje. Naslov MAC je (naj bi bil) enolični identifikator, v katerem prvi bajti označujejo proizvajalca in model, zadnji pa določeno napravo. Integrirano ENC28J60 ne vključuje naslova MAC, razen če se odločite kupiti tudi a Integriran MAC naslov podjetja Microchip (ali cel blok DA naslovov na IEEE če je serija naprav dovolj velika, da se splača). Če nimate naslova MAC, si ga lahko izmislite in pazite, da ni v nasprotju z drugimi v omrežju, kjer je naprava.

Če se konfiguracija izvede s strežnikom DHCP namesto "ročno", funkcija lokalniIP() Koristno je preveriti naslov, ki ga je strežnik dodelil modulu. Za obnovitev dodeljenega naslova (če je ustrezen čas potekel) se Ethernet knjižnica zagotavlja funkcijo vzdrževati () ki bo tudi obvestila z vrnitvijo kode, ki ustreza statusu podaljšanja:

  1. Operacija ni imela učinka
  2. Napaka pri obnavljanju naslova IP
    Uporabe dodeljenega naslova IP na istem strežniku ni bilo mogoče razširiti
  3. Naslov IP je bil uspešno obnovljen
  4. Ponovno povezovanje naslova IP ni uspelo
    Uporabe dodeljenega naslova IP ni bilo mogoče razširiti na noben strežnik
  5. Naslov IP je bil uspešno ponovno dodeljen

Z informacijami, ki ste jih videli do zdaj, lahko napišete primer, kako bi se povezava Ethernet vzpostavila s konfiguracijo naslova IP prek strežnika DHCP v omrežju. Naslednji primer kode poskuša obnoviti naslov IP vsako določeno časovno obdobje in poroča o rezultatu.

Spodnji primer ročno dodeljuje naslov IP in preostalo konfiguracijo z uporabo objektov IP naslov da bo bolj udoben za branje in (v primeru kompleksnejše kode) da se izognemo napakam, do katerih bi lahko prišlo, če bi bil naslov ob vsaki uporabi (napačen) zapisan.

2. Zaženite povezavo v načinu odjemalca ali strežnika

Pri vzpostavljanju povezave v strežniškem načinu je mikrokrmiljeni sistem, ki se razvija, poslušati zahteve drugih sistemov. Če želite vzpostaviti povezavo kot strežnik, uporabite EthernetServer() in vrata, na katerih bo strežnik poslušal, so navedena kot parameter. EthernetServer() je konstruktor razreda Server, ki podpira vse operacije Ethernet kot strežnik. Čeprav je najbolj ortodoksna stvar klic konstruktorja EthernetServer(), ni neobičajno najti nekaj primerov, ki neposredno uporabljajo razred Server ali alternativne knjižnice za ethernetno povezavo, ki se odločijo za uporabo tega instanciacijskega sistema.

Povezava kot odjemalec je tista, ki postavlja zahteve strežniškemu sistemu, ki jih počaka in jim ustrezno odgovori. Če želite vzpostaviti povezavo kot odjemalec, uporabite EthernetClient() kaj je konstruktor razreda Pomoč izvor vseh operacij Ethernet kot odjemalec.

Za razliko od tega, kar se zgodi s strežniškim načinom, za katerega se domneva, da deluje od trenutka, ko je razred instanciran (čeprav se bo odjemalcem odzval le, če je res), morate pred uporabo preveriti, ali je odjemalska povezava pripravljena. Predmet odjemalca, ki je ustvarjen ob vzpostavitvi povezave, je mogoče poizvedovati, ali je na voljo. Na primer, operacije poizvedbe so lahko vključene v strukturo če (EthernetClient) da jih izvede le, ko je na voljo odjemalska povezava.

3. Vzpostavite povezavo kot odjemalec

Kot rečeno, ko je povezava vzpostavljena, je odjemalec tisti, ki prevzame pobudo za poizvedovanje. Strežnik bo čakal na to pobudo in se ustrezno odzval. Zato je odjemalec tisti, ki se poveže s strežnikom in za to uporabljamo povezati () ki navaja strežnik kot parametre (naslov IP ali URL) in port v tistem, ki posluša.

Na podlagi rezultata operacije bo funkcija vrnila vrednosti

  1. (USPEH) Povezava je bila uspešno vzpostavljena
  2. Vzpostavljanje povezave
  3. (TIMED_OUT) Časovna omejitev je potekla brez vzpostavitve povezave
  4. (INVALID_SERVER) Strežnika ni bilo mogoče najti ali pa se ne odziva pravilno
  5. (OKRNJENO) Povezava je bila prekinjena, preden je bila v celoti vzpostavljena
  6. (INVALID_RESPONSE) Odgovor strežnika ni pravilen

Preden začnete izvajati poizvedbe, je treba preveriti, ali povezava s funkcijo deluje povezan() ki se bo vrnil Res če je že na voljo oz false drugače.

Spodnji primer ponazarja povezavo kot odjemalec, ki vsakih 10 sekund preverja, ali je vzpostavljena povezava s strežnikom (ni mišljeno kot nič produktivnega, samo za prikaz sintakse funkcij) nekaj, kar mimogrede produkcijski spletni strežnik ne bi bil zelo všeč.

4. Pošljite podatke

Tako kot drugi bolj znani razredi, kot je npr Serijska, pri primerljivi uporabi pa razrede Pomoč y Server imajo funkcije

  • pisati(dejstvo) o pisati(medpomnilnik, dolžina)

    Pošlje informacije z uporabo objekta odjemalca ali strežnika, iz katerega je priklican. Parameter "podatki" je en sam bajt o kočija medtem ko je "buffer" niz bajt o kočija od tega je poslana količina enaka "dolžini". Ta funkcija se uporablja za binarne operacije, v primerjavi z naslednjima dvema, ki sta običajno rezervirani za pošiljanje besedila.

  • print(podatki, baza)

    Pošlje kot odjemalec ali strežnik (odvisno od razreda, iz katerega se uporablja) informacije, ki ustrezajo "podatkom", kot besedilo. Če informacija ni izražena kot besedilo (na primer je celo število), lahko uporabite izbirni parameter "osnova", s katerim izberete pretvorbo, ki je lahko ena od konstant BIN, OCT, DEC ali HEX, ki označujejo oz. .osnove, ki ustrezajo dvojiški (osnova 2), osmiški (osnova 8), decimalni (osnova 10) in šestnajstiški (osnova 16)

  • println(podatki, baza)

    Operacija je enaka prejšnji, razen za pošiljanje, po informacijah, ki jih izrecno nakazuje parameter "data", vrnitve v začetek (koda 13, ki je lahko predstavljena kot \r) in konca vrstice (koda 10, ki je lahko predstavljeno z \n) Te kode se pogosto imenujejo z akronimi CR (povratek na začetek vrstice) in LF (pomik vrstice)

Tri prejšnje funkcije vrnejo število bajtov, ki so bili poslani, prav tako enakovredne funkcije razreda Serijska; Kot je navedeno zgoraj, je operacija primerljiva.

5. Prejemanje podatkov

Tako kot v primeru operacij pošiljanja podatkov so operacije prejemanja primerljive s tistimi pri široko uporabljenih Serijska. Tudi protokol prejema je podoben: preverite, ali je na voljo (dovolj) podatkov (Na voljo) in jih v tem primeru preberite


  • na voljo ()

    Vrne število bajtov, ki so na voljo za branje. Ta funkcija je prisotna v obeh razredih Pomoč kot Server; V prvem primeru poroča o številu bajtov, ki jih je strežnik poslal kot odgovor na zahtevo in so na voljo odjemalcu za branje (preberite), v drugem primeru pa odjemalec (objekt), ki je izvedel operacijo ali false, če je ni.

  • preberi ()

    Uporablja se za branje prejetih informacij. Ta funkcija je na voljo samo v razredu Pomoč. Če aplikacija, ki se razvija, izpolnjuje vlogo strežnika, mora biti za branje prispelih informacij instanciran objekt odjemalca z odgovorom funkcije na voljo () razpravljali v prejšnjem razdelku.

Naslednji primer je "strežnik z velikimi črkami", ki posluša na vratih 2000 in se na zahteve odzove z vsem, kar je bilo poslano z velikimi črkami, kadar je to mogoče. Lahko se preizkusi, na primer, z PuTTY ali preprosto z telnet 2000 Vsekakor ni zelo praktičen, njegov namen je samo pokazati, kako pridobiti podatke, ki mu jih pošlje odjemalec s strežnika.

6. Prekinite povezavo

Medtem ko je običajno, da strežniška aplikacija teče neomejeno dolgo, se odjemalske povezave vzpostavijo, vzpostavijo povezave in prekinejo, kar omogoča obnovitev virov in njihovo uporabo v drugih povezavah ali namenjenih drugim uporabam programa. Funkcija stop () razreda Pomoč Uporablja se za prekinitev povezave odjemalca in sprostitev virov, ki jih uporablja.

Strežniku dejstvo, da odjemalec prekine povezavo, ko je bil informacijski objekt poizvedbe poslan ali prejet, prav tako omogoča, da sprosti vire, da jih dodeli drugim povezavam ali drugim namenom. Skratka, čeprav se zdi nepomembno, je priporočljivo prekiniti povezavo, ko se končajo operacije odjemalca.

Druga dobra praksa pri prekinitvi povezave odjemalca je, da izpraznite ki jih razred uporablja. Če želite to narediti, je na voljo funkcija flush () je treba poklicati po prekinitvi povezave odjemalca z stop ()

Primer poizvedbe HTTP GET

Za boljšo razjasnitev vsega zgoraj navedenega je spodaj vključen popolnejši primer zahtev. TCP z uporabo zahtev GET z uporabo protokol HTTP. V primeru so vrednosti, pridobljene z analognimi senzorji, povezanimi s ploščo Arduino, poslane spletnemu strežniku, ki jih shrani v bazo podatkov.

po Komentar

Morda ste zamudili