Etherneti TCP-ühendus Arduinoga

Etherneti TCP-ühendus Arduinoga

Etherneti TCP-ühendus Arduinoga

Tarkvara seisukohalt ühenduse loomine Ethernet koos Arduino See on väga lihtne. Selleks kasutage Etherneti raamatukogu. See raamatukogu on mõeldud a Etherneti kilp mis põhineb integreeritud W5100, kuid on ka teisi erinevaid tahvleid või mooduleid ja/või mis kasutavad muid integreeritud plaate või mooduleid, näiteks ENC28J60. Selle kasutamise lihtsustamiseks ja ühilduvuse suurendamiseks kasutavad teised raamatukogud (peaaegu) sama API et Etherneti raamatukogu, peate ainult asendama alternatiivse teegi algse teegiga või lisama selle (kui nimi on erinev) selle asemele, isegi kui koodis kasutatakse samu (või väga sarnaseid) funktsioone. Minu puhul kasutan UIPEtherneti raamatukogu de Norbert Truchsess järgides sama protsessi, mida ma selles tekstis kirjeldan.

ENC28J60 moodul kasutamiseks UIPEtherneti teegiga

1. Määratlege Etherneti ühendus

Kas kavatsete selle rolli omaks võtta klient nagu näiteks server, tuleb kõigepealt defineerida seos funktsiooniga algama () mida saab parameetrina edastada ainult MAC-aadress ja ootame serverit DHCP võrgus määrake a IP-aadress ja ülejäänud konfiguratsioon või on võimalik näidata (valikuliselt) rohkem parameetreid kuni täieliku konfiguratsiooni määratlemiseni:

  1. Dirección MAC (mida on juba mainitud)
  2. IP-aadress kilbist või moodulist
  3. Serveri IP-aadress DNS (ainult üks server)
  4. IP-aadress Värav
  5. Võrkmask

Soovitav on märkida kõik parameetrid, välja arvatud juhul, kui nende mahaarvamine on tavaline, vältimaks vale konfiguratsiooni (näiteks et lüüs ei ole võrgu esimene aadress).

Eelnevast tundub, et on selge, et IP-aadresse esindavaid andmeid tuleb kasutada üsna sageli, mistõttu on raamatukogus klass IP-aadress kust luua IP-aadressi objekte. Seda määravad parameetrid on aadressi neli baiti IPV4

La MAC-aadress Selle teegi jaoks on see määratletud 6-baidise massiivina. MAC-aadress on (peab olema) kordumatu identifikaator, mille esimesed baidid näitavad tootjat ja mudelit ning viimased konkreetset seadet. Integreeritud ENC28J60 ei sisalda MAC-aadressi, välja arvatud juhul, kui otsustate osta ka a Integreeritud MAC-aadress Microchipist (või terve plokk JAH aadressidest IEEE kui seadmete arv on piisavalt suur, et see end ära tasub). Kui teil pole MAC-aadressi, saate selle välja mõelda, jälgides, et see ei läheks vastuollu teiste seadmega võrgus olevate andmetega.

Kui seadistamine toimub DHCP-serveriga, mitte "käsitsi", funktsioon localIP() Kasulik on uurida aadressi, mille server on moodulile määranud. Määratud aadressi uuendamiseks (kui vastav aeg on möödas) Etherneti raamatukogu pakub funktsiooni säilitama () mis teavitab ka uuendamise olekule vastava koodi tagastamisega:

  1. Operatsioonil pole olnud mõju
  2. Viga IP-aadressi uuendamisel
    Määratud IP-aadressi kasutamist samas serveris ei saanud pikendada
  3. IP-aadressi uuendamine õnnestus
  4. IP-aadressi uuesti sidumine ebaõnnestus
    Määratud IP-aadressi kasutamist ei saanud üheski serveris pikendada
  5. IP-aadressi ümbermääramine õnnestus

Seni nähtud teabe põhjal saate kirjutada näite, kuidas Etherneti ühendus algatatakse IP-aadressi konfigureerimisel läbi võrgu DHCP-serveri. Järgmine näidiskood proovib uuendada IP-aadressi iga teatud aja tagant ja annab tulemusest teada.

