Lektorált tananyag, ami a BKF Digitális és Kollaboratív Művészet (DIKOM) pályázatnak keretén belül valósult meg.
Szerző: Harsányi Réka, Társszerző: Juhász Márton András, Lektor: Fernezelyi Márton
Az OSI (Open Systems Interconnection) modell szerint – mely hét absztrakt rétegre osztja a kommunikációs technológiák funkcionális szintjeit – az Ethernet 1985 óta a számítógépeket összekötő hálózatok fő kommunikációs technológiai szabványa és fizikai rétegtől az adatkapcsolati rétegig nyújt szolgáltatásokat. A fizikai réteg magát a hardware-t jelenti, az adatok bitenkénti csatornákra juttatását. Az adatátviteli réteg pedig két hálózati elem közötti átvitelt biztosító eljárásokért felelős.
Open Systems Interconnection modell
Az Ethernet kiegészítő modullal (shield) és a hozzá tartozó könyvtár segítségével eljuthatunk a hálózati rétegig és internetképessé tehetjük az Arduinot. A shield a Wiznet, SPI kommunikáción alapuló W5100-as integrált áramkörére épül és fenntartja az SD kártya csatlakoztatásának lehetőségét is. A kiegészítőt elég csatlakoztatni. A következő példákban megnézzük, hogyan lehet bejövő kapcsolatokat kezelő szerverként és kimenőket intéző kliensként egyaránt működtetni.
Arduino Ethernet Shielddel
Csatornák kiosztása az Eethernet Shield-hez
Ethernet osztály
Ethernet.begin()
Az ethernet könyvtárat és a hálózati beállításokat inicializálja a parancs. A begin() függvénnyel megadhatjuk az eszközünk MAC (Media Access Control – fizikai) és az IP (Internet Protocol) címét. A könyvtár támogatja a DHCP (Dynamic Host Configuration Protocol) alapú IP-cím igénylést, ezért ha csak a fizikai címet adjuk meg, ebbe az üzemmódba kerül. Az automatikus címigényléshez a könyvtár nagyobb hányada töltődik az Arduinoba, ezért ez a mód sokkal több memóriát igényel, mintha csak statikus címet adnánk meg. Ethernet.begin(mac) sikeres cím igénylés esetén 1-et, sikertelen esetén 0-át ad vissza.
Szintaxisa:
Ethernet.begin(mac),
Ethernet.begin(mac, ip),
Ethernet.begin(mac, ip, dns),
Ethernet.begin(mac, ip, dns, gateway),
Ethernet.begin(mac, ip, dns, gateway, subnet).
Paraméterei:
mac: 6 bájtos tömb, az eszköz fizikai címe,
ip: 4 bájtos tömb, az eszköz IP-címe,
dns: 4 bájtos tömb, DNS (Domain Name Server) IP-címe,
gateway: 4 bájtos tömb, hálózati átjáró címe,
subnet: 4 bájtos tömb, a hálózat alhálózati maszkja, alapállapotban 255.255.255.0.
Ethernet.localIP()
Visszaadja az eszköz aktuális IP-címét. Ez akkor hasznos, ha automatikusan igényeltük.
Ethernet.maintain()
DHCP használata esetén egy meghatározott időre kap az eszköz IP-címet. Amikor ez lejár, meg kell újítani. Ezzel a függvénnyel a lejárt cím helyett újat igényelhetünk, ami a DHCP szervertől függően lehet ugyanaz, egy teljesen más, vagy semmi is. Egy számot ad vissza, ami ha:
0: nem történt semmi,
1: cím megújítása sikertelen,
2: cím megújítása sikeres,
3: újrakapcsolódás sikertelen,
4: újrakapcsolódás sikeres.
IPAddress osztály
IPAddress()
Meghatározza az IP-címet, ami lehet helyi és távoli cím is.
Szintaxisa:
IPAddress(address)
Paramétere:
address: vesszőkkel elválasztott 4 bájt (pl.: 192,168,1,1).
Arduino kód: 64IPaddress
Arduino kód: 65localIP
Server osztály
EthernetServer()
Létrehoz egy szervert, ami a bejövő kapcsolatokat figyeli egy előre meghatározott porton.
Szintaxisa:
Server(port).
Paramétere:
port: a port száma, amit a szerver figyel.
Példakód:
EthernetServer server = EthernetServer(23);
server.begin()
Szól a szervernek, hogy kezdjen figyelni.
server.available()
Visszaadja egy csatlakozott kliens címét, ha rendelkezésre állnak olvasható adatok.
Példakód:
EthernetClient client = server.available();
server.write()
Adatokat küld a szerverhez kapcsolódott klienseknek. Az adat bájt vagy karakter típusú lehet.
server.print()
ASCII kódolású adatokat küld a szerverhez kapcsolódott klienseknek. A server.println() az adatot kiegészíti a soremelés kódjával.
Szintaxisa:
server.print(data),
server.println(data, BASE).
Paraméterei:
data: char, byte, int, long, string, amit a szervernek ki kell küldenie,
BASE: a számrendszer alapja BIN, HEX, OCT, DEC.
Arduino kód: 66server
Client osztály
EthernetClient()
Létrehoz egy klienst, ami egy IP-címen meghatározott porthoz képes csatlakozni.
If(ethernetClient)
Megvizsgálja, hogy a kliens készen áll-e. Bool típusú változóban adja vissza a választ.
client.connected()
Megvizsgálja, hogy a kliens kapcsolatban van-e. Amíg van olvasatlan adat, addig igen.
client.connect()
A meghatározott címre és portra kapcsolja a klienst, ha sikerült, IGAZ választ ad vissza.
client.write()
Adatot küld a szervernek, amelyikhez a kliens kapcsolódott.
client.print() és client.println()
ASCII kódolású adatokat küld a szervernek.
client.available()
Visszaadja a szerver által küldött, olvasásra kész bájtok számát.
client.read()
Beolvassa a szerver által küldött utolsó bájtot.
client.flush()
Kiüríti az átmeneti tárolót, minden olvasatlan bájtot töröl.
client.stop()
Megszakítja a kapcsolatot a szerverrel.
Arduino kód: 67client
EthernetUDP osztály
Az UDP (User Datagram Protocoll) az internetet alkotó protokollok egyike, amivel számítógép-alkalmazások cserélnek úgynevezett datagrammokat egymás között. Leginkább olyan esetekben érdemes használni, amikor nem fontos a hibaellenőrzés és -javítás a csomagok átvitelekor. Ez általában valós idejű adatátviteli rendszereknél fontos, ahol egy csomag elvesztése kisebb probléma, mint az ellenőrzésekből fakadó késés.
UDP.begin()
Inicializálja az UDP könyvtárat és hálózati beállításait.
Szintaxisa:
EthernetUDP.begin(localPort);
Paraméterei:
localPort: helyi port száma
UDP.read()
Datagrammot olvas egy meghatározott tárolóból. Argumentumok nélkül a soron következő karaktert adja vissza.
Szintaxisa:
UDP.read(packetBuffer, MaxSize).
Paraméterei:
packetBuffer: az átmeneti tároló, ami a bejövő karaktereket tárolja,
MaxSize: az átmeneti tároló maximális mérete.
UDP.write()
Datagrammot ír egy távoli kapcsolatnak. beginPacket() és endPacket() között kell használni. Az elküldött karakterek számát adja vissza.
Szintaxisa:
UDP.write(message);
Paraméterei:
message: kimenő üzenet (char adattípus)
UDP.beginPacket()
Inicializálja a datagramm elküldését. A küldendő adatokat a write()-tal határozzuk meg.
Szintaxisa:
UDP.beginPacket(remoteIP, remotePort);
Paraméterei:
remoteIP: a távoli kapcsolat IP címe (4 byte)
remotePort: a távoli kapcsolat port száma (int)
UDP.endPacket()
Jóváhagyja a datagramm továbbítását.
Szintaxisa:
UDP.endPacket();
Paraméterei:
nincs
UDP.parsePacket()
Megvizsgálja, van-e elérhető datagramm, és ha van, visszaadja a méretét. Read() előtt kell használni.
Szintaxisa:
UDP.parsePacket();
Paraméterei:
nincs
UDP.available()
Az átmeneti tárolóba már megérkezett bájtok (karakterek) számát adja vissza. A parsePacket() után érdemes használni.
Szintaxisa:
UDP.available();
Paraméterei:
nincs
UDP.remoteIP()
Visszaadja a távoli kapcsolat IP-címét. A parsePacket() után kell használni.
Szintaxisa:
UDP.remoteIP();
Paraméterei:
nincs
UDP.remotePort()
Visszaadja a távoli kapcsolat portjának számát. A parsePacket() után kell használni.
Szintaxisa:
UDP.remotePort();
Paraméterei:
nincs
Arduino kód: 68UDP
- - - - - - - - - -
forrás: http://arduino.cc/en/Tutorial/HomePage, http://arduino.cc/en/reference/ethernet