Koneksyon ng Ethernet TCP sa Arduino

Koneksyon ng Ethernet TCP sa Arduino

Koneksyon ng Ethernet TCP sa Arduino

Mula sa isang software point of view, pagtatatag ng isang koneksyon Ethernet sa Arduino Ito ay napaka-simple. Upang gawin ito, gamitin ang Ethernet library. Ang aklatan na ito ay dinisenyo para sa isang Ethernet Shield na nakabatay sa pinagsama-samang W5100, ngunit may iba pang iba't ibang board o module at/o gumagamit ng iba pang pinagsama-samang mga board, gaya ng ENC28J60. Upang pasimplehin ang paggamit nito at pataasin ang pagiging tugma, ang ibang mga aklatan ay gumagamit (halos) pareho API na Ethernet library, kakailanganin mo lamang palitan ang alternatibong library ng orihinal o isama ito (kapag iba ang pangalan) sa lugar nito kahit na ang parehong (o halos magkatulad) na mga function ay ginagamit sa code. Sa aking kaso, ginagamit ko ang UIPEthernet library de Norbert Truchsess sumusunod sa parehong proseso na ilalarawan ko sa tekstong ito.

ENC28J60 module para gamitin sa UIPEthernet library

1. Tukuyin ang koneksyon sa Ethernet

Kung kukuha ka man ng papel ng parokyano tulad ng isa server, una sa lahat kailangan mong tukuyin ang koneksyon sa function simulan () na maaaring maipasa bilang isang parameter lamang ang MAC address at maghintay para sa isang server DHCP sa network magtalaga ng a IP adress at ang natitirang configuration o posible ring magpahiwatig (opsyonal) ng higit pang mga parameter hanggang sa matukoy ang kumpletong configuration:

  1. Dirección MAC (na nabanggit na)
  2. IP address ng kalasag o modyul
  3. Address ng server ng IP DNS (isang server lang)
  4. IP address ng Gateway
  5. Net mask

Maipapayo na ipahiwatig ang lahat ng mga parameter, maliban kung ang kanilang pagbabawas ay ang karaniwan, upang maiwasan na ang pagsasaayos ay hindi tama (halimbawa, na ang gateway ay hindi ang unang address ng network).

Mula sa itaas, tila malinaw na ang data na kumakatawan sa mga IP address ay dapat gamitin nang madalas, kaya naman ang silid-aklatan ay kinabibilangan ng klase IP address mula sa kung saan i-instantiate ang mga bagay sa IP address. Ang mga parameter na tumutukoy dito ay ang apat na byte ng isang address IPV4

La MAC address Ito ay tinukoy para sa library na ito bilang isang 6-byte array. Ang MAC address ay (dapat ay) isang natatanging identifier kung saan ang mga unang byte ay nagpapahiwatig ng tagagawa at modelo at ang mga huling ay nagpapahiwatig ng partikular na device. Ang pinagsama-samang ENC28J60 ay hindi kasama ang isang MAC address maliban kung pipiliin mong bumili din ng a Pinagsamang MAC address mula sa Microchip (o isang buong bloke OUI ng mga address sa IEEE kung ang pagpapatakbo ng mga aparato ay sapat na malaki upang gawin itong sulit). Kapag wala kang MAC address, maaari kang mag-imbento ng isa, pag-iingat na hindi ito sumasalungat sa iba sa network kung saan matatagpuan ang device.

Kung ang pagsasaayos ay tapos na sa isang DHCP server sa halip na "sa pamamagitan ng kamay", ang function localIP() Kapaki-pakinabang na kumonsulta sa address na itinalaga ng server sa module. Upang i-renew ang itinalagang address (kung ang kaukulang oras ay nag-expire na) ang Ethernet library nagbibigay ng function panatilihin() na magpapaalam din sa pamamagitan ng pagbabalik ng code na tumutugma sa katayuan ng pag-renew:

  1. Walang epekto ang operasyon
  2. Error sa pag-renew ng IP address
    Ang paggamit ng nakatalagang IP address sa parehong server ay hindi ma-extend
  3. Matagumpay na na-renew ang IP address
  4. Nabigo ang rebind ng IP address
    Ang paggamit ng itinalagang IP address ay hindi maaaring palawigin sa anumang server
  5. Matagumpay na naitalaga ang IP address

Sa impormasyong nakikita sa ngayon, maaari kang sumulat ng isang halimbawa kung paano sisimulan ang isang koneksyon sa Ethernet sa pamamagitan ng pag-configure ng IP address sa pamamagitan ng isang DHCP server sa network. Sinusubukan ng sumusunod na halimbawang code na i-renew ang IP address sa bawat tiyak na tagal ng panahon at iuulat ang resulta.

