Conexiune Ethernet TCP cu Arduino

Conexiune Ethernet TCP cu Arduino

Conexiune Ethernet TCP cu Arduino

Din punct de vedere software, stabilirea unei conexiuni Ethernet cu Arduino Este foarte simplu. Pentru a face acest lucru, utilizați Bibliotecă Ethernet. Această bibliotecă este concepută pentru a Scut Ethernet care se bazează pe integrat W5100, dar există și alte plăci sau module diferite și/sau care folosesc altele integrate, cum ar fi ENC28J60. Pentru a simplifica utilizarea și pentru a crește compatibilitatea, alte biblioteci folosesc (aproape) același lucru APIBibliotecă Ethernet, va trebui doar să înlocuiți biblioteca alternativă cu cea originală sau să o includeți (când numele este diferit) în locul ei chiar dacă în cod sunt folosite aceleași (sau foarte asemănătoare) funcții. În cazul meu, folosesc Biblioteca UIPEthernet de Norbert Truchsess urmând același proces pe care îl voi descrie în acest text.

Modul ENC28J60 pentru utilizare cu biblioteca UIPEthernet

1. Definiți conexiunea Ethernet

Fie că vei adopta rolul de client precum serverul, in primul rand trebuie sa definesti legatura cu functia începe () care poate fi trecut ca parametru numai cel Adresa MAC și așteptați un server DHCP pe rețea atribuiți a adresă IP și restul configurației sau este, de asemenea, posibil să se indice (opțional) mai mulți parametri până când este definită configurația completă:

  1. Dirección MAC (care a fost deja menționat)
  2. Adresa IP a scutului sau a modulului
  3. Adresa IP a serverului DNS (doar un server)
  4. Adresa IP a Gateway
  5. Mască de plasă

Este indicat să indicați toți parametrii, cu excepția cazului în care deducerea lor este cea obișnuită, pentru a evita ca configurația să nu fie corectă (de exemplu, că gateway-ul nu este prima adresă a rețelei).

Din cele de mai sus se pare că este clar că datele reprezentând adrese IP trebuie folosite destul de des, motiv pentru care biblioteca include clasa Adresa IP din care să instanțieze obiecte de adresă IP. Parametrii care o definesc sunt cei patru octeți ai unei adrese IPV4

La Adresa MAC Este definit pentru această bibliotecă ca o matrice de 6 octeți. Adresa MAC este (se presupune a fi) un identificator unic în care primii octeți indică producătorul și modelul, iar ultimii indică dispozitivul specific. Cea integrată ENC28J60 nu include o adresă MAC decât dacă alegeți să cumpărați și a Adresă MAC integrată de la Microcip (sau un bloc întreg DA de adrese către IEEE dacă rulajul de dispozitive este suficient de mare pentru a merita). Când nu aveți o adresă MAC, puteți inventa una, având grijă să nu intre în conflict cu altele din rețeaua în care se află dispozitivul.

Dacă configurarea se face cu un server DHCP în loc de „de mână”, funcția localIP() Este util să consultați adresa pe care serverul a atribuit-o modulului. Pentru a reînnoi adresa atribuită (dacă timpul corespunzător a expirat) Bibliotecă Ethernet oferă funcția menţine() care va informa și prin returnarea unui cod care corespunde stării reînnoirii:

  1. Operațiunea nu a avut niciun efect
  2. Eroare la reînnoirea adresei IP
    Utilizarea adresei IP atribuite pe același server nu a putut fi extinsă
  3. Adresa IP a fost reînnoită cu succes
  4. Relegarea adresei IP a eșuat
    Utilizarea adresei IP atribuite nu a putut fi extinsă pe niciun server
  5. Adresa IP a fost reatribuită cu succes

Cu informațiile văzute până acum, puteți scrie un exemplu despre cum ar fi inițiată o conexiune Ethernet prin configurarea adresei IP printr-un server DHCP din rețea. Următorul exemplu de cod încearcă să reînnoiască adresa IP la fiecare anumită perioadă de timp și raportează rezultatul.

