Ethernet TCP-tilkobling med Arduino

Ethernet TCP-tilkobling med Arduino

Ethernet TCP-tilkobling med Arduino

Fra et programvaresynspunkt, etablere en forbindelse Ethernet med Arduino Det er veldig enkelt. For å gjøre dette, bruk Ethernet-bibliotek. Dette biblioteket er designet for en Ethernet Shield som er basert på det integrerte W5100, men det finnes andre forskjellige tavler eller moduler og/eller som bruker andre integrerte, for eksempel ENC28J60. For å forenkle bruken og øke kompatibiliteten bruker andre biblioteker (nesten) det samme API at Ethernet-bibliotek, vil du bare måtte erstatte det alternative biblioteket med det originale eller inkludere det (når navnet er annerledes) i stedet selv om de samme (eller svært like) funksjonene brukes i koden. I mitt tilfelle bruker jeg UIPEthernet-bibliotek de Norbert Truchsess etter den samme prosessen som jeg skal beskrive i denne teksten.

ENC28J60-modul for bruk med UIPEthernet-biblioteket

1. Definer Ethernet-tilkoblingen

Enten du skal påta deg rollen som kunde som for eksempel server, først og fremst må du definere forbindelsen med funksjonen begynne () som bare kan sendes som en parameter MAC-adresse og vent på en server DHCP på nettverket tilordne en IP adresse og resten av konfigurasjonen, eller det er også mulig å indikere (valgfritt) flere parametere til den fullstendige konfigurasjonen er definert:

  1. Dirección MAC (som allerede er nevnt)
  2. IP-adresse av skjoldet eller modulen
  3. Server IP-adresse DNS (kun én server)
  4. IP-adressen til Inngangsport
  5. Nettmaske

Det anbefales å angi alle parameterne, med mindre fradraget deres er det vanlige, for å unngå at konfigurasjonen ikke er riktig (for eksempel at gatewayen ikke er den første adressen til nettverket).

Fra ovenstående ser det ut til at det er klart at data som representerer IP-adresser må brukes ganske ofte, og det er grunnen til at biblioteket inkluderer klassen IP adresse for å instansiere IP-adresseobjekter. Parametrene som definerer det er de fire bytene til en adresse IPV4

La MAC-adresse Det er definert for dette biblioteket som en 6-byte array. MAC-adressen er (antas å være) en unik identifikator der de første bytene indikerer produsenten og modellen og de siste indikerer den spesifikke enheten. Det integrerte ENC28J60 inkluderer ikke en MAC-adresse med mindre du velger å også kjøpe en Integrert MAC-adresse fra Microchip (eller en hel blokk ja av adresser til IEEE hvis antallet enheter er stort nok til å gjøre det verdt det). Når du ikke har en MAC-adresse, kan du finne opp en, pass på at den ikke kommer i konflikt med andre på nettverket der enheten er plassert.

Hvis konfigurasjonen gjøres med en DHCP-server i stedet for "for hånd", funksjonen localIP() Det er nyttig å se adressen som serveren har tildelt modulen. For å fornye den tildelte adressen (hvis den tilsvarende tiden er utløpt), må du Ethernet-bibliotek gir funksjonen vedlikeholde() som også vil informere ved å returnere en kode som tilsvarer statusen til fornyelsen:

  1. Operasjonen har ikke hatt effekt
  2. Feil under fornyelse av IP-adresse
    Bruken av den tildelte IP-adressen på samme server kunne ikke utvides
  3. IP-adressen ble fornyet
  4. Ombinding av IP-adresse mislyktes
    Bruken av den tildelte IP-adressen kunne ikke utvides på noen server
  5. IP-adressen ble tildelt på nytt

Med informasjonen sett så langt, kan du skrive et eksempel på hvordan en Ethernet-tilkobling vil bli initiert ved å konfigurere IP-adressen gjennom en DHCP-server på nettverket. Følgende eksempelkode prøver å fornye IP-adressen hver bestemt tidsperiode og rapporterer resultatet.

