Ethernet TCP kapcsolat Arduino-val

Ethernet TCP kapcsolat Arduino-val

Ethernet TCP kapcsolat Arduino-val

Szoftveres szempontból kapcsolat létesítése Ethernet a Arduino Ez nagyon egyszerű. Ehhez használja a Ethernet könyvtár. Ezt a könyvtárat a Ethernet pajzs amely az integrált W5100, de vannak más különböző táblák vagy modulok és/vagy amelyek más integrált kártyákat használnak, mint pl ENC28J60. A használat egyszerűsítése és a kompatibilitás növelése érdekében más könyvtárak (majdnem) ugyanezt használják API hogy Ethernet könyvtár, akkor csak az alternatív könyvtárat kell helyettesítenie az eredetivel, vagy felvenni (ha más a név) a helyére, még akkor is, ha a kódban ugyanazok (vagy nagyon hasonló) függvények szerepelnek. Az én esetemben a UIPEthernet könyvtár de Truchsess Norbert ugyanazt a folyamatot követve, amelyet ebben a szövegben leírok.

ENC28J60 modul az UIPEthernet könyvtárral való használatra

1. Határozza meg az Ethernet kapcsolatot

Függetlenül attól, hogy felvállalja-e a szerepét vásárló mint az egyik szerver, először meg kell határozni a kapcsolatot a függvénnyel kezdődik () amely paraméterként csak az adható át MAC cím és várj egy szerverre DHCP a hálózaton rendelje hozzá a IP-cím és a konfiguráció többi része, vagy lehetőség van (opcionális) további paraméterek feltüntetésére is, amíg a teljes konfigurációt meg nem határozzák:

  1. Dirección MAC (amiről már volt szó)
  2. IP-cím a pajzs vagy a modul
  3. Szerver IP címe DNS (csak egy szerver)
  4. IP címe Gateway
  5. Hálómaszk

Célszerű az összes paramétert feltüntetni, hacsak nem a szokásos a levonásuk, nehogy a konfiguráció hibás legyen (például ne az átjáró a hálózat első címe).

A fentiekből úgy tűnik, hogy az IP-címeket reprezentáló adatokat elég gyakran kell használni, ezért a könyvtár tartalmazza az osztályt. IP-cím ahonnan az IP-cím objektumokat példányosítani kell. Az ezt meghatározó paraméterek egy cím négy bájtja IPV4

La MAC cím Ehhez a könyvtárhoz egy 6 bájtos tömbként van definiálva. A MAC cím egy egyedi azonosító, amelyben az első bájtok a gyártót és a modellt, az utolsó bájtok pedig az adott eszközt jelzik. Az integrált ENC28J60 nem tartalmaz MAC-címet, kivéve, ha úgy dönt, hogy megvásárolja a Integrált MAC cím a Microchiptől (vagy egy egész blokkot IGEN címek közül IEEE ha az eszközök futása elég nagy ahhoz, hogy megérje). Ha nincs MAC-címe, kitalálhat egyet, ügyelve arra, hogy ne ütközzen másokkal azon a hálózaton, ahol az eszköz található.

Ha a konfiguráció DHCP szerverrel történik a "kézzel" helyett, akkor a funkció localIP() Hasznos megnézni azt a címet, amelyet a szerver rendelt a modulhoz. A hozzárendelt cím megújításához (ha a megfelelő idő lejárt) a Ethernet könyvtár biztosítja a funkciót fenntartani () amely a megújítás állapotának megfelelő kód visszaküldésével is tájékoztatja:

  1. A műveletnek nem volt hatása
  2. Hiba történt az IP-cím megújításakor
    A hozzárendelt IP-cím használata ugyanazon a szerveren nem bővíthető
  3. IP-cím sikeresen megújítva
  4. Az IP-cím újrakötése nem sikerült
    A hozzárendelt IP-cím használatát egyetlen szerveren sem lehetett kiterjeszteni
  5. Az IP-cím újbóli hozzárendelése sikeresen megtörtént

Az eddig látott információk alapján írhat egy példát arra, hogy az IP-cím DHCP-kiszolgálón keresztül történő konfigurálásával Ethernet-kapcsolat kezdeményezhető. A következő példakód megpróbálja megújítani az IP-címet bizonyos időközönként, és jelentést készít az eredményről.

