TCP-соединение Ethernet с Arduino

TCP-соединение Ethernet с Arduino

TCP-соединение Ethernet с Arduino

С программной точки зрения установление соединения Ethernet con Arduino Это очень просто. Для этого используйте Ethernet-библиотека. Эта библиотека предназначена для Ethernet-экран который основан на интегрированном W5100, но существуют и другие платы или модули и/или которые используют другие интегрированные платы, например ENC28J60. Чтобы упростить его использование и повысить совместимость, другие библиотеки используют (почти) то же самое. API что Ethernet-библиотека, вам останется только заменить альтернативную библиотеку на оригинальную или включить ее (когда имя другое) на ее место, даже если в коде используются такие же (или очень похожие) функции. В моем случае я использую UIPEthernet-библиотека de Норберт Тручссесс следуя тому же процессу, который я собираюсь описать в этом тексте.

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

1. Определите соединение Ethernet

Собираетесь ли вы взять на себя роль клиент такой как сервер, прежде всего вам нужно определить связь с функцией начинать () который можно передать в качестве параметра только MAC-адрес и дождаться сервера DHCP в сети назначить IP-адрес и остальную часть конфигурации или также можно указать (опционально) дополнительные параметры, пока не будет определена полная конфигурация:

  1. MAC-адрес (о чем уже говорилось)
  2. IP-адрес щита или модуля
  3. IP-адрес сервера DNS (только один сервер)
  4. IP-адрес шлюз
  5. Сетевая маска

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

Из вышесказанного кажется понятным, что данные, представляющие IP-адреса, должны использоваться довольно часто, поэтому в библиотеку включен класс Айпи адрес из которого можно создавать экземпляры объектов IP-адреса. Параметры, которые его определяют, — это четыре байта адреса. IPV4

La MAC-адрес Для этой библиотеки он определен как 6-байтовый массив. MAC-адрес — это (должен быть) уникальный идентификатор, в котором первые байты указывают производителя и модель, а последние — конкретное устройство. Интегрированный ENC28J60 не включает MAC-адрес, если вы не решите также приобрести Встроенный MAC-адрес от Microchip (или целый квартал да обращений к IEEE если пробег устройств достаточно велик, чтобы оно того стоило). Если у вас нет MAC-адреса, вы можете придумать его, позаботившись о том, чтобы он не конфликтовал с другими в сети, где находится устройство.

Если настройка выполняется с помощью DHCP-сервера, а не «вручную», функция локальныйIP() Полезно просмотреть адрес, который сервер назначил модулю. Для продления присвоенного адреса (если соответствующее время истекло) Ethernet-библиотека предоставляет функцию поддерживать() который также проинформирует, вернув код, соответствующий статусу продления:

  1. Операция не дала результата
  2. Ошибка обновления IP-адреса
    Использование назначенного IP-адреса на том же сервере не может быть продлено.
  3. IP-адрес успешно обновлен
  4. Перепривязка IP-адреса не удалась
    Использование назначенного IP-адреса не может быть расширено ни на одном сервере.
  5. IP-адрес успешно переназначен

Используя информацию, полученную на данный момент, вы можете написать пример того, как будет инициироваться соединение Ethernet путем настройки IP-адреса через DHCP-сервер в сети. Следующий пример кода пытается обновить IP-адрес каждый определенный период времени и сообщает результат.

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

2. Запустите соединение в режиме клиента или сервера.

При инициировании соединения в режиме сервера разрабатываемая микроуправляемая система слушает запросы от других систем. Чтобы начать соединение в качестве сервера, используйте EthernetСервер() и в качестве параметра указывается порт, который будет слушать сервер. EthernetСервер() является конструктором класса сервер, который поддерживает все операции Ethernet в качестве сервера. Хотя самое ортодоксальное — сделать вызов конструктора EthernetСервер(), нередко можно найти примеры, которые напрямую используют класс сервер или альтернативные библиотеки для подключения Ethernet, которые решили использовать эту систему создания экземпляров.

Соединение в качестве клиента — это соединение, которое отправляет запросы серверной системе, которая ожидает их и отвечает на них соответствующим образом. Чтобы инициировать соединение в качестве клиента, используйте EthernetКлиент() что такое конструктор класса "Клиент" происхождение всех операций Ethernet в качестве клиента.

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

3. Установите соединение в качестве клиента.