Eksemplet nedenfor tildeler IP-adressen og resten av konfigurasjonen manuelt ved å bruke objekter IP adresse for å gjøre det mer behagelig å lese og (ved mer kompleks kode) for å unngå feil som kan oppstå hvis adressen ble (feil)skrevet hver gang den ble brukt.

2. Start tilkoblingen i klient- eller servermodus

Ved initiering av en tilkobling i servermodus er det det mikrokontrollerte systemet som utvikles som lytter til forespørsler fra andre systemer. For å starte tilkoblingen som en server, bruk EthernetServer() og porten som serveren vil lytte til er indikert som en parameter. EthernetServer() er konstruktøren av klassen Server, som støtter alle Ethernet-operasjoner som en server. Selv om det mest ortodokse er å ringe konstruktøren EthernetServer(), er det ikke uvanlig å finne noen eksempler som direkte bruker klassen Server eller alternative biblioteker for Ethernet-tilkobling som velger å bruke det instansieringssystemet.

Tilkoblingen som klient er den som sender forespørsler til serversystemet, som venter på dem og svarer deretter. For å starte en tilkobling som klient, bruk EthernetClient() hva er konstruktøren av klassen kunde opprinnelsen til alle Ethernet-operasjoner som klient.

I motsetning til det som skjer med servermodus, som antas å fungere fra det øyeblikket klassen instansieres (selv om den vil svare på klienter bare hvis den virkelig er det), må du bekrefte at klienttilkoblingen er klar før du bruker den. Klientobjektet som opprettes når tilkoblingen startes, kan spørres for å se om det er tilgjengelig. For eksempel kan spørringsoperasjoner inkluderes i en struktur if(EthernetClient) å kjøre dem bare når klientforbindelsen er tilgjengelig.

3. Etabler en forbindelse som klient

Som sagt, når tilkoblingen er opprettet, er det klienten som tar initiativet til å stille spørsmålene. Serveren vil vente på dette initiativet og vil svare deretter. Det er derfor klienten som kobler til serveren, for å gjøre det vi bruker koble() angir serveren som parametere (IP-adressen eller URL) Og port hos den som lytter.

Basert på resultatet av operasjonen vil funksjonen returnere verdiene

  1. (SUKSESS) Tilkobling opprettet
  2. Etablering av forbindelsen
  3. (TIDSAVBRUDD) Tidsavbrudd har gått uten at tilkobling er opprettet
  4. (INVALID_SERVER) Serveren ble ikke funnet eller svarer ikke riktig
  5. (AVKORTET) Forbindelsen ble avbrutt før den ble fullstendig etablert
  6. (INVALID_RESPONSE) Serversvar er feil

Før du begynner å stille spørsmål, er det nødvendig å verifisere at forbindelsen er operativ med funksjonen tilkoblet() som kommer tilbake sant hvis den allerede er tilgjengelig eller falsk ellers.

Eksemplet nedenfor illustrerer tilkoblingen som en klient, og sjekker hvert 10. sekund for å se om det er en tilkobling til serveren (den er ikke ment å være noe produktivt, bare for å vise syntaksen til funksjonene) noe som forresten, en produksjonswebserver vil ikke like mye.

4. Send data

