Ethernet TCP-yhteys Arduinon kanssa

Ethernet TCP-yhteys Arduinon kanssa

Ethernet TCP-yhteys Arduinon kanssa

Ohjelmiston näkökulmasta yhteyden muodostaminen Ethernet kanssa Työläs Se on hyvin yksinkertainen. Käytä tätä varten Ethernet-kirjasto. Tämä kirjasto on suunniteltu a Ethernet-suoja joka perustuu integroituun W5100, mutta on olemassa muitakin erilaisia ​​kortteja tai moduuleja ja/tai jotka käyttävät muita integroituja, kuten ENC28J60. Yksinkertaistaakseen sen käyttöä ja lisätäkseen yhteensopivuutta, muut kirjastot käyttävät (melkein) samaa API että Ethernet-kirjasto, sinun tulee vain korvata vaihtoehtoinen kirjasto alkuperäisellä tai sisällyttää se (kun nimi on eri) sen tilalle, vaikka koodissa käytettäisiin samoja (tai hyvin samankaltaisia) toimintoja. Omassa tapauksessani käytän UIPEthernet-kirjasto de Norbert Truchsess noudattaen samaa prosessia, jota aion kuvata tässä tekstissä.

ENC28J60-moduuli käytettäväksi UIPEthernet-kirjaston kanssa

1. Määritä Ethernet-yhteys

Aiotteko omaksua roolin asiakas kuten yksi palvelin, sinun on ensin määritettävä yhteys funktioon alkaa () joka voidaan välittää parametrina vain MAC-osoite ja odota palvelinta DHCP määritä verkossa a IP-osoite ja loput kokoonpanosta tai on myös mahdollista ilmoittaa (valinnaisesti) lisää parametreja, kunnes täydellinen konfiguraatio on määritetty:

  1. Dirección MAC (joka on jo mainittu)
  2. IP-osoite suojasta tai moduulista
  3. Palvelimen IP-osoite DNS (vain yksi palvelin)
  4. IP-osoite Yhdyskäytävä
  5. Verkon naamio

On suositeltavaa ilmoittaa kaikki parametrit, ellei niiden vähennys ole tavallinen, jotta konfiguraatio ei ole oikea (esimerkiksi se, että yhdyskäytävä ei ole verkon ensimmäinen osoite).

Edellä olevan perusteella näyttää selvältä, että IP-osoitteita edustavaa dataa on käytettävä melko usein, minkä vuoksi kirjasto sisältää luokan IP-osoite josta IP-osoiteobjektit luodaan. Sen määrittävät parametrit ovat osoitteen neljä tavua IPV4

La MAC-osoite Se on määritelty tälle kirjastolle 6-tavuiseksi taulukoksi. MAC-osoite on (oletettavasti) yksilöllinen tunniste, jonka ensimmäiset tavut osoittavat valmistajan ja mallin ja viimeiset tavut tietyn laitteen. Integroitu ENC28J60 ei sisällä MAC-osoitetta, ellet päätä ostaa myös a Integroitu MAC-osoite Microchipistä (tai koko lohko KYLLÄ osoitteista IEEE jos laitteiden määrä on tarpeeksi suuri, jotta se kannattaa). Kun sinulla ei ole MAC-osoitetta, voit keksiä sellaisen varmistaen, että se ei ole ristiriidassa muiden verkon kanssa, jossa laite sijaitsee.

Jos konfigurointi tehdään DHCP-palvelimella "käsin" sijaan, toiminto localIP() On hyödyllistä tarkistaa osoite, jonka palvelin on määrittänyt moduulille. Uusiaksesi osoitetun osoitteen (jos vastaava aika on umpeutunut) Ethernet-kirjasto tarjoaa toiminnon ylläpitää () joka myös ilmoittaa palauttamalla koodin, joka vastaa uusimisen tilaa:

  1. Operaatiolla ei ole ollut vaikutusta
  2. Virhe uusittaessa IP-osoitetta
    Määritetyn IP-osoitteen käyttöä samalla palvelimella ei voitu laajentaa
  3. IP-osoitteen uusiminen onnistui
  4. IP-osoitteen uudelleensidonta epäonnistui
    Annetun IP-osoitteen käyttöä ei voitu laajentaa millään palvelimella
  5. IP-osoitteen uudelleenmääritys onnistui

Tähän mennessä nähtyjen tietojen avulla voit kirjoittaa esimerkin siitä, kuinka Ethernet-yhteys käynnistetään määrittämällä IP-osoite verkossa olevan DHCP-palvelimen kautta. Seuraava esimerkkikoodi yrittää uusia IP-osoitteen tietyn ajan välein ja raportoi tuloksen.