Exemplul de mai jos atribuie adresa IP și restul configurației manual folosind obiecte Adresa IP pentru a face mai confortabil de citit și (în cazul unui cod mai complex) pentru a evita erorile care ar putea apărea dacă adresa a fost (gre)scrisă de fiecare dată când a fost folosită.

2. Porniți conexiunea în modul client sau server

La inițierea unei conexiuni în modul server, sistemul microcontrolat care se dezvoltă este cel care ascultă cererile de la alte sisteme. Pentru a porni conexiunea ca server, utilizați EthernetServer() iar portul pe care serverul va asculta este indicat ca parametru. EthernetServer() este constructorul clasei server de, care acceptă toate operațiunile Ethernet ca server. Deși cel mai ortodox lucru este să faci un apel către constructor EthernetServer(), nu este neobișnuit să găsiți câteva exemple care folosesc direct clasa server de sau biblioteci alternative pentru conexiunea Ethernet care aleg să folosească acel sistem de instanțiere.

Conexiunea ca client este cea care face cereri către sistemul server, care le așteaptă și le răspunde în consecință. Pentru a iniția o conexiune ca client, utilizați EthernetClient() care este constructorul clasei Client originea tuturor operațiunilor Ethernet ca client.

Spre deosebire de ceea ce se întâmplă cu modul server, care se presupune că funcționează din momentul în care clasa este instanțiată (deși va răspunde clienților doar dacă este într-adevăr), trebuie să verificați dacă conexiunea client este gata înainte de a o utiliza. Obiectul client care este creat la inițierea conexiunii poate fi interogat pentru a vedea dacă este disponibil. De exemplu, operațiunile de interogare pot fi incluse într-o structură if(EthernetClient) să le execute numai atunci când conexiunea client este disponibilă.

3. Stabiliți o conexiune ca client

După cum sa spus, odată ce conexiunea este creată, clientul este cel care ia inițiativa de a face interogările. Serverul va aștepta acea inițiativă și va răspunde în consecință. Este, prin urmare, clientul care se conectează la server, pentru a face asta folosim conectați () indicând serverul ca parametri (adresa IP sau URL-ul) și port în cel care ascultă.

Pe baza rezultatului operației, funcția va returna valorile

  1. (SUCCES) Conexiunea stabilită cu succes
  2. Stabilirea conexiunii
  3. (EXPIRAT) Timeout a trecut fără ca conexiunea să fie stabilită
  4. (INVALID_SERVER) Serverul nu a fost găsit sau nu răspunde corect
  5. (TUNCHIS) Conexiunea a fost întreruptă înainte de a fi stabilită complet
  6. (INVALID_RESPONSE) Răspunsul serverului este incorect

Înainte de a începe să faceți interogări, este necesar să verificați dacă conexiunea este funcțională cu funcția conectat() care se va întoarce adevărat dacă este deja disponibil sau fals in caz contrar.

Exemplul de mai jos ilustrează conexiunea ca client, verificând la fiecare 10 secunde dacă există o conexiune cu serverul (nu se dorește să fie ceva productiv, doar să arate sintaxa funcțiilor) ceva care, de altfel, o producție. serverul web nu ar dori foarte mult.

4. Trimiteți date