Az alábbi példa az IP-címet és a konfiguráció többi részét manuálisan, objektumok segítségével rendeli hozzá IP-cím hogy kényelmesebb legyen az olvasás, és (összetettebb kód esetén) elkerüljük azokat a hibákat, amelyek akkor fordulhatnak elő, ha a címet minden egyes használatkor (rossz)írják.

2. Indítsa el a kapcsolatot kliens vagy szerver módban

Amikor szerver módban kezdeményezünk kapcsolatot, akkor a fejlesztés alatt álló mikrokontrollált rendszer figyeli meg a többi rendszertől érkező kéréseket. A kapcsolat kiszolgálóként történő indításához használja a EthernetServer() és paraméterként van megadva a port, amelyen a szerver figyelni fog. EthernetServer() az osztály konstruktora szerver, amely szerverként támogatja az összes Ethernet-műveletet. Bár a legortodoxabb az, hogy felhívjuk a kivitelezőt EthernetServer(), nem ritka néhány olyan példa, amely közvetlenül használja az osztályt szerver vagy alternatív könyvtárak Ethernet-kapcsolathoz, amelyek az adott példányosítási rendszert választják.

A kapcsolat kliensként az, amely kéréseket küld a szerver rendszernek, amely megvárja és megfelelően válaszol rájuk. Ha kliensként szeretne kapcsolatot kezdeményezni, használja a EthernetClient() mi az osztály konstruktora Vásárló minden Ethernet-művelet eredetét kliensként.

Ellentétben azzal, ami a szerver móddal történik, amelyről azt feltételezik, hogy az osztály példányosításának pillanatától működik (bár csak akkor válaszol az ügyfeleknek, ha valóban így van), használat előtt ellenőriznie kell, hogy az ügyfélkapcsolat készen áll-e. A kapcsolat indításakor létrehozott ügyfélobjektum lekérdezhető, hogy elérhető-e. Például lekérdezési műveletek beépíthetők egy struktúrába if(EthernetClient) hogy csak akkor hajtsák végre őket, ha elérhető az ügyfélkapcsolat.

3. Hozzon létre kapcsolatot ügyfélként

Ahogy már elhangzott, a kapcsolat létrehozása után az ügyfél kezdeményezi a lekérdezéseket. A szerver várni fogja a kezdeményezést, és ennek megfelelően válaszol. Ezért a kliens csatlakozik a szerverhez, ezt használjuk connect () paraméterként megadva a szervert (az IP-címet vagy a URL) és a port abban, aki hallgat.

A művelet eredménye alapján a függvény visszaadja az értékeket

  1. (SIKER) A kapcsolat sikeresen létrejött
  2. A kapcsolat létrehozása
  3. (IDŐTÚLLÉPÉS) Az időkorlát letelt a kapcsolat létrehozása nélkül
  4. (INVALID_SERVER) A szerver nem található, vagy nem válaszol megfelelően
  5. (MEGCSONKÍTOTT) A kapcsolat megszakadt, mielőtt teljesen létrejött volna
  6. (INVALID_RESPONSE) A szerver válasza helytelen

A lekérdezések megkezdése előtt ellenőrizni kell, hogy a kapcsolat működik-e a funkcióval csatlakoztatva() hogy vissza fog térni igaz ha már elérhető ill hamis másképp.

Az alábbi példa a kapcsolatot szemlélteti kliensként, 10 másodpercenként ellenőrzi, hogy van-e kapcsolat a szerverrel (egyáltalán nem célja, hogy produktív legyen, csak a függvények szintaxisát mutassa), ami egyébként egy termelési webszervernek nem nagyon tetszene.

4. Adatok küldése