Allolev näide määrab IP-aadressi ja ülejäänud konfiguratsiooni käsitsi objektide abil IP-aadress lugemise mugavamaks muutmiseks ja (keerukama koodi puhul) vältimiseks, mis võivad tekkida aadressi (valesti) kirjutamisel iga kord, kui seda kasutati.

2. Käivitage ühendus kliendi või serveri režiimis

Serverirežiimis ühenduse loomisel kuulab teiste süsteemide päringuid just arendatav mikrojuhitav süsteem. Ühenduse loomiseks serverina kasutage Etherneti server() ja parameetrina näidatakse port, mida server kuulab. Etherneti server() on klassi ehitaja server, mis toetab kõiki Etherneti toiminguid serverina. Kuigi kõige õigeusklikum on helistada konstruktorile Etherneti server(), pole harvad juhud, kui leidub näiteid, mis klassi otseselt kasutavad server või alternatiivsed teegid Etherneti ühenduse jaoks, mis valivad seda käivitussüsteemi kasutada.

Ühendus kliendina on see, mis teeb päringuid serverisüsteemile, mis ootab neid ja vastab neile vastavalt. Ühenduse loomiseks kliendina kasutage EthernetClient() mis on klassi konstrueerija klient kõigi Etherneti toimingute päritolu kliendina.

Erinevalt sellest, mis juhtub serverirežiimiga, mis eeldatavasti töötab klassi instantseerimise hetkest (kuigi see vastab klientidele ainult siis, kui see tõesti nii on), peate enne selle kasutamist veenduma, et kliendiühendus on valmis. Kliendiobjektilt, mis luuakse ühenduse loomisel, saab küsida, kas see on saadaval. Näiteks päringutoiminguid saab lisada struktuuri if (EthernetClient) neid käivitada ainult siis, kui kliendiühendus on saadaval.

3. Looge ühendus kliendina

Nagu öeldud, on pärast ühenduse loomist päringute tegemise initsiatiiv klient. Server ootab seda algatust ja vastab sellele vastavalt. Seetõttu loob serveriga ühenduse klient, mida me selleks kasutame ühenda () märkides serveri parameetritena (IP-aadress või URL) ja port selles, kes kuulab.

Toimingu tulemuse põhjal tagastab funktsioon väärtused

  1. (EDU) Ühendus loodud edukalt
  2. Ühenduse loomine
  3. (AEGUNUD) Aegumine on möödunud, ilma et ühendust oleks loodud
  4. (INVALID_SERVER) Serverit ei leitud või see ei reageeri õigesti
  5. (KÄBITATUD) Ühendus katkestati enne täielikku loomist
  6. (INVALID_RESPONSE) Serveri vastus on vale

Enne päringute tegemist on vaja kontrollida, kas ühendus funktsiooniga töötab ühendatud () see tuleb tagasi tõsi kui see on juba saadaval või vale muidu.

Allolev näide illustreerib ühendust kliendina, kontrollides iga 10 sekundi järel, kas serveriga on ühendus olemas (see pole mõeldud millekski produktiivseks, vaid funktsioonide süntaksi näitamiseks) midagi, mis muide, tootmisveebiserverile väga ei meeldiks.

4. Andmete saatmine

