2021. november 29., hétfő, 06:00
Címkék: Arduino Ethernet hálózat hálózatkezelés IIOT Internet of Things
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 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, RS232 alapú rendszereket és származékaikat. Így a huszonegyedik század elején már elindult az úgynevezett 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 Wi-Fi, 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 úgynevezett 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 csipjein 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.
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), hogy 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.
OKY2102 (fent) és DFR0125 (lent) 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 négy (a W5100 csip és RAM <= 2 kB esetén) vagy nyolc (W5200 és W5500 rendszer) párhuzamos kimenő/bejövő kapcsolatot támogat. A könyvtár szoftveres felületét öt 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. Az osztályok teljes leírása a megfelelő módszerekkel a következő címen érhető el: https://www.arduino.cc/en/Reference/Ethernet
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 protokoll kliensrő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 adatokat cserélnek a mikrovezérlővel ennek a protokollnak a segítségével) és az Ethernet könyvtár fejlécfájljait:
#include <SPI.h>#include <Ethernet.h>
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.
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.
OKY3486 (fent) és ETH CLICK (lent) 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 csipek 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 <EtherCard.h>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 cikk forrása: