Ethernet TCP връзка с Arduino

Ethernet TCP връзка с Arduino

Ethernet TCP връзка с Arduino

От софтуерна гледна точка установяване на връзка Ethernet с Arduino Много е просто. За да направите това, използвайте Ethernet библиотека. Тази библиотека е предназначена за a Ethernet щит който се основава на интегрирания W5100, но има други различни платки или модули и/или които използват други интегрирани, като например ENC28J60. За да се опрости използването му и да се увеличи съвместимостта, други библиотеки използват (почти) същото API че Ethernet библиотека, ще трябва само да замените алтернативната библиотека с оригиналната или да я включите (когато името е различно) на нейно място, дори ако в кода се използват същите (или много подобни) функции. В моя случай използвам UIPEthernet библиотека de Норберт Трухсес следвайки същия процес, който ще опиша в този текст.

Модул ENC28J60 за използване с библиотеката UIPEthernet

1. Дефинирайте Ethernet връзката

Независимо дали ще приемете ролята на клиент като този сървъра, първо трябва да дефинирате връзката с функцията начало () който може да се предава като параметър само MAC адрес и изчакайте сървър DHCP в мрежата присвоете a IP адрес и останалата част от конфигурацията или също е възможно да посочите (по избор) повече параметри, докато бъде дефинирана пълната конфигурация:

  1. Dirección MAC (което вече беше споменато)
  2. IP адрес на щита или модула
  3. IP адрес на сървъра DNS (само един сървър)
  4. IP адрес на Шлюз
  5. Маска на мрежата

Препоръчително е да посочите всички параметри, освен ако тяхното приспадане не е обичайното, за да избегнете неправилна конфигурация (например шлюзът да не е първият адрес на мрежата).

От горното изглежда, че е ясно, че данните, представляващи IP адреси, трябва да се използват доста често, поради което библиотеката включва класа IP адрес от които да се инстанциират IP адресни обекти. Параметрите, които го определят, са четирите байта на адреса IPV4

La MAC адрес Той е дефиниран за тази библиотека като 6-байтов масив. MAC адресът е (предполага се) уникален идентификатор, в който първите байтове показват производителя и модела, а последните показват конкретното устройство. Интегрираният ENC28J60 не включва MAC адрес, освен ако не изберете да закупите и a Интегриран MAC адрес от Microchip (или цял блок ДА на адреси до IEEE ако наборът от устройства е достатъчно голям, за да си заслужава). Когато нямате MAC адрес, можете да си го измислите, като внимавате да не е в конфликт с други в мрежата, където се намира устройството.

Ако конфигурацията се извършва с DHCP сървър вместо "на ръка", функцията localIP() Полезно е да се консултирате с адреса, който сървърът е присвоил на модула. За подновяване на предоставения адрес (ако съответното време е изтекло) на Ethernet библиотека осигурява функцията поддържам () който също ще информира чрез връщане на код, който съответства на статуса на подновяването:

  1. Операцията няма ефект
  2. Грешка при подновяването на IP адреса
    Използването на присвоения IP адрес на същия сървър не може да бъде разширено
  3. IP адресът е подновен успешно
  4. Неуспешно повторно свързване на IP адрес
    Използването на присвоения IP адрес не може да бъде разширено на нито един сървър
  5. IP адресът е преназначен успешно

С информацията, видяна досега, можете да напишете пример за това как ще бъде инициирана Ethernet връзка чрез конфигуриране на IP адреса през DHCP сървър в мрежата. Следният примерен код се опитва да поднови IP адреса на всеки определен период от време и отчита резултата.

Примерът по-долу присвоява IP адреса и останалата част от конфигурацията ръчно с помощта на обекти IP адрес за да бъде по-удобен за четене и (в случай на по-сложен код) за да се избегнат грешки, които могат да възникнат, ако адресът е (не)написан всеки път, когато се използва.

2. Стартирайте връзката в режим клиент или сървър

Когато се инициира връзка в сървърен режим, микроконтролираната система, която се разработва, слуша заявки от други системи. За да стартирате връзката като сървър, използвайте EthernetServer() и портът, на който сървърът ще слуша, е посочен като параметър. EthernetServer() е конструкторът на класа Сървър, който поддържа всички Ethernet операции като сървър. Въпреки че най-ортодоксалното нещо е да се направи извикване на конструктора EthernetServer(), не е необичайно да намерите някои примери, които директно използват класа Сървър или алтернативни библиотеки за Ethernet връзка, които избират да използват тази система за инстанциране.

Връзката като клиент е тази, която прави заявки към сървърната система, която ги изчаква и съответно им отговаря. За да започнете връзка като клиент, използвайте EthernetClient() какъв е конструкторът на класа Удовлетвореност произход на всички Ethernet операции като клиент.

За разлика от това, което се случва със сървърния режим, за който се предполага, че работи от момента, в който класът е инстанциран (въпреки че ще отговаря на клиенти само ако наистина е така), трябва да проверите дали клиентската връзка е готова, преди да я използвате. Клиентският обект, който се създава при стартиране на връзката, може да бъде запитван, за да се види дали е наличен. Например операциите със заявки могат да бъдат включени в структура ако (EthernetClient) да ги изпълнява само когато клиентската връзка е налична.

3. Установете връзка като клиент

Както беше казано, след като връзката е създадена, клиентът е този, който поема инициативата да прави заявките. Сървърът ще изчака тази инициатива и ще отговори по съответния начин. Следователно клиентът е този, който се свързва със сървъра, за да го направим свързване () посочвайки сървъра като параметри (IP адреса или URL) и на порт в този, който слуша.

Въз основа на резултата от операцията функцията ще върне стойностите

  1. (УСПЕХ) Връзката е установена успешно
  2. Установяване на връзката
  3. (ВРЕМЕТО ИЗТЕЧЕ) Времето за изчакване е изтекло, без да бъде установена връзка
  4. (INVALID_SERVER) Сървърът не е намерен или не отговаря правилно
  5. (СЪСЕЧЕН) Връзката беше прекъсната, преди да бъде напълно установена
  6. (INVALID_RESPONSE) Отговорът на сървъра е неправилен

Преди да започнете да правите заявки, е необходимо да проверите дали връзката работи с функцията свързан() това ще се върне вярно ако вече е наличен или фалшив в противен случай.

Примерът по-долу илюстрира връзката като клиент, като проверява на всеки 10 секунди дали има връзка със сървъра (това не е предназначено да бъде нещо продуктивно, само за да покаже синтаксиса на функциите) нещо, което между другото, производство уеб сървърът не би харесал много.

4. Изпратете данни

Подобно на други по-известни класове, като напр Сериен, и със сравнима употреба, класовете Удовлетвореност y Сървър имат функциите

  • пиша(факт) o пиша(буфер, дължина)

    Изпраща информация чрез клиентския или сървърния обект, от който е извикана. Параметърът "данни" е единичен байт o овъглявам докато "буфер" е масив от байт o овъглявам от които се изпраща сума, равна на „дължина". Тази функция е тази, която се използва за двоични операции, в сравнение със следващите две, които обикновено са запазени за изпращане на текст.

  • печат(база данни)

    Изпраща като клиент или сървър (в зависимост от класа, от който се използва) информацията, съответстваща на "данни" като текст. Ако информацията не е изразена като текст (например тя е цяло число), незадължителният параметър "база" може да се използва за избор на преобразуване, което може да бъде една от константите BIN, OCT, DEC или HEX, които показват, съответно. бази, съответстващи на двоична (база 2), осмична (база 8), десетична (база 10) и шестнадесетична (база 16)

  • println(база данни)

    Операцията е идентична с предишната, с изключение на изпращането след информацията, изрично посочена от параметъра "data", връщане на каретка (код 13, който може да бъде представен като \r) и край на ред (код 10, който може да бъде представени от \n) Тези кодове често се споменават съответно с акронима CR (връщане на каретката) и LF (подаване на ред)

Трите предишни функции връщат броя байтове, които са били изпратени, както и еквивалентните функции на класа Сериен; Както беше казано по-горе, операцията е сравнима.

5. Получаване на данни

Както в случая с операциите за изпращане на данни, операциите за получаване са сравними с тези на широко използваните Сериен. Протоколът за получаване също е подобен: проверете дали има (достатъчно) налични данни (на разположение) и в такъв случай ги прочетете


  • на разположение ()

    Връща броя байтове, които са налични за четене. Тази функция присъства и в двата класа Удовлетвореност като Сървър; В първия случай той отчита броя байтове, които сървърът е изпратил в отговор на заявка и които са достъпни за четене от клиента (чета), а във втория случай клиента (обекта), който е извършил операция или false, ако няма такава.

  • Прочети()

    Използва се за четене на получената информация. Тази функция е достъпна само в клас Удовлетвореност. Ако разработваното приложение изпълнява ролята на сървър, за да прочете пристигналата информация, клиентски обект трябва да бъде инстанциран с отговора на функцията на разположение () разгледани в предишния раздел.

Следващият пример е "caps сървър", който слуша на порт 2000 и отговаря на заявки с всичко, което е изпратено само с главни букви, когато е възможно. Може да се тества например с PuTTY или просто с Telnet 2000 Със сигурност не е много практично, целта му е само да покаже как да получи данните, изпратени му от клиент от сървъра.

6. Прекратете връзката

Въпреки че е обичайно сървърното приложение да работи безкрайно, клиентските връзки се установяват, създават връзки и се прекратяват, което позволява ресурсите да бъдат възстановени и използвани в други връзки или предназначени за други употреби на програмата. Функцията Спри се() на класа Удовлетвореност Използва се за прекратяване на клиентска връзка и освобождаване на всички ресурси, които използва.

За сървъра фактът, че клиентът прекъсва връзката, когато информационният обект на заявката е изпратен или получен, също му позволява да освободи ресурси, за да ги разпредели към други връзки или различни цели. Накратко, въпреки че изглежда незначително, препоръчително е да прекратите връзката, когато операциите на клиента приключат.

Друга добра практика при прекратяване на клиентска връзка е да изпразните които класът използва. За да направите това, функцията е налична флъш () трябва да се извика след прекратяване на клиентската връзка с Спри се()

Пример за HTTP GET заявка

За по-добро изясняване на всичко по-горе, по-долу е включен по-пълен пример за заявки. TCP с помощта на GET заявките с помощта на HTTP протокол. В примера стойностите, получени от аналогови сензори, свързани към платка Arduino, се изпращат до уеб сървър, който ги съхранява в база данни.

Публикувай коментар

Може да сте пропуснали