Ethernet TCP ryšys su Arduino

Ethernet TCP ryšys su Arduino

Ethernet TCP ryšys su Arduino

Programinės įrangos požiūriu, ryšio užmezgimas "Ethernet" su Arduino Tai labai paprasta. Norėdami tai padaryti, naudokite Ethernet biblioteka. Ši biblioteka skirta a Ethernet skydas kuri remiasi integruotu W5100, tačiau yra ir kitų skirtingų plokščių ar modulių ir (arba) naudojančių kitas integruotas, pvz., ENC28J60. Siekdamos supaprastinti jo naudojimą ir padidinti suderinamumą, kitos bibliotekos naudoja (beveik) tą patį API kad Ethernet biblioteka, turėsite tik pakeisti alternatyvią biblioteką originalia arba įtraukti ją (kai pavadinimas skiriasi) į vietą, net jei kode naudojamos tos pačios (arba labai panašios) funkcijos. Mano atveju aš naudoju UIPEthernet biblioteka de Norbertas Truchsessas vadovaudamasis tuo pačiu procesu, kurį aprašysiu šiame tekste.

ENC28J60 modulis, skirtas naudoti su UIPEthernet biblioteka

1. Apibrėžkite Ethernet ryšį

Nesvarbu, ar ketinate prisiimti vaidmenį klientas toks kaip serverio, pirmiausia turite apibrėžti ryšį su funkcija pradėti () kuris gali būti perduodamas kaip parametras tik MAC adresas ir laukti serverio DHCP tinkle priskirkite a IP adresas ir likusią konfigūraciją arba taip pat galima nurodyti (pasirinktinai) daugiau parametrų, kol bus apibrėžta visa konfigūracija:

  1. Dirección MAC (kas jau buvo minėta)
  2. IP adresas skydo arba modulio
  3. Serverio IP adresas DNS (tik vienas serveris)
  4. IP adresas Vartai
  5. Tinklinė kaukė

Patartina nurodyti visus parametrus, nebent jų išskaičiavimas yra įprastas, kad būtų išvengta neteisingos konfigūracijos (pvz., vartai nėra pirmasis tinklo adresas).

Iš to, kas išdėstyta aukščiau, atrodo aišku, kad duomenys, vaizduojantys IP adresus, turi būti naudojami gana dažnai, todėl bibliotekoje yra klasė IP adresas iš kurių imami IP adresų objektai. Jį apibrėžiantys parametrai yra keturi adreso baitai IPV4

La MAC adresas Šiai bibliotekai jis apibrėžiamas kaip 6 baitų masyvas. MAC adresas yra (turėtų būti) unikalus identifikatorius, kurio pirmieji baitai nurodo gamintoją ir modelį, o paskutiniai – konkretų įrenginį. Integruotas ENC28J60 neapima MAC adreso, nebent taip pat nuspręsite įsigyti a Integruotas MAC adresas iš Microchip (arba visą bloką OUI adresų IEEE jei įrenginių skaičius yra pakankamai didelis, kad būtų verta). Kai neturite MAC adreso, galite jį sugalvoti, pasirūpindami, kad jis neprieštarautų kitiems tinkle, kuriame yra įrenginys.

Jei konfigūracija atliekama naudojant DHCP serverį, o ne „ranka“, funkcija vietinis IP () Naudinga pasidomėti adresu, kurį serveris priskyrė moduliui. Norėdami atnaujinti priskirtą adresą (jei pasibaigė atitinkamas laikas) Ethernet biblioteka suteikia funkciją išlaikyti () kuri taip pat informuos grąžindama kodą, atitinkantį atnaujinimo būseną:

  1. Operacija neturėjo jokio poveikio
  2. Klaida atnaujinant IP adresą
    Nepavyko pratęsti priskirto IP adreso naudojimo tame pačiame serveryje
  3. IP adresas sėkmingai atnaujintas
  4. IP adreso perrišimas nepavyko
    Priskirto IP adreso naudojimo nepavyko pratęsti jokiame serveryje
  5. IP adresas sėkmingai perskirtas

Turėdami iki šiol matytą informaciją, galite parašyti pavyzdį, kaip būtų inicijuojamas Ethernet ryšys sukonfigūravus IP adresą per DHCP serverį tinkle. Šis pavyzdinis kodas bando atnaujinti IP adresą kas tam tikrą laikotarpį ir praneša apie rezultatą.