Как уже было сказано, как только соединение установлено, именно клиент берет на себя инициативу по выполнению запросов. Сервер будет ждать этой инициативы и ответит соответствующим образом. Таким образом, клиент подключается к серверу, для этого мы используем подключить () указывая сервер в качестве параметров (IP-адрес или URL) И порт в том, кто слушает.

По результату операции функция вернет значения

  1. (УСПЕХ) Соединение успешно установлено.
  2. Установление соединения
  3. (ВРЕМЯ ВЫШЛО) Тайм-аут истек, соединение не установлено.
  4. (INVALID_SERVER) Сервер не найден или отвечает некорректно
  5. (ОБРЕЗАННЫЙ) Соединение было разорвано до полного установления
  6. (INVALID_RESPONSE) Ответ сервера неверен

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

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

4. Отправить данные

Как и другие более известные классы, такие как Последовательный, и при сопоставимом использовании классы "Клиент" y сервер иметь функции

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

    Отправляет информацию, используя объект клиента или сервера, из которого она вызывается. Параметр «данные» является единственным байт o колесница в то время как «буфер» представляет собой массив байт o колесница из которых отправляется сумма, равная «длине». Эта функция используется для двоичных операций, по сравнению со следующими двумя, которые обычно зарезервированы для отправки текста.

  • Распечатать(база данных)

    Отправляет клиенту или серверу (в зависимости от класса, из которого он используется) информацию, соответствующую «данным», в виде текста. Если информация не выражена в виде текста (например, это целое число), можно использовать дополнительный параметр «base», с помощью которого можно выбрать преобразование, которое может быть одной из констант BIN, OCT, DEC или HEX, обозначающих соответственно системы счисления, соответствующие двоичной (основание 2), восьмеричной (основание 8), десятичной (основание 10) и шестнадцатеричной (основание 16) системе счисления.

  • Println(база данных)

    Операция идентична предыдущей, за исключением отправки после информации, явно указанной параметром «data», возврата каретки (код 13, который может быть представлен как \r) и конца строки (код 10, который может быть представлен как \r). представлены \n) Эти коды часто обозначаются соответственно аббревиатурой CR (возврат каретки) и НЧ (перевод строки)

Три предыдущие функции возвращают количество отправленных байтов, как и эквивалентные функции класса Последовательный; Как было сказано выше, операция сопоставима.

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

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


  • имеется в наличии ()

    Возвращает количество байтов, доступных для чтения. Эта функция присутствует в обоих классах "Клиент" в качестве сервер; В первом случае он сообщает количество байтов, отправленных сервером в ответ на запрос и доступных для чтения клиенту (читать), а во втором случае клиент (объект), выполнивший операцию, или false, если таковой нет.

  • читать()

    Он используется для чтения полученной информации. Эта функция доступна только в классе "Клиент". Если разрабатываемое приложение выполняет роль сервера, то для чтения поступившей информации необходимо создать экземпляр клиентского объекта с ответом функции имеется в наличии () обсуждалось в предыдущем разделе.

Следующий пример представляет собой «caps-сервер», который прослушивает порт 2000 и по возможности отвечает на запросы всем, что было отправлено, с использованием всех заглавных букв. Это можно проверить, например, с помощью PuTTY или просто с Telnet 2000 Он, конечно, не очень практичен, его цель — лишь показать, как получить данные, отправленные ему клиентом, с сервера.

6. Завершите соединение

Хотя обычно серверное приложение функционирует неопределенно долго, клиентские соединения устанавливаются, устанавливают соединения и завершаются, что позволяет восстановить ресурсы и использовать их в других соединениях или выделить для других целей программы. Функция стоп() класса "Клиент" Он используется для разрыва клиентского соединения и освобождения любых используемых им ресурсов.

Для сервера тот факт, что клиент разрывает соединение, когда информационный объект запроса был отправлен или получен, также позволяет ему освободить ресурсы для распределения их для других соединений или других целей. Короче говоря, хотя это и кажется мелочью, желательно разорвать соединение, когда операции клиента завершатся.

Еще одна хорошая практика при разрыве клиентского соединения — очистить который использует класс. Для этого доступна функция румянец() следует вызывать после разрыва клиентского соединения с помощью стоп()

Пример запроса HTTP GET

Чтобы лучше прояснить все вышесказанное, ниже приведен более полный пример запросов. TCP используя запросы GET, используя HTTP-протокол. В примере значения, полученные аналоговыми датчиками, подключенными к плате Arduino, отправляются на веб-сервер, который сохраняет их в базе данных.

Оставить комментарий

Вы могли пропустить