Ethernet TCP з'єднання з Arduino

Ethernet TCP з'єднання з Arduino

Ethernet TCP з'єднання з Arduino

З програмної точки зору встановлення з'єднання Ethernet з Arduino Це дуже просто. Для цього використовуйте Бібліотека Ethernet. Ця бібліотека призначена для a Ethernet Shield яка базується на інтегр W5100, але існують інші різні плати чи модулі та/або які використовують інші інтегровані, наприклад ENC28J60. Щоб спростити його використання та підвищити сумісність, інші бібліотеки використовують (майже) те саме API що Бібліотека Ethernet, вам доведеться лише замінити альтернативну бібліотеку оригінальною або включити її (якщо ім’я інше) на її місці, навіть якщо в коді використовуються ті самі (або дуже схожі) функції. У моєму випадку я використовую Бібліотека UIPEthernet de Норберт Трухсесс слідуючи тому самому процесу, який я збираюся описати в цьому тексті.

Модуль ENC28J60 для використання з бібліотекою UIPEthernet

1. Визначте підключення Ethernet

Чи збираєтеся ви прийняти роль клієнт як і той сервер, перш за все, ви повинні визначити зв'язок із функцією почати () який можна передати як параметр лише MAC-адреса і дочекатися сервера DHCP у мережі призначити a IP-адреса та решту конфігурації або також можна вказати (необов’язково) більше параметрів, поки не буде визначена повна конфігурація:

  1. Директорія 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-сервера, а не «вручну», функція локальний IP() Корисно переглянути адресу, яку сервер призначив модулю. Відновити присвоєну адресу (якщо відповідний час минув) Бібліотека 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. Встановіть підключення як клієнт

Як було сказано, щойно з’єднання створено, саме клієнт бере на себе ініціативу надсилати запити. Сервер чекатиме цієї ініціативи та відповідним чином відповість. Отже, для цього ми використовуємо клієнт, який підключається до сервера connect () із зазначенням сервера як параметрів (IP-адреса або URL) та порт в тому, хто слухає.

На основі результату операції функція поверне значення

  1. (SUCCESS) Підключення успішно встановлено
  2. Встановлення з'єднання
  3. (ТАЙМ-АУТ) Минув час очікування без встановлення з’єднання
  4. (INVALID_SERVER) Сервер не знайдено або не відповідає належним чином
  5. (ВСИЧЕНИЙ) З’єднання було розірвано до повного встановлення
  6. (INVALID_RESPONSE) Відповідь сервера неправильна

Перш ніж почати робити запити, необхідно перевірити, чи працює з’єднання з функцією підключений() що повернеться правда якщо він уже доступний або false інакше.

Наведений нижче приклад ілюструє з’єднання як клієнта, перевіряючи кожні 10 секунд, чи є з’єднання з сервером (це не має на меті бути чимось продуктивним, просто щоб показати синтаксис функцій) те, що, до речі, виробництво веб-сервер не дуже хотів би.

4. Надіслати дані

Як і інші більш відомі класи, такі як Послідовний, а за порівнянного використання — класи Клієнт y сервер мають функції

  • запис(факт) o запис(буфер, довжина)

    Надсилає інформацію за допомогою об’єкта клієнта або сервера, з якого вона викликається. Параметр "data" є єдиним байт o бак тоді як "буфер" - це масив байт o бак з яких надсилається кількість, що дорівнює «довжині».Ця функція використовується для бінарних операцій, порівняно з наступними двома, які зазвичай зарезервовані для надсилання тексту.

  • друк(дані, база)

    Надсилає клієнту або серверу (залежно від класу, з якого він використовується) інформацію, що відповідає "даним", як текст. Якщо інформація не виражена у вигляді тексту (наприклад, це ціле число), необов’язковий параметр «база» може бути використаний для вибору перетворення, яке може бути однією з констант BIN, OCT, DEC або HEX, які вказують відповідно. основи, що відповідають двійковій (основа 2), вісімковій (основа 8), десятковій (основа 10) і шістнадцятковій системі (основа 16)

  • println(дані, база)

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

Три попередні функції повертають кількість надісланих байтів, як і еквівалентні функції класу Послідовний; Як було сказано вище, операція порівнянна.

5. Отримувати дані

Як і у випадку операцій надсилання даних, операції отримання можна порівняти з операціями широкого використання Послідовний. Протокол отримання також схожий: перевірте, чи є (достатньо) доступних даних (доступний) і в такому випадку прочитайте їх


  • доступний ()

    Повертає кількість байтів, доступних для читання. Ця функція присутня в обох класах Клієнт як сервер; У першому випадку він повідомляє кількість байтів, які сервер надіслав у відповідь на запит і які доступні для читання клієнтом (зчитування), а в другому випадку клієнт (об’єкт), який виконав операцію, або false, якщо її немає.

  • читати ()

    Він використовується для зчитування отриманої інформації. Ця функція доступна лише в класі Клієнт. Якщо програма, що розробляється, виконує роль сервера, для читання інформації, що надійшла, клієнтський об’єкт повинен бути створений з відповіддю функції доступний () розглянуто в попередньому розділі.

У наступному прикладі наведено «сервер великих літер», який прослуховує порт 2000 і відповідає на запити тим, що було надіслано великими літерами, коли це можливо. Його можна перевірити, наприклад, з PuTTY або просто з telnet 2000 Це, звичайно, не дуже практично, його мета - лише показати, як отримати дані, надіслані йому клієнтом із сервера.

6. Завершіть з'єднання

Хоча серверна програма зазвичай працює нескінченно довго, клієнтські з’єднання встановлюються, створюють з’єднання та припиняються, дозволяючи ресурси відновлювати та використовувати в інших з’єднаннях або виділяти для інших цілей програми. Функція Стоп() класу Клієнт Він використовується для припинення підключення клієнта та звільнення будь-яких ресурсів, які він використовує.

Для сервера той факт, що клієнт розриває з’єднання, коли інформаційний об’єкт запиту було надіслано або отримано, також дозволяє йому звільнити ресурси для розподілу їх для інших з’єднань або інших цілей. Коротше кажучи, хоча це здається незначним, доцільно розірвати з’єднання після завершення операцій клієнта.

Ще одна хороша практика під час припинення з’єднання клієнта – очистити які використовує клас. Для цього доступна функція змити () слід викликати після завершення з'єднання клієнта з Стоп()

Приклад запиту HTTP GET

Щоб краще прояснити все вищесказане, нижче наведено більш повний приклад запитів. TCP за допомогою запитів GET за допомогою протокол HTTP. У прикладі значення, отримані аналоговими датчиками, підключеними до плати Arduino, надсилаються на веб-сервер, який зберігає їх у базі даних.

Дати коментар

Можливо, ви пропустили