Alla oleva esimerkki määrittää IP-osoitteen ja muun kokoonpanon manuaalisesti objektien avulla IP-osoite Lukemisen helpottamiseksi ja (jos kyseessä on monimutkaisempi koodi) välttääksesi virheet, joita saattaa ilmetä, jos osoite kirjoitetaan (väärin) joka kerta, kun sitä käytetään.

2. Käynnistä yhteys asiakas- tai palvelintilassa

Kun yhteys muodostetaan palvelintilassa, kehitteillä oleva mikro-ohjattu järjestelmä kuuntelee muiden järjestelmien pyyntöjä. Aloita yhteys palvelimena käyttämällä Ethernet-palvelin() ja portti, jota palvelin kuuntelee, ilmoitetaan parametrina. Ethernet-palvelin() on luokan rakentaja Server, joka tukee kaikkia Ethernet-toimintoja palvelimena. Vaikka kaikkein ortodoksisin asia on soittaa rakentajalle Ethernet-palvelin(), ei ole harvinaista löytää esimerkkejä, jotka käyttävät suoraan luokkaa Server tai vaihtoehtoisia kirjastoja Ethernet-yhteyttä varten, jotka päättävät käyttää kyseistä toteutusjärjestelmää.

Yhteys asiakkaana on se, joka tekee pyyntöjä palvelinjärjestelmälle, joka odottaa niitä ja vastaa niihin vastaavasti. Jos haluat muodostaa yhteyden asiakkaana, käytä EthernetClient() mikä on luokan rakentaja Asiakas kaikkien Ethernet-toimintojen alkuperä asiakkaana.

Toisin kuin palvelintilassa, jonka oletetaan toimivan luokan luomishetkestä lähtien (vaikka se vastaa asiakkaille vain, jos se todella on), sinun on varmistettava, että asiakasyhteys on valmis ennen sen käyttöä. Asiakasobjektilta, joka luodaan, kun yhteys muodostetaan, voidaan kysyä, onko se käytettävissä. Esimerkiksi kyselyoperaatioita voidaan sisällyttää rakenteeseen jos (Ethernet-asiakas) suorittaa ne vain, kun asiakasyhteys on käytettävissä.

3. Muodosta yhteys asiakkaana

Kuten on sanottu, kun yhteys on luotu, asiakas tekee aloitteen kyselyiden tekemiseen. Palvelin odottaa aloitetta ja vastaa sen mukaisesti. Siksi asiakas muodostaa yhteyden palvelimeen, ja käytämme tätä varten kytkeä() ilmoittamalla palvelimen parametreiksi (IP-osoite tai URL) Ja puerto siinä, joka kuuntelee.

Toiminnon tuloksen perusteella funktio palauttaa arvot

  1. (MENESTYS) Yhteys muodostettu onnistuneesti
  2. Yhteyden muodostaminen
  3. (AIKA LOPPUI) Aikakatkaisu on kulunut ilman yhteyttä
  4. (INVALID_SERVER) Palvelinta ei löydy tai se ei vastaa oikein
  5. (KATKETTU) Yhteys katkesi ennen kuin se oli täysin muodostettu
  6. (INVALID_RESPONSE) Palvelimen vastaus on virheellinen

Ennen kuin aloitat kyselyjen tekemisen, on tarpeen varmistaa, että yhteys toimii toiminnon kanssa yhdistetty () joka palaa totta jos se on jo saatavilla tai väärä muuten.

Alla oleva esimerkki havainnollistaa yhteyttä asiakkaana, tarkistaen 10 sekunnin välein, onko palvelimeen yhteyttä (se ei ole tarkoitettu millään tavalla tuottavaksi, vain toimintojen syntaksin näyttämiseksi) jotain, joka muuten, tuotantoverkkopalvelin ei haluaisi kovinkaan paljon.

4. Lähetä tiedot