Som andre mer kjente klasser, som f.eks Serial, og med sammenlignbar bruk, klassene kunde y Server har funksjonene

  • skrive(faktum) o skrive(buffer, lengde)

    Sender informasjon ved hjelp av klient- eller serverobjektet som det påkalles fra. "Data"-parameteren er en enkelt byte o chariot mens "buffer" er en rekke av byte o chariot hvorav et beløp lik "lengde" sendes Denne funksjonen er den som brukes for binære operasjoner, sammenlignet med de to neste som vanligvis er reservert for sending av tekst.

  • skrive ut(data, base)

    Sender som en klient eller server (avhengig av hvilken klasse den brukes fra) informasjonen som tilsvarer "data" som tekst. Hvis informasjonen ikke er uttrykt som tekst (det er for eksempel et heltall) kan den valgfrie parameteren "base" brukes til å velge konverteringen, som kan være en av konstantene BIN, OCT, DEC eller HEX som indikerer hhv. baser som tilsvarer binær (base 2), oktal (base 8), desimal (base 10) og heksadesimal (base 16)

  • utskrift(data, base)

    Operasjonen er identisk med den forrige bortsett fra å sende, etter informasjonen som uttrykkelig er angitt av "data"-parameteren, en vognretur (kode 13 som kan representeres som \r) og en slutt på linjen (kode 10, som kan være representert av \n) Disse kodene blir ofte referert til henholdsvis med akronymet CR (Carriage Return) og LF (linjemating)

De tre foregående funksjonene returnerer antall byte som er sendt, det samme gjør de tilsvarende funksjonene til klassen Serial; Som nevnt ovenfor er operasjonen sammenlignbar.

5. Motta data

Som i tilfellet med datasendingsoperasjoner, er mottaksoperasjoner sammenlignbare med de mye brukte Serial. Mottaksprotokollen er også lik: sjekk om det er (nok) data tilgjengelig (tilgjengelig) og i så fall les dem


  • tilgjengelig ()

    Returnerer antall byte som er tilgjengelig for å bli lest. Denne funksjonen finnes i begge klasser kunde som Server; I det første tilfellet rapporterer den antall byte som serveren har sendt som svar på en forespørsel og som er tilgjengelig for klienten å lese (lese), og i det andre tilfellet klienten (objektet) som har utført en operasjon eller falsk hvis det ikke er noen.

  • lese()

    Den brukes til å lese informasjonen som er mottatt. Denne funksjonen er kun tilgjengelig i klassen kunde. Hvis applikasjonen som utvikles oppfyller rollen som server, for å lese informasjonen som har kommet, må et klientobjekt instansieres med funksjonssvaret tilgjengelig () diskutert i forrige avsnitt.

Følgende eksempel er en "caps-server" som lytter på port 2000 og svarer på forespørsler med alt som ble sendt med store bokstaver når det er mulig. Den kan testes for eksempel med PuTTY eller rett og slett med telnet 2000 Det er absolutt ikke veldig praktisk, dens formål er bare å vise hvordan man kan hente dataene sendt til den av en klient fra serveren.

6. Avslutt tilkoblingen

Selv om det er vanlig at en serverapplikasjon kjører på ubestemt tid, opprettes klienttilkoblinger, oppretter tilkoblinger og avsluttes, slik at ressurser kan gjenopprettes og brukes i andre tilkoblinger eller dedikeres til annen bruk av programmet. Funksjonen Stoppe() av klassen kunde Den brukes til å avslutte en klientforbindelse og frigjøre alle ressurser den bruker.

For serveren vil det faktum at klienten avslutter forbindelsen når informasjonsobjektet for spørringen er sendt eller mottatt, også frigjøre ressurser for å allokere dem til andre forbindelser eller andre formål. Kort sagt, selv om det virker lite, er det tilrådelig å avslutte forbindelsen når klientens operasjoner avsluttes.

En annen god praksis når du avslutter en klientforbindelse er å tømme som klassen bruker. For å gjøre dette er funksjonen tilgjengelig flush() skal kalles opp etter at klientforbindelsen er avsluttet Stoppe()

Eksempel på HTTP GET-søk

For bedre å avklare alt ovenfor, er et mer fullstendig eksempel på forespørsler inkludert nedenfor. TCP ved å bruke GET-forespørslene ved å bruke HTTP-protokoll. I eksemplet sendes verdiene oppnådd av analoge sensorer koblet til et Arduino-kort til en webserver som lagrer dem i en database.

Legg inn kommentar

Du kan ha gått glipp av