Mint más ismertebb osztályok, mint pl Sorozatszám, és hasonló használat mellett az osztályok Vásárló y szerver rendelkeznek a funkciókkal

  • ír(tény) o ír(puffer, hossz)

    Információkat küld annak a kliens- vagy szerverobjektumnak a használatával, amelyből meghívásra került. Az "adat" paraméter egyetlen byte o faszén míg a "puffer" egy tömb byte o faszén amelyből a „hosszúsággal” megegyező összeg kerül elküldésre. Ez a funkció a bináris műveletekhez használatos, összehasonlítva a következő kettővel, amelyeket általában szövegküldésre tartanak fenn.

  • nyomtatás(adatbázis)

    Kliensként vagy szerverként (attól függően, hogy melyik osztályból használják) elküldi az "adatoknak" megfelelő információkat szövegként. Ha az információ nem szövegként van kifejezve (például egész szám), akkor az opcionális "base" paraméterrel választhatjuk ki a konverziót, amely lehet a BIN, OCT, DEC vagy HEX konstansok egyike, amelyek rendre jelzik. bázisok, amelyek megfelelnek a binárisnak (2. bázis), az oktálisnak (8. bázis), a decimálisnak (10. bázis) és a hexadecimálisnak (16. bázis)

  • println(adatbázis)

    A művelet megegyezik az előzővel, kivéve, hogy a "data" paraméterrel kifejezetten jelzett információ után egy kocsivisszaküldést (13-as kód, amely \r-ként ábrázolható) és egy sorvéget (10-es kód, amely lehet \n) Ezekre a kódokra gyakran utalunk a betűszóval CR (Carriage Return) és LF (soremelés)

Az előző három függvény az elküldött bájtok számát adja vissza, csakúgy, mint az osztály ekvivalens függvényei Sorozatszám; Mint fentebb említettük, a művelet összehasonlítható.

5. Adatok fogadása

Az adatküldési műveletekhez hasonlóan a fogadási műveletek is hasonlóak a széles körben használt műveletekhez Sorozatszám. A fogadási protokoll is hasonló: ellenőrizze, hogy van-e (elég) elérhető adat (elérhető), és ebben az esetben olvassa el őket


  • elérhető ()

    Az olvasható bájtok számát adja vissza. Ez a függvény mindkét osztályban megtalálható Vásárló mint szerver; Az első esetben azt jelenti, hogy a szerver hány bájtot küldött válaszul egy kérésre, és amely a kliens számára elérhető (olvas), a második esetben pedig a műveletet végrehajtó kliens (objektum), vagy false, ha nincs.

  • olvas()

    A kapott információk olvasására szolgál. Ez a funkció csak az osztályban érhető el Vásárló. Ha a fejlesztés alatt álló alkalmazás a szerver szerepét tölti be, akkor a beérkezett információk olvasásához egy kliens objektumot kell példányosítani a függvényválaszsal. elérhető () az előző részben tárgyaltuk.

A következő példa egy "nagybetűs kiszolgáló", amely a 2000-es porton figyel, és a kérésekre lehetőség szerint csupa nagybetűvel válaszol. Kipróbálható pl PuTTY vagy egyszerűen azzal telnet 2000 Természetesen nem túl praktikus, csak az a célja, hogy megmutassa, hogyan lehet a szerverről megszerezni a kliens által neki küldött adatokat.

6. Fejezze be a kapcsolatot

Noha a kiszolgálóalkalmazások általában határozatlan ideig futnak, az ügyfélkapcsolatok létrejönnek, létrejönnek és megszakadnak, lehetővé téve az erőforrások helyreállítását és más kapcsolatokban való felhasználását, vagy a program más felhasználási céljára történő felhasználását. A funkció álljon meg () osztályának Vásárló Az ügyfélkapcsolat megszakítására és az általa használt erőforrások felszabadítására szolgál.

A szerver számára az a tény, hogy a kliens megszakítja a kapcsolatot, amikor a lekérdezés információs objektuma elküldésre vagy fogadásra került, egyúttal lehetővé teszi számára, hogy erőforrásokat szabadítson fel, hogy azokat más kapcsolatokhoz vagy más célokhoz rendelje hozzá. Röviden, bár csekélynek tűnik, tanácsos megszakítani a kapcsolatot, amikor az ügyfél műveletei befejeződnek.

Egy másik jó gyakorlat az ügyfélkapcsolat megszakításakor az, hogy ürítse ki a amit az osztály használ. Ehhez a funkció elérhető flush() Az ügyfélkapcsolat megszakítása után kell meghívni álljon meg ()

HTTP GET lekérdezési példa

A fentiek jobb tisztázása érdekében az alábbiakban egy teljesebb példát találunk a kérésekre. TCP a GET kérések segítségével a HTTP protokoll. A példában az Arduino kártyához csatlakoztatott analóg érzékelők által kapott értékek egy webszerverre kerülnek, amely adatbázisban tárolja azokat.

Hozzászólás Comment

Lehet, hogy lemaradtál