Ang halimbawa sa ibaba ay nagtatalaga ng IP address at ang iba pang configuration nang manu-mano gamit ang mga bagay IP address upang gawing mas komportableng basahin at (sa kaso ng mas kumplikadong code) upang maiwasan ang mga error na maaaring mangyari kung ang address ay (maling) naisulat sa tuwing ito ay ginamit.

2. Simulan ang koneksyon sa client o server mode

Kapag nagpasimula ng isang koneksyon sa server mode, ito ay ang microcontrolled system na binuo na nakikinig sa mga kahilingan mula sa iba pang mga system. Upang simulan ang koneksyon bilang isang server, gamitin EthernetServer() at ang port kung saan makikinig ang server ay ipinahiwatig bilang isang parameter. EthernetServer() ay ang tagabuo ng klase server, na sumusuporta sa lahat ng pagpapatakbo ng Ethernet bilang isang server. Kahit na ang pinaka-orthodox na bagay ay ang tumawag sa constructor EthernetServer(), karaniwan nang makakita ng ilang halimbawa na direktang gumagamit ng klase server o mga alternatibong aklatan para sa koneksyon sa Ethernet na pipiliing gamitin ang instantiation system na iyon.

Ang koneksyon bilang isang kliyente ay ang isa na gumagawa ng mga kahilingan sa sistema ng server, na naghihintay para sa kanila at sumasagot sa kanila nang naaayon. Upang simulan ang isang koneksyon bilang isang kliyente, gamitin EthernetClient() ano ang constructor ng klase Kliente pinagmulan ng lahat ng pagpapatakbo ng Ethernet bilang isang kliyente.

Hindi tulad ng kung ano ang nangyayari sa server mode, na ipinapalagay na gagana mula sa sandaling ang klase ay instantiated (bagaman ito ay tutugon lamang sa mga kliyente kung ito talaga), dapat mong i-verify na ang koneksyon ng kliyente ay handa na bago gamitin ito. Ang object ng kliyente na nilikha kapag sinimulan ang koneksyon ay maaaring itanong upang makita kung ito ay magagamit. Halimbawa, ang mga pagpapatakbo ng query ay maaaring isama sa isang istraktura kung(EthernetClient) upang isagawa lamang ang mga ito kapag ang koneksyon ng kliyente ay magagamit.

3. Magtatag ng isang koneksyon bilang isang kliyente

Gaya ng nasabi na, kapag nalikha na ang koneksyon, ang kliyente na ang magkukusa na gumawa ng mga query. Maghihintay ang server para sa inisyatiba at tutugon nang naaayon. Ito ay, samakatuwid, ang kliyente na kumokonekta sa server, upang gawin ito ay ginagamit namin ikonekta () na nagpapahiwatig ng server bilang mga parameter (ang IP address o ang URL) at ang port sa nakikinig.

Batay sa resulta ng operasyon, ibabalik ng function ang mga halaga

  1. (TAGUMPAY) Matagumpay na naitatag ang koneksyon
  2. Pagtatatag ng koneksyon
  3. (TIMED_OUT) Lumipas ang timeout nang hindi naitatag ang koneksyon
  4. (INVALID_SERVER) Ang server ay hindi natagpuan o hindi tumutugon nang tama
  5. (TRUNCATE) Ang koneksyon ay ibinaba bago ganap na naitatag
  6. (INVALID_RESPONSE) Mali ang tugon ng server

Bago magsimulang gumawa ng mga query, kinakailangang i-verify na gumagana ang koneksyon sa function konektado() babalik yan totoo kung ito ay magagamit na o hindi totoo kung hindi man.

Ang halimbawa sa ibaba ay naglalarawan ng koneksyon bilang isang kliyente, sinusuri bawat 10 segundo kung mayroong koneksyon sa server (hindi ito nilayon na maging produktibo, para lang ipakita ang syntax ng mga pag-andar) isang bagay na, sa pamamagitan ng paraan, isang produksyon hindi masyadong gusto ng web server.

4. Magpadala ng data

