Ethernet TCP-anslutning med Arduino

Ethernet TCP-anslutning med Arduino

Ethernet TCP-anslutning med Arduino

Ur mjukvarusynpunkt, upprätta en anslutning ethernet med Arduino Det är väldigt enkelt. För att göra detta, använd Ethernet-bibliotek. Detta bibliotek är designat för en Ethernet Shield som bygger på det integrerade W5100, men det finns andra olika kort eller moduler och/eller som använder andra integrerade, till exempel ENC28J60. För att förenkla användningen och öka kompatibiliteten använder andra bibliotek (nästan) samma sak API att Ethernet-bibliotek, du behöver bara ersätta det alternativa biblioteket med det ursprungliga eller inkludera det (när namnet är annorlunda) i dess ställe även om samma (eller mycket liknande) funktioner används i koden. I mitt fall använder jag UIPEthernet-bibliotek de Norbert Truchsess efter samma process som jag kommer att beskriva i den här texten.

ENC28J60-modul för användning med UIPEthernet-biblioteket

1. Definiera Ethernet-anslutningen

Oavsett om du ska anta rollen som kund som den av server, först och främst måste du definiera kopplingen till funktionen Börja () som endast kan skickas som en parameter MAC-adress och vänta på en server DHCP- på nätverket tilldela en IP-adress och resten av konfigurationen eller så är det också möjligt att ange (valfritt) fler parametrar tills den fullständiga konfigurationen är definierad:

  1. Dirección MAC (vilket redan har nämnts)
  2. IP-adress av skölden eller modulen
  3. Server IP-adress DNS (endast en server)
  4. IP-adressen till Inkörsport
  5. nätmask

Det är tillrådligt att ange alla parametrar, såvida deras avdrag inte är den vanliga, för att undvika att konfigurationen inte är korrekt (till exempel att gatewayen inte är den första adressen till nätverket).

Av ovanstående tycks det vara tydligt att data som representerar IP-adresser måste användas ganska ofta, varför biblioteket inkluderar klassen IP-adress varifrån IP-adressobjekt kan instansieras. Parametrarna som definierar det är de fyra byten av en adress IPV4

La MAC-adress Det är definierat för detta bibliotek som en 6-byte array. MAC-adressen är (förmodas vara) en unik identifierare där de första byten indikerar tillverkare och modell och de sista indikerar den specifika enheten. Den integrerade ENC28J60 inkluderar inte en MAC-adress om du inte väljer att också köpa en Integrerad MAC-adress från Microchip (eller ett helt block ja av adresser till IEEE om antalet enheter är tillräckligt stort för att göra det värt besväret). När du inte har en MAC-adress kan du uppfinna en och se till att den inte kommer i konflikt med andra på nätverket där enheten är placerad.

Om konfigurationen görs med en DHCP-server istället för "för hand", funktionen localIP() Det är användbart att konsultera adressen som servern har tilldelat modulen. För att förnya den tilldelade adressen (om motsvarande tid har löpt ut) Ethernet-bibliotek tillhandahåller funktionen upprätthålla() som också kommer att informera genom att returnera en kod som motsvarar statusen för förnyelsen:

  1. Operationen har inte haft någon effekt
  2. Fel vid förnyelse av IP-adress
    Användningen av den tilldelade IP-adressen på samma server kunde inte utökas
  3. IP-adressen har förnyats
  4. Ombindningen av IP-adressen misslyckades
    Användningen av den tilldelade IP-adressen kunde inte utökas på någon server
  5. IP-adressen har omtilldelats

Med den information som vi sett hittills kan du skriva ett exempel på hur en Ethernet-anslutning skulle initieras genom att konfigurera IP-adressen via en DHCP-server i nätverket. Följande exempelkod försöker förnya IP-adressen varje viss tidsperiod och rapporterar resultatet.

Exemplet nedan tilldelar IP-adressen och resten av konfigurationen manuellt med hjälp av objekt IP-adress för att göra det bekvämare att läsa och (vid mer komplex kod) för att undvika fel som kan uppstå om adressen (fel)skrivs varje gång den användes.

2. Starta anslutningen i klient- eller serverläge

Vid initiering av en anslutning i serverläge är det det mikrokontrollerade systemet som utvecklas som lyssnar på förfrågningar från andra system. För att starta anslutningen som en server, använd EthernetServer() och porten som servern kommer att lyssna på anges som en parameter. EthernetServer() är klassens konstruktör server, som stöder alla Ethernet-operationer som en server. Även om det mest ortodoxa är att ringa konstruktören EthernetServer(), är det inte ovanligt att hitta några exempel som direkt använder klassen server eller alternativa bibliotek för Ethernet-anslutning som väljer att använda det instansieringssystemet.

Anslutningen som klient är den som gör förfrågningar till serversystemet, som väntar på dem och svarar på dem därefter. För att initiera en anslutning som klient, använd EthernetClient() vad är konstruktören av klassen Klient ursprunget för alla Ethernet-operationer som klient.

Till skillnad från vad som händer med serverläge, som antas fungera från det ögonblick klassen instansieras (även om den bara svarar på klienter om den verkligen är det), måste du verifiera att klientanslutningen är klar innan du använder den. Klientobjektet som skapas när anslutningen initieras kan frågas för att se om det är tillgängligt. Till exempel kan frågeoperationer inkluderas i en struktur if(EthernetClient) att köra dem endast när klientanslutningen är tillgänglig.

3. Upprätta en koppling som klient