Nagu teisedki tuntumad klassid, nt Seeria-, ja võrreldava kasutusega klassid klient y server omavad funktsioone

  • kirjutama(fakt) o kirjutama(puhver, pikkus)

    Saadab teavet kliendi või serveri objekti abil, millelt see välja kutsutakse. Parameeter "andmed" on üksik bait o sõjavanker samas kui "puhver" on massiiv bait o sõjavanker millest saadetakse "pikkusega" võrdne summa. Seda funktsiooni kasutatakse kahendtoimingute jaoks, võrreldes kahe järgmisega, mis on tavaliselt reserveeritud teksti saatmiseks.

  • trükk(andmed, baas)

    Saadab kliendi või serverina (olenevalt klassist, kust seda kasutatakse) "andmetele" vastava info tekstina. Kui teavet ei väljendata tekstina (näiteks see on täisarv), saab teisenduse valimiseks kasutada valikulist parameetrit "base", mis võib olla üks konstantidest BIN, OCT, DEC või HEX, mis näitavad vastavalt. alused, mis vastavad kahendarvule (alus 2), kaheksandsüsteemile (alus 8), kümnendsüsteemile (alus 10) ja kuueteistkümnendsüsteemile (alus 16)

  • println(andmed, baas)

    Toiming on identne eelmisega, välja arvatud see, et pärast parameetriga "data" selgelt näidatud teavet saadetakse käru tagastus (kood 13, mida saab esitada kui \r) ja rea ​​lõpp (kood 10, mida saab esitada tähistab \n) Nendele koodidele viidatakse sageli vastavalt akronüümiga CR (Carriage Return) ja LF (reavahetus)

Kolm eelmist funktsiooni tagastavad saadetud baitide arvu, nagu ka klassi samaväärsed funktsioonid Seeria-; Nagu eespool öeldud, on operatsioon võrreldav.

5. Andmete vastuvõtmine

Nagu andmete saatmise toimingute puhul, on vastuvõtutoimingud võrreldavad laialdaselt kasutatavate toimingutega Seeria-. Vastuvõtuprotokoll on samuti sarnane: kontrollige, kas saadaval on (piisavalt) andmeid (saadaval) ja sel juhul lugege need läbi


  • saadaval ()

    Tagastab lugemiseks saadaolevate baitide arvu. See funktsioon on olemas mõlemas klassis klient kui server; Esimesel juhul teatab see baitide arvu, mille server on vastuseks päringule saatnud ja mis on kliendile lugemiseks saadaval (lugenud) ja teisel juhul toimingu sooritanud klient (objekt) või vale, kui seda pole.

  • loe ()

    Seda kasutatakse saadud teabe lugemiseks. See funktsioon on saadaval ainult klassis klient. Kui arendatav rakendus täidab serveri rolli, tuleb saabunud teabe lugemiseks luua kliendiobjekt koos funktsiooni vastusega saadaval () käsitletud eelmises jaotises.

Järgmine näide on "suurtähtede server", mis kuulab porti 2000 ja vastab päringutele võimalusel suuretähelistes saadetistega. Seda saab testida näiteks koos PuTTY või lihtsalt koos telnet 2000 See pole kindlasti väga praktiline, selle eesmärk on vaid näidata, kuidas kliendi poolt talle saadetud andmeid serverist kätte saada.

6. Lõpetage ühendus

Kuigi on tavaline, et serverirakendus töötab lõputult, luuakse kliendiühendused, luuakse ühendusi ja lõpetatakse ressursse, võimaldades ressursse taastada ja kasutada muudes ühendustes või programmi muuks kasutuseks. Funktsioon stop () klassist klient Seda kasutatakse kliendiühenduse katkestamiseks ja kasutatavate ressursside vabastamiseks.

Serveri jaoks võimaldab asjaolu, et klient katkestab ühenduse, kui päringu infoobjekt on saadetud või vastu võetud, vabastada ressursse nende eraldamiseks muudeks ühendusteks või erinevateks eesmärkideks. Lühidalt, kuigi see tundub tühine, on soovitatav ühendus katkestada, kui kliendi toimingud lõppevad.

Teine hea tava kliendiühenduse katkestamisel on tühjendada mida klass kasutab. Selleks on funktsioon saadaval flush () tuleks helistada pärast kliendiühenduse katkestamist stop ()

HTTP GET päringu näide

Kõige eelneva paremaks selgitamiseks on allpool toodud taotluste täielikum näide. TCP kasutades GET-päringuid kasutades HTTP protokoll. Näites saadetakse Arduino plaadiga ühendatud analoogandurite saadud väärtused veebiserverisse, mis salvestab need andmebaasi.

Postita kommentaar

Võib-olla jäite vahele