Tulad ng ibang mas kilalang klase, gaya ng Kuwentong de serye, at may maihahambing na paggamit, ang mga klase Kliente y server may mga function

  • magsulat(katotohanan) o magsulat(buffer, haba)

    Nagpapadala ng impormasyon gamit ang client o server object kung saan ito hinihingi. Ang parameter na "data" ay iisa byte o tangke habang ang "buffer" ay isang array ng byte o tangke kung saan ipinapadala ang halagang katumbas ng "haba." Ang function na ito ay ang ginagamit para sa mga binary na operasyon, kumpara sa susunod na dalawa na karaniwang nakalaan para sa pagpapadala ng text.

  • i-print(data, base)

    Ipinapadala bilang isang kliyente o server (depende sa klase kung saan ito ginamit) ng impormasyong nauugnay sa "data" bilang teksto. Kung ang impormasyon ay hindi ipinahayag bilang text (halimbawa ito ay isang integer) ang opsyonal na parameter na "base" ay maaaring gamitin upang piliin ang conversion, na maaaring isa sa mga constant BIN, OCT, DEC o HEX na nagpapahiwatig, ayon sa pagkakabanggit. ang mga base na naaayon sa binary (base 2), octal (base 8), decimal (base 10) at hexadecimal (base 16)

  • println(data, base)

    Ang operasyon ay kapareho ng nauna maliban sa pagpapadala, pagkatapos ng impormasyong hayagang ipinahiwatig ng parameter na "data", isang carriage return (code 13 na maaaring kinakatawan bilang \r) at isang dulo ng linya (code 10, na maaaring maging kinakatawan ng \n) Ang mga code na ito ay madalas na tinutukoy, ayon sa pagkakabanggit, ng acronym CR (Carriage Return) at LF (Line Feed)

Ibinabalik ng tatlong nakaraang function ang bilang ng mga byte na naipadala, pati na rin ang mga katumbas na function ng klase Kuwentong de serye; Tulad ng sinabi sa itaas, ang operasyon ay maihahambing.

5. Tumanggap ng data

Tulad ng sa kaso ng mga operasyon sa pagpapadala ng data, ang pagtanggap ng mga operasyon ay maihahambing sa mga malawakang ginagamit Kuwentong de serye. Ang pagtanggap ng protocol ay katulad din: suriin kung mayroong (sapat) na data na magagamit (magagamit) at sa kasong iyon basahin ang mga ito


  • magagamit ()

    Ibinabalik ang bilang ng mga byte na magagamit para basahin. Ang function na ito ay naroroon sa parehong mga klase Kliente bilang server; Sa unang kaso, iniuulat nito ang bilang ng mga byte na ipinadala ng server bilang tugon sa isang kahilingan at magagamit para mabasa ng kliyente (basahin), at sa pangalawang kaso ang kliyente (object) na nagsagawa ng operasyon o false kung wala.

  • basahin ()

    Ito ay ginagamit upang basahin ang impormasyon na natanggap. Available lang ang feature na ito sa klase Kliente. Kung ang application na binuo ay tumutupad sa papel ng server, upang basahin ang impormasyon na dumating, ang isang client object ay dapat na instantiated na may tugon ng function. magagamit () tinalakay sa nakaraang seksyon.

Ang sumusunod na halimbawa ay isang "caps server" na nakikinig sa port 2000 at tumutugon sa mga kahilingan gamit ang anumang ipinadala sa lahat ng caps kapag posible. Maaari itong masuri, halimbawa, sa PuTTY o simpleng kasama telnet 2000 Ito ay tiyak na hindi masyadong praktikal, ang layunin nito ay ipakita lamang kung paano makuha ang data na ipinadala dito ng isang kliyente mula sa server.

6. Tapusin ang koneksyon

Bagama't karaniwan para sa isang application ng server na tumakbo nang walang hanggan, ang mga koneksyon ng kliyente ay itinatag, gumawa ng mga koneksyon at wakasan, na nagpapahintulot sa mga mapagkukunan na mabawi at magamit sa iba pang mga koneksyon o nakatuon sa iba pang paggamit ng programa. Ang function huminto () ng klase Kliente Ito ay ginagamit upang wakasan ang isang koneksyon ng kliyente at palayain ang anumang mga mapagkukunan na ginagamit nito.

Para sa server, ang katotohanang tinapos ng kliyente ang koneksyon kapag naipadala o natanggap ang object ng impormasyon ng query ay nagbibigay-daan din dito na magbakante ng mga mapagkukunan upang ilaan ang mga ito sa iba pang mga koneksyon o iba't ibang layunin. Sa madaling salita, kahit na tila maliit, ipinapayong wakasan ang koneksyon kapag natapos na ang mga operasyon ng kliyente.

Ang isa pang magandang kasanayan kapag tinatapos ang isang koneksyon ng kliyente ay ang alisan ng laman ang na ginagamit ng klase. Upang gawin ito, magagamit ang function flush () dapat tawagan pagkatapos na wakasan ang koneksyon ng kliyente sa huminto ()

Halimbawa ng query sa HTTP GET

Upang mas mahusay na linawin ang lahat ng nasa itaas, isang mas kumpletong halimbawa ng mga kahilingan ang kasama sa ibaba. TCP gamit ang mga kahilingan sa GET gamit ang HTTP protocol. Sa halimbawa, ang mga halaga na nakuha ng mga analog sensor na konektado sa isang Arduino board ay ipinapadala sa isang web server na nag-iimbak ng mga ito sa isang database.

Maaaring Na-miss Mo