Toliau pateiktame pavyzdyje IP adresas ir likusi konfigūracija priskiriama rankiniu būdu naudojant objektus IP adresas kad būtų patogiau skaityti ir (jeigu kodas sudėtingesnis) išvengtumėte klaidų, kurios galėtų atsirasti, jei adresas būtų (ne)parašytas kiekvieną kartą jį naudojant.

2. Pradėkite ryšį kliento arba serverio režimu

Inicijuojant ryšį serverio režimu, būtent kuriama mikrovaldoma sistema išklauso kitų sistemų užklausas. Norėdami pradėti ryšį kaip serveris, naudokite eterneto serveris () o prievadas, kuriuo serveris klausys, nurodomas kaip parametras. eterneto serveris () yra klasės konstruktorius serverio, kuris palaiko visas Ethernet operacijas kaip serveris. Nors ortodoksiausia – paskambinti konstruktoriui eterneto serveris (), neretai galima rasti pavyzdžių, kurie tiesiogiai naudoja klasę serverio arba alternatyvias bibliotekas Ethernet ryšiui, kurios pasirenka naudoti tą egzempliorių sistemą.

Ryšys kaip klientas yra tas, kuris pateikia užklausas serverio sistemai, kuri jų laukia ir atitinkamai atsako. Norėdami užmegzti ryšį kaip klientas, naudokite EthernetClient() kas yra klasės konstruktorius klientas visų Ethernet operacijų kaip kliento kilmė.

Skirtingai nuo serverio režimo, kuris, kaip manoma, veikia nuo klasės egzistavimo momento (nors jis reaguos į klientus tik tuo atveju, jei taip yra), prieš naudodami turite patikrinti, ar kliento ryšys yra paruoštas. Kliento objektas, sukurtas inicijuojant ryšį, gali būti užklaustas, ar jis pasiekiamas. Pavyzdžiui, užklausos operacijos gali būti įtrauktos į struktūrą if (EthernetClient) juos vykdyti tik tada, kai yra pasiekiamas kliento ryšys.

3. Užmegzkite ryšį kaip klientą

Kaip jau minėta, užmezgus ryšį klientas imasi iniciatyvos pateikti užklausas. Serveris lauks tos iniciatyvos ir atitinkamai atsakys. Todėl prie serverio prisijungia klientas, kurį naudojame tam Prisijungti() nurodant serverį kaip parametrus (IP adresą arba URL adresas) ir uostas tame, kuris klauso.

Remdamasi operacijos rezultatu, funkcija grąžins reikšmes

  1. (SĖKMĖ) Ryšys sėkmingai užmegztas
  2. Ryšio užmezgimas
  3. (LAIKAS BAIGĖSI) Praėjo laikas, kai ryšys neužmezgamas
  4. (INVALID_SERVER) Serveris nerastas arba netinkamai reaguoja
  5. (SUTRAUKTA) Ryšys buvo nutrauktas prieš visiškai užmezgant
  6. (INVALID_RESPONSE) Serverio atsakymas neteisingas

Prieš pradedant teikti užklausas, būtina patikrinti, ar ryšys veikia su funkcija prijungtas () kad grįš tiesa jei jau yra arba klaidingas kitaip.

Toliau pateiktame pavyzdyje iliustruojamas ryšys kaip klientas, kas 10 sekundžių tikrinantis, ar yra ryšys su serveriu (jis nėra skirtas kaip produktyvus, tik norint parodyti funkcijų sintaksę) kažkas, beje, gamybiniam interneto serveriui labai nepatiktų.

4. Siųsti duomenis

