A kiterjedt számítógépes hálózatok létrehozása évekig csupán a számítógépek összekapcsolására szolgált. Az árcsökkenés és a kis mikrovezérlők számítási teljesítményének növekedése azonban megkezdte az alacsony fogyasztású, főként vezérlési és mérési funkciókat ellátó eszközök helyi Ethernet-hálózatokhoz vagy akár a globális internetes hálózathoz történő csatlakoztatásának gyors folyamatát. Sőt, ezek a megoldások a professzionális ipari hálózatokban is kezdtek megjelenni, fokozatosan felváltva a régebbi, RS–232-alapú rendszereket és származékaikat. Így a 21. század elején már elindult az ún. Tárgyak Internetének (IoT) korszaka. Bár a jelenlegi IoT-piacot elsősorban a vezeték nélküli hálózatokon és a WiFi, ZigBee, BLE vagy Z-Wave szabványokon keresztül kommunikáló eszközök dominálják, még mindig sok hardveres megoldásnál (főleg az ún. IIoT – Ipari Tárgyak Internete, amely megbízható átvitelt és adatbiztonságot igényel) az Ethernet-hálózat továbbra is az egyik legnépszerűbb megoldás. Az Arduino platform készítői nem hagyták megválaszolatlanul az IIoT eszközök tervezőinek igényét, és kibővítették az Arduino modulok szabványos választékát az egyéni felhasználóknak címzett Ethernet Shield 2-vel, vagy a professzionális megoldásokhoz szükséges Arduino MKR ETH SHIELD-del, a WIZnet vezérlőkön W5100/W5200/W5500 és integrált MAC and PHY áramkörök integrálásán alapuló áramkörrel. Ezt az ajánlatot a független gyártók gyorsan kibővítették, és új és sokkal olcsóbb modulokat adtak hozzá a népszerű ENC28J60 alapján. Ez a cikk mindkét megoldás rövid leírását tartalmazza: a hivatalos, amely a W5x00-sorozat chipjein alapszik, és főleg a közösség által fejlesztett, nyílt forráskódú/nyílt hardveres megoldás, amelyek ENC28J60 modulokon alapulnak.
Kommunikáció WIZnet W5x00 modulok és az Arduino Ethernet-könyvtár segítségével
Fontos előnye a W5x00-sorozatú rendszereken alapuló hivatalos moduloknak (beleértve a hardver megfelelőiket is, például az OKYSTAR OKY2102 vagy DFROBOT DFR0125 overlay) teljes szoftveres támogatást nyújtanak az Arduino-verembe ágyazott Ethernet-könyvtár formájában. Így a felhasználó az Arduino IDE elindítása után megkezdheti a program létrehozását, anélkül, hogy további szoftvercsomagokat kellene telepítenie.
1. ábra. OKY2102 (bal) és DFR0125 (jobb) modulok, WIZnet W5100 vezérlővel felszerelve
A WIZnet-rendszer változatától és a rendelkezésre álló RAM mennyiségétől függően az Ethernet-könyvtár legfeljebb 4 (a W5100 chip és RAM <= 2 kB esetén) vagy 8 (W5200 és W5500 rendszer) párhuzamos kimenő/bejövő kapcsolatot támogat. A könyvtár szoftveres felületét 5 osztályra osztották, az egyes funkciókat csoportosítva. Az Ethernet-osztály felelős a könyvtár inicializálásáért és a hálózati beállítások konfigurálásáért (beleértve az IP-címet, az alhálózati címet vagy a hozzáférési átjáró beállításait). Létrehoztak egy IP-cím-osztályt az IP-címzéshez. Egy egyszerű szerveralkalmazás futtatásához az Arduino oldalon szükség lesz az EthernetServer-osztály használatára, amely lehetővé teszi az adatok rögzítését és olvasását az összes csatlakoztatott eszközről. Az EthernetClient a kiegészítő osztály, amely néhány egyszerű hívás során lehetővé teszi egy funkcionális hálózati kliens előkészítését, amely a szerverről hajt végre adatírási és -olvasási műveleteket. Az UDP-kommunikációhoz az Ethernet-könyvtár EthernetUDP-osztályt biztosít.
Amint az az Arduino platformra jellemző, a program összes összetett művelete közvetlenül a mellékelt könyvtárban valósul meg – a fejlesztő korlátozott, de nagyon funkcionális API-kat kap, így a fejlesztési folyamat gyors és nem szükséges a hálózati halmok részletes ismerete. Éppen ezért elemezzük az Ethernet-könyvtárral ellátott legegyszerűbb kiszolgálóalkalmazás felépítését, amelynek feladata a Telnet protokollkliensről érkező kapcsolatok meghallgatása. A szerveralkalmazás kódja megkezdi az SPI-kommunikáció létrehozásához szükséges fejlécfájlok hozzáadását (a WIZnet modulok ennek a protokollnak a segítségével adatokat cserélnek a mikrovezérlővel) és az Ethernet-könyvtár fejlécfájljait:
#include
#include
A következő lépés a hálózati paraméterek konfigurálása (a vezérlő MAC-címe, a hozzáférési átjáró IP-címe és az alhálózati maszk), és egy figyelőkiszolgáló létrehozása a 23. számú porton (a Telnet protokoll alapértelmezett portja):
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);
EthernetServer server(23);
A setup() függvény törzsében szükség van az Ethernet-könyvtár inicializálására és a hallgatási folyamat elindítására. Ezenkívül elérhető a soros port konfigurációja, amelynek köszönhetően a kiszolgáló címéről, az új ügyfélkapcsolatról és a létrehozott munkamenet során kapott adatokról üzeneteket lehet megjeleníteni:
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.begin(9600);
while (!Serial) {
}
Serial.print("Chat server address:");
Serial.println(Ethernet.localIP());
}
A loop() program fő ciklusa megvárja a kapcsolatot az ügyféltől, és ellenőrzi az olvasható adatokat. Adatok fogadásakor ezeket az adatokat változatlanul visszaküldi az ügyfélnek, így egyszerű visszhangfunkciót hajt végre:
void loop() {
EthernetClient client = server.available();
if (client) {
if (!alreadyConnected) {
client.flush();
Serial.println("We have a new client");
client.println("Hello, client!");
alreadyConnected = true;
}
if (client.available() > 0) {
char thisChar = client.read();
server.write(thisChar);
Serial.write(thisChar);
}
}
}
A fenti alkalmazás helyes működését bármely Telnet protokollkliens (pl. Putty in Windows vagy telnet parancs Linux alatt) vagy egy másik Arduino készlet és az EthernetClient osztály használatával tesztelhetjük.
Kommunikáció ENC28J60 modulok és külső könyvtárak használatával
Alternatív megoldásként a hivatalosan támogatott WIZnet W5x00-rendszerek helyett az ENC28J60 vezérlőn alapuló modulok (pl. OKYSTAR OKY3486 vagy ETH CLICK) használhatók. Alacsonyabb áron és manuálisan könnyebben telepíthető csomaggal (szemben a W5x00 80-pin LQFP csomagokban található áramkörökkel) az ENC28J60 vezérlő 28 pines SSOP, SOIC, QFN csomagokban érhető el, valamint a furatszerelt beépítésre szánt SPDIP csomagban ez az áramkör nagyon népszerű a hobbisták körében.
2. ábra. OKY3486 (bal) és ETH CLICK (jobb) modulok ENC28J60 vezérlővel felszerelve
Az Arduino hivatalos támogatásának hiánya ellenére sok, nyílt forráskódú könyvtárat bocsátottak a programozók rendelkezésére, biztosítva az ENC28J60 chipek gyors integrálását a szoftverrel. Különös figyelmet kell fordítani az UIPEthernet- és az EtherCard-könyvtárakra, az utóbbi a GPLv2 licenc alatt áll rendelkezésre. Az előbbi kétségtelen előnye az API interfész kompatibilitása a hivatalos Arduino Ethernet-könyvtárral, amelynek köszönhetően az alkalmazásfejlesztési folyamat független lehet a hardverben a W5x00-rendszerek és az ENC28J60-rendszerek közötti választástól. A másik projekt – EtherCard – egy független programozási felületet valósít meg, amely a programozó preferenciáitól függően érdekes alternatívának bizonyulhat, csakúgy, mint az Arduino Ethernet-könyvtár esetében, a meglehetősen összetett funkcionalitás (például a DHCP kliens megvalósítása) csupán néhány kódsorban megvalósítható:
#include
static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte Ethernet::buffer[700];
void setup () {
Serial.begin(57600);
Serial.println(F("
[testDHCP]"));
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println(F("Failed to access Ethernet controller"));
Serial.println(F("Setting up DHCP"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.netmask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {
ether.packetLoop(ether.packetReceive());
}
A szöveget a Transfer Multisort Elektronik Sp. z o.o. készítette