Ca și alte clase mai cunoscute, precum Serial, și cu utilizare comparabilă, clasele Client y server de au functiile

  • scrie(fapt) o scrie(tampon, lungime)

    Trimite informații utilizând obiectul client sau server de la care sunt invocate. Parametrul „date” este unul singur octet o car de război în timp ce „buffer” este o matrice de octet o car de război din care se trimite o suma egala cu "lungimea". Aceasta functie este cea folosita pentru operatii binare, fata de urmatoarele doua care sunt de obicei rezervate pentru trimiterea textului.

  • imprima(Bază de date)

    Trimite ca client sau server (in functie de clasa din care este folosit) informatia corespunzatoare "datelor" ca text. Dacă informația nu este exprimată sub formă de text (de exemplu este un număr întreg) pentru a alege conversia se poate folosi parametrul opțional „bază”, care ar putea fi una dintre constantele BIN, OCT, DEC sau HEX care indică, respectiv. baze corespunzătoare binar (bază 2), octal (bază 8), zecimal (bază 10) și hexazecimal (bază 16)

  • println(Bază de date)

    Operațiunea este identică cu cea anterioară cu excepția trimiterii, după informațiile indicate expres de parametrul „date”, a unui retur car (cod 13 care poate fi reprezentat ca \r) și a unui capăt de linie (cod 10, care poate fi reprezentate prin \n) Aceste coduri sunt frecvent denumite, respectiv, prin acronim CR (Întoarcerea căruciorului) și LF (Alimentare linie)

Cele trei funcții anterioare returnează numărul de octeți care au fost trimiși, la fel ca și funcțiile echivalente ale clasei Serial; După cum sa spus mai sus, operațiunea este comparabilă.

5. Primiți date

Ca și în cazul operațiunilor de transmitere a datelor, operațiunile de recepție sunt comparabile cu cele ale celor larg utilizate Serial. Protocolul de recepție este, de asemenea, similar: verificați dacă există (suficiente) date disponibile (disponibil) și, în acest caz, citiți-le


  • disponibil ()

    Returnează numărul de octeți care sunt disponibili pentru a fi citiți. Această funcție este prezentă în ambele clase Client ca server de; În primul caz, raportează numărul de octeți pe care serverul i-a trimis ca răspuns la o solicitare și care este disponibil pentru citire de către client (citit), iar în al doilea caz clientul (obiectul) care a efectuat o operație sau fals dacă nu există.

  • citit()

    Este folosit pentru a citi informațiile care au fost primite. Această funcție este disponibilă numai în clasă Client. Dacă aplicația în curs de dezvoltare îndeplinește rolul de server, pentru a citi informațiile sosite, trebuie instanțiat un obiect client cu răspunsul funcției disponibil () discutat în secțiunea anterioară.

Următorul exemplu este un „server cu majuscule” care ascultă pe portul 2000 și răspunde la solicitări cu orice a fost trimis cu majuscule atunci când este posibil. Poate fi testat, de exemplu, cu PuTTY sau pur și simplu cu telnet 2000 Cu siguranță nu este foarte practic, scopul său este doar de a arăta cum să obțină datele trimise către acesta de un client de pe server.

6. Încheiați conexiunea

Deși este obișnuit ca o aplicație server să ruleze pe termen nelimitat, conexiunile client sunt stabilite, se realizează și se termină, permițând recuperarea resurselor și utilizarea în alte conexiuni sau dedicate altor utilizări ale programului. Functia Stop() a clasei Client Este folosit pentru a termina o conexiune client și pentru a elibera orice resurse pe care le folosește.

Pentru server, faptul că clientul întrerupe conexiunea atunci când obiectul de informare al interogării a fost trimis sau primit îi permite, de asemenea, să elibereze resurse pentru a le aloca altor conexiuni sau scopuri diferite. Pe scurt, deși pare minor, este indicat să întrerupeți conexiunea atunci când operațiunile clientului se termină.

O altă practică bună atunci când închideți o conexiune client este golirea fișierului pe care le folosește clasa. Pentru a face acest lucru, funcția este disponibilă culoare() ar trebui apelat după terminarea conexiunii client cu Stop()

Exemplu de interogare HTTP GET

Pentru a clarifica mai bine toate cele de mai sus, mai jos este inclus un exemplu mai complet de cereri. TCP folosind cererile GET folosind Protocolul HTTP. În exemplu, valorile obținute de senzorii analogici conectați la o placă Arduino sunt trimise către un server web care le stochează într-o bază de date.

Posteaza un comentariu

S-ar putea să fi ratat