Kuten muutkin tunnetuimmat luokat, kuten Sarja, ja vastaavalla käytöllä luokat Asiakas y Server on toimintoja

  • kirjoittaa(fakta) o kirjoittaa(puskuri, pituus)

    Lähettää tiedot käyttämällä asiakas- tai palvelinobjektia, josta ne kutsutaan. "Data"-parametri on yksittäinen tavu o sotavaunut kun taas "puskuri" on joukko tavu o sotavaunut josta lähetetään "pituutta" vastaava määrä. Tätä toimintoa käytetään binäärioperaatioissa verrattuna kahteen seuraavaan, jotka on yleensä varattu tekstin lähettämiseen.

  • painaa(tietokanta)

    Lähettää asiakkaana tai palvelimena (riippuen luokasta, josta sitä käytetään) "dataa" vastaavat tiedot tekstinä. Jos tietoa ei ilmaista tekstinä (esimerkiksi se on kokonaisluku), valinnaisella parametrilla "base" voidaan valita muunnos, joka voi olla jokin vakioista BIN, OCT, DEC tai HEX, jotka osoittavat vastaavasti. emäkset, jotka vastaavat binääriä (kantaluku 2), oktaalia (kantaluku 8), desimaalilukua (kantaluku 10) ja heksadesimaalilukua (kantaluku 16)

  • println(tietokanta)

    Toiminto on identtinen edellisen kanssa, paitsi että "data"-parametrilla nimenomaisesti ilmoitettujen tietojen jälkeen lähetetään rivinvaihto (koodi 13, joka voidaan esittää muodossa \r) ja rivin loppu (koodi 10, joka voidaan lähettää edustaa \n) Näihin koodeihin viitataan usein vastaavasti lyhenteellä CR (Carriage Return) ja LF (rivinsyöttö)

Kolme edellistä funktiota palauttavat lähetettyjen tavujen määrän, samoin kuin vastaavat luokan funktiot Sarja; Kuten edellä mainittiin, toiminta on vertailukelpoinen.

5. Vastaanota tietoja

Kuten datan lähetystoimintojen tapauksessa, vastaanottotoiminnot ovat verrattavissa laajalti käytettyihin toimiin Sarja. Vastaanottoprotokolla on myös samanlainen: tarkista, onko saatavilla (tarpeeksi) dataa (saatavissa) ja lue ne siinä tapauksessa


  • saatavilla ()

    Palauttaa luettavissa olevien tavujen määrän. Tämä toiminto on molemmissa luokissa Asiakas kuten Server; Ensimmäisessä tapauksessa se raportoi tavujen määrän, jotka palvelin on lähettänyt vastauksena pyyntöön ja jotka ovat asiakkaan luettavissa (luettu), ja toisessa tapauksessa toiminnon suorittanut asiakas (objekti) tai false, jos sellaista ei ole.

  • lukea()

    Sitä käytetään vastaanotetun tiedon lukemiseen. Tämä ominaisuus on käytettävissä vain luokassa Asiakas. Jos kehitettävä sovellus täyttää palvelimen roolin, saapuneiden tietojen lukemiseksi tulee asiakasobjekti instantoida funktiovastauksella saatavilla () keskusteltu edellisessä osiossa.

Seuraava esimerkki on "caps-palvelin", joka kuuntelee porttia 2000 ja vastaa pyyntöihin lähettämällä mitä tahansa isoilla kirjaimilla, jos mahdollista. Sitä voi testata esim PuTTY tai yksinkertaisesti kanssa telnet 2000 Se ei todellakaan ole kovin käytännöllistä, sen tarkoitus on vain näyttää, kuinka asiakkaan sille lähettämät tiedot saadaan palvelimelta.

6. Katkaise yhteys

Vaikka on tavallista, että palvelinsovellus toimii loputtomasti, asiakasyhteydet muodostetaan, muodostavat yhteyksiä ja lopetetaan, jolloin resurssit voidaan palauttaa ja käyttää muissa yhteyksissä tai varata ohjelman muihin käyttötarkoituksiin. Toiminto lopettaa() luokasta Asiakas Sitä käytetään asiakasyhteyden katkaisemiseen ja sen käyttämien resurssien vapauttamiseen.

Palvelimelle se, että asiakas katkaisee yhteyden, kun kyselyn tietoobjekti on lähetetty tai vastaanotettu, antaa palvelimelle myös vapauttaa resursseja niiden allokoimiseksi muihin yhteyksiin tai eri tarkoituksiin. Lyhyesti sanottuna, vaikka se vaikuttaa vähäiseltä, on suositeltavaa katkaista yhteys asiakkaan toiminnan päättyessä.

Toinen hyvä käytäntö asiakasyhteyttä katkaistaessa on tyhjentää joita luokka käyttää. Tätä varten toiminto on käytettävissä huuhtele () tulee soittaa, kun asiakasyhteys on katkaistu lopettaa()

Esimerkki HTTP GET -kyselystä

Alla on kattavampi esimerkki pyynnöistä selventääksesi kaikkea yllä olevaa. TCP käyttämällä GET-pyyntöjä käyttämällä HTTP-protokolla. Esimerkissä Arduino-levyyn kytkettyjen analogisten antureiden saamat arvot lähetetään verkkopalvelimelle, joka tallentaa ne tietokantaan.

Post Comment

Olet ehkä missannut