Som sagt, när anslutningen väl har skapats är det kunden som tar initiativet till att göra förfrågningarna. Servern kommer att vänta på det initiativet och kommer att svara därefter. Det är därför klienten som ansluter till servern som vi använder för att göra det ansluta() anger servern som parametrar (IP-adressen eller URL) och port hos den som lyssnar.

Baserat på resultatet av operationen kommer funktionen att returnera värdena

  1. (FRAMGÅNG) Anslutningen har upprättats
  2. Att upprätta kopplingen
  3. (TIMED_OUT) Timeout har passerat utan att anslutning har upprättats
  4. (INVALID_SERVER) Servern hittades inte eller svarar inte korrekt
  5. (TRUNKERAD) Anslutningen avbröts innan den upprättades helt
  6. (INVALID_RESPONSE) Serverns svar är felaktigt

Innan du börjar göra frågor är det nödvändigt att verifiera att anslutningen fungerar med funktionen ansluten() som kommer tillbaka sann om den redan är tillgänglig eller falsk annat.

Exemplet nedan illustrerar anslutningen som en klient, kontrollerar var 10:e sekund för att se om det finns en anslutning till servern (det är inte tänkt att vara något produktivt, bara för att visa syntaxen för funktionerna) något som förresten, en produktionswebbserver skulle inte gilla så mycket.

4. Skicka data

Som andra mer kända klasser, som t.ex Serial, och med jämförbar användning, klasserna Klient y server har funktionerna

  • skriva(faktum) o skriva(buffert, längd)

    Skickar information med hjälp av klient- eller serverobjektet från vilket det anropas. Parametern "data" är en singel bitgrupp o röding medan "buffert" är en uppsättning av bitgrupp o röding varav ett belopp lika med "längd" skickas. Denna funktion är den som används för binära operationer, jämfört med de kommande två som vanligtvis är reserverade för att skicka text.

  • skriv ut(data, bas)

    Skickar som en klient eller server (beroende på vilken klass den används från) informationen som motsvarar "data" som text. Om informationen inte uttrycks som text (det är till exempel ett heltal) kan den valfria parametern "bas" användas för att välja konverteringen, som kan vara en av konstanterna BIN, OCT, DEC eller HEX som anger respektive. baser som motsvarar binär (bas 2), oktal (bas 8), decimal (bas 10) och hexadecimal (bas 16)

  • tryckln(data, bas)

    Operationen är identisk med den föregående förutom att skicka, efter informationen som uttryckligen anges av parametern "data", en vagnretur (kod 13 som kan representeras som \r) och en radslut (kod 10, som kan vara representeras av \n) Dessa koder refereras ofta till med respektive akronym CR (Carriage Return) och LF (linjematning)

De tre föregående funktionerna returnerar antalet byte som har skickats, liksom motsvarande funktioner i klassen Serial; Som sagt ovan är operationen jämförbar.

5. Ta emot data

Liksom i fallet med datasändningsoperationer är mottagningsoperationerna jämförbara med dem som används i stor utsträckning Serial. Mottagningsprotokollet är också liknande: kontrollera om det finns (tillräckligt med) data tillgänglig (tillgänglig) och i så fall läs dem


  • tillgängligt ()

    Returnerar antalet byte som är tillgängliga att läsa. Denna funktion finns i båda klasserna Klient som server; I det första fallet rapporterar den antalet byte som servern har skickat som svar på en begäran och som är tillgängliga för klienten att läsa (läsa), och i det andra fallet klienten (objektet) som har utfört en operation eller falsk om det inte finns någon.

  • läsa()

    Den används för att läsa informationen som har mottagits. Den här funktionen är endast tillgänglig i klassen Klient. Om applikationen som utvecklas uppfyller rollen som server måste ett klientobjekt instansieras med funktionssvaret för att kunna läsa den information som har kommit tillgängligt () diskuterades i föregående avsnitt.

Följande exempel är en "caps-server" som lyssnar på port 2000 och svarar på förfrågningar med allt som skickats i alla storlekar när det är möjligt. Den kan testas till exempel med PuTTY eller helt enkelt med telnet 2000 Det är verkligen inte särskilt praktiskt, dess syfte är bara att visa hur man skaffar data som skickas till den av en klient från servern.

6. Avsluta anslutningen

Även om det är vanligt att en serverapplikation körs på obestämd tid, upprättas klientanslutningar, upprättar anslutningar och avslutas, vilket gör att resurser kan återställas och användas i andra anslutningar eller dedikeras till annan användning av programmet. Funktionen sluta() av klassen Klient Den används för att avsluta en klientanslutning och frigöra alla resurser som den använder.

För servern gör det faktum att klienten avslutar anslutningen när informationsobjektet för frågan har skickats eller tagits emot också att den frigör resurser för att allokera dem till andra anslutningar eller andra ändamål. Kort sagt, även om det verkar mindre, är det lämpligt att avsluta anslutningen när klientens verksamhet avslutas.

En annan bra praxis när du avslutar en klientanslutning är att tömma som klassen använder. För att göra detta är funktionen tillgänglig spola() ska anropas efter avslutad klientförbindelse med sluta()

Exempel på HTTP GET-fråga

För att bättre förtydliga allt ovan finns ett mer komplett exempel på förfrågningar nedan. TCP använda GET-förfrågningar med hjälp av HTTP-protokoll. I exemplet skickas värdena som erhålls av analoga sensorer anslutna till ett Arduino-kort till en webbserver som lagrar dem i en databas.

Post kommentar

Du kanske har missat