Kaip ir kitos geriau žinomos klasės, pvz Serijinis, o su panašiu naudojimu – klasės klientas y serverio turi funkcijas

  • rašyti(faktas) o rašyti(buferis, ilgis)

    Siunčia informaciją naudodamas kliento arba serverio objektą, iš kurio ji iškviečiama. Parametras „duomenys“ yra vienas baitas o bakas o „buferis“ yra masyvas baitas o bakas iš kurių siunčiama suma, lygi "ilgiui". Ši funkcija naudojama dvejetainėms operacijoms, palyginti su kitomis dviem, kurios paprastai yra skirtos tekstui siųsti.

  • spausdinti(duomenys, bazė)

    Siunčia kaip klientas arba serveris (priklausomai nuo klasės, iš kurios jis naudojamas) informaciją, atitinkančią „duomenis“ kaip tekstą. Jei informacija neišreiškiama tekstu (pavyzdžiui, tai yra sveikasis skaičius), pasirenkamas parametras "base" gali būti naudojamas konvertavimui pasirinkti, kuris gali būti viena iš konstantų BIN, OCT, DEC arba HEX, kurios atitinkamai nurodo. bazės, atitinkančios dvejetainę (2 bazė), aštuntainę (8 bazė), dešimtainę (10 bazė) ir šešioliktainę (16 bazė)

  • println(duomenys, bazė)

    Operacija yra identiška ankstesnei, išskyrus tai, kad po „duomenų“ parametru aiškiai nurodytos informacijos siunčiamas vežimo grįžimas (kodas 13, kuris gali būti vaizduojamas kaip \r) ir eilutės pabaiga (kodas 10, kuri gali būti žymimas \n) Šie kodai dažnai vadinami atitinkamai akronimu CR (Carriage Return) ir LF (Line Feed)

Trys ankstesnės funkcijos grąžina išsiųstų baitų skaičių, kaip ir lygiavertės klasės funkcijos Serijinis; Kaip minėta aukščiau, operacija yra panaši.

5. Gauti duomenis

Kaip ir duomenų siuntimo operacijų atveju, gavimo operacijas galima palyginti su plačiai naudojamomis operacijomis Serijinis. Gavimo protokolas taip pat panašus: patikrinkite, ar yra (pakankamai) duomenų (prieinamas) ir tokiu atveju juos perskaitykite


  • galima ()

    Grąžina baitų, kuriuos galima nuskaityti, skaičių. Ši funkcija yra abiejose klasėse klientas kaip serverio; Pirmuoju atveju ji praneša baitų, kuriuos serveris išsiuntė atsakydamas į užklausą ir kurį klientas gali perskaityti, skaičių (skaityti), o antruoju atveju klientas (objektas), kuris atliko operaciją arba false, jei jos nėra.

  • skaityti ()

    Jis naudojamas gautai informacijai skaityti. Ši funkcija pasiekiama tik klasėje klientas. Jei kuriama programa atlieka serverio vaidmenį, norint nuskaityti gautą informaciją, kliento objektas turi būti pavaizduotas su funkcijos atsaku. galima () aptarta ankstesniame skyriuje.

Šis pavyzdys yra „didžiųjų raidžių serveris“, kuris klausosi 2000 prievado ir atsako į užklausas, jei įmanoma, tuo, kas buvo išsiųsta didžiosiomis raidėmis. Jį galima išbandyti, pavyzdžiui, su PuTTY arba tiesiog su Telnet 2000 Jis tikrai nėra labai praktiškas, jo tikslas tik parodyti, kaip iš serverio gauti kliento jam siunčiamus duomenis.

6. Nutraukite ryšį

Nors įprasta, kad serverio programa veikia neribotą laiką, kliento ryšiai užmezgami, užmezgami ryšiai ir nutraukiami, todėl ištekliai gali būti atkurti ir naudojami kituose ryšiuose arba skirti kitiems programos tikslams. Funkcija sustabdyti() klasės klientas Jis naudojamas nutraukti kliento ryšį ir atlaisvinti visus jo naudojamus išteklius.

Tai, kad klientas nutraukia ryšį, kai buvo išsiųstas arba gaunamas užklausos informacijos objektas, serveriui taip pat leidžia atlaisvinti išteklius, kad juos būtų galima skirti kitiems ryšiams ar kitiems tikslams. Trumpai tariant, nors tai atrodo nereikšminga, patartina nutraukti ryšį, kai baigiasi kliento operacijos.

Kita gera praktika nutraukiant ryšį su klientu yra ištuštinti kad klasė naudojasi. Norėdami tai padaryti, funkcija yra prieinama nuleisti () turėtų būti iškviestas nutraukus kliento ryšį su sustabdyti()

HTTP GET užklausos pavyzdys

Siekiant geriau paaiškinti visa tai, kas išdėstyta pirmiau, toliau pateikiamas išsamesnis užklausų pavyzdys. TCP naudojant GET užklausas naudojant HTTP protokolas. Pavyzdyje vertės, gautos analoginių jutiklių, prijungtų prie Arduino plokštės, siunčiamos į žiniatinklio serverį, kuris jas saugo duomenų bazėje.

Rašyti komentarą

Galbūt praleidote