Arduino ethernet как задать localport порт клиента
Перейти к содержимому

Arduino ethernet как задать localport порт клиента

  • автор:

Программирование Arduino — библиотека Ethernet

Ethernet-шилд – это дополнительная плата, которая подключается к ардуино и позволяет этой замечательной плате посылать и получать данные через локальную сеть и даже работать с Интернетом.

Работа с протоколами TCP/IP в шилде реализована аппаратно на микросхеме W5100.

Для работы с данным шилдом ничего дополнительно скачивать не нужно, т.к. в составе Arduino IDE уже есть удобная библиотека (\libraries\Ethernet\).

Библиотека содержит три класса: EthernetClass ,Client и Server.

Чтобы начать работать с библиотекой – её нужно сначала подключить; для этого можно написать

#include

или выбрать в меню Arduino IDE:
Sketch – Import Library… — Ethernet
и в Ваш скетч автоматически добавятся строчки:

#include #include #include

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

Первым делом необходимо инициализировать работу с библиотекой функцией begin, которая принимает от двух до четырёх параметров:

void begin(uint8_t *, uint8_t *);

Описание:
Инициализирует работу с библиотекой Ethernet и устанавливает сетевые настройки.

Ethernet.begin(mac, ip); Ethernet.begin(mac, ip, gateway); Ethernet.begin(mac, ip, gateway, subnet);

Параметры:
mac — MAC-адрес — физический адрес устройства (массив из 6 байт)
ip — IP-адрес – сетевой адрес Вашего устройства (массив из 4 байт)
gateway – IP-адрес Вашего сетевого шлюза (массив из 4 байт) (по-умолчанию – IP-адрес устройства с 1 в последнем октете)
subnet – маска подсети. (массив из 4 байт) (по-умолчанию 255.255.255.0)

если Вы не помните свои сетевые параметры, то на компьютере под управлением ОС Windows их можно посмотреть через
Пуск – Панель управления – Сетевые подключения
Щёлкнуть правой кнопкой мышки на «Подключение по локальной сети» и выбрать «Свойства»
В появившемся окошке выделить в списке «Протокол Интернета TCP/IP» и нажать кнопку «Свойства»

или же просто набрать в консоли команду

ipconfig /all

Возвращаемое значение:
ничего

#include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; byte ip[] = < 10, 0, 0, 177 >; void setup()

Как уже отметили – библиотека позволяет работать в двух режимах – серверном или клиентском.

Рассмотрим серверные функции.

Server(uint16_t);

Описание:
Это конструктор класса Server – при вызове данной функции создаётся объект типа Server, для обработки входящих подключений по указанному порту.

Server(port);

Параметры:
port: номер порта сервера (int)

Возвращаемое значение:
ничего

#include // задаём сетевую конфигурацию (шлюз и маска подсети – не обязательно) byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; byte ip[] = < 10, 0, 0, 177 >; byte gateway[] = < 10, 0, 0, 1 >; byte subnet[] = < 255, 255, 0, 0 >; // telnet на стандартном порту 23 Server server = Server(23); void setup() < // инициализация Ethernet-модуля Ethernet.begin(mac, ip, gateway, subnet); // запускаем сервер server.begin(); >void loop() < Client client = server.available(); if (client) < server.write(client.read()); >>

Описание:
Запускает сервер на приём входящих соединений.

server.begin();

Возвращаемое значение:
ничего

#include // задаём сетевую конфигурацию (шлюз и маска подсети – не обязательно) byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; byte ip[] = < 10, 0, 0, 177 >; byte gateway[] = < 10, 0, 0, 1 >; byte subnet[] = < 255, 255, 0, 0 >; // telnet на стандартном порту 23 Server server = Server(23); void setup() < // инициализация Ethernet-модуля Ethernet.begin(mac, ip, gateway, subnet); // запускаем сервер server.begin(); >

Client available();

Описание:
Возвращает объект типа Client , который представляет клиентское подключение к серверу и имеет данные для считывания (запрос). Объект сохраняется при выходе из области видимости; его можно закрыть вызовом client.stop().

server.available();

Возвращаемое значение:
ничего

void loop() < Client client = server.available(); if (client) < server.write(client.read()); >>

virtual void write(uint8_t);
virtual void write(const char *str);
virtual void write(const uint8_t *buf, size_t size);

Описание:
Запись данных для передачи подключенному клиенту.

server.write(data);

Параметры:
data – байт или строка символов

Возвращаемое значение:
ничего

void loop() < Client client = server.available(); if (client) < server.write(client.read()); >>

Т.к. класс Server наследуется от класса Print возможен так же вызов функций
print()
println()

Печатает данные для всех подключённых клиентов. Числа печатаются, как последовательность цифр, в виде ASCII-символов (например, число 123 будет передано как три символа: ‘1’, ‘2’, ‘3’).
Функции println печатают данные с последующим переводом на новую строчку.

server.print(data); server.print(data, BASE); server.println(); server.println(data); server.println(data, BASE);

Параметры:
data – данные для печати (char, byte, int, long или строка)

BASE (опционально): основание представления числа: BIN -двоичное (основание 2), DEC десятичное (основание 10), OCT — восьмеричное (основание 8), HEX — шестнадцатеричное(основание 16).

Теперь рассмотрим клиентские функции.

Client(uint8_t);
Client(uint8_t *, uint16_t);

Описание:
Это конструктор класса Client – при вызове данной функции создаётся объект типа Client , который может подключаться к указанному IP-адресу и порту.

Client(ip, port);

Параметры:
ip: IP-адрес к которому клиент должен подключиться (массив из 4 байт)
port: номер порта для поключения (int)

#include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; byte ip[] = < 10, 0, 0, 177 >; byte server[] = < 64, 233, 187, 99 >; // Google Client client(server, 80); void setup() < Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting. "); if (client.connect()) < Serial.println("connected"); client.println("GET /search?q=arduino HTTP/1.0"); client.println(); >else < Serial.println("connection failed"); >> void loop() < if (client.available()) < char c = client.read(); Serial.print( c ); >if (!client.connected()) < Serial.println(); Serial.println("disconnecting."); client.stop(); for(;;) ; >>

uint8_t connected();

Описание:
Определяет есть ли подключение к серверу.
! Клиент считается подключённым, если подключение уже закрыто, но остались несчитанные данные.

client.connected();

Возвращаемое значение:
true – если клиент подключен и false в противном случае.

void loop() < if (client.available()) < char c = client.read(); Serial.print( c ); >if (!client.connected()) < Serial.println(); Serial.println("disconnecting."); client.stop(); for(;;) ; >>

uint8_t connect();

Описание:
Подключается к IP-адресу и порту, заданному через конструктор.

client.connect();

Возвращаемое значение:
ничего

Пример:
true – если подключиться удалось и false в противном случае.

void setup() < Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting. "); if (client.connect()) < Serial.println("connected"); client.println("GET /search?q=arduino HTTP/1.0"); client.println(); >else < Serial.println("connection failed"); >>

virtual void write(uint8_t);
virtual void write(const char *str);
virtual void write(const uint8_t *buf, size_t size);

Описание:
Запись данных для передачи к подключенному серверу.

client.write(data);

Параметры:
data – байт или строка символов

Возвращаемое значение:
ничего

Как и класс Server – класс Client наследуется от класса Print и так же возможен вызов функций
print()
println()

Печатает данные для сервера, к которому подключён клиент. Числа печатаются, как последовательность цифр, в виде ASCII-символов (например, число 123 будет передано как три символа: ‘1’, ‘2’, ‘3’).
Функции println печатают данные с последующим переводом на новую строчку.

server.print(data); server.print(data, BASE); server.println(); server.println(data); server.println(data, BASE);

Параметры:
data – данные для печати (char, byte, int, long или строка)

BASE (опционально): основание представления числа: BIN -двоичное (основание 2), DEC десятичное (основание 10), OCT — восьмеричное (основание 8), HEX — шестнадцатеричное(основание 16).

void setup() < Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting. "); if (client.connect()) < Serial.println("connected"); client.println("GET /search?q=arduino HTTP/1.0"); client.println(); >else < Serial.println("connection failed"); >>

int available();

Описание:
Возвращает количество байт, доступных для чтения (т.е. объем данных, которые были переданы клиенту со стороны сервера).

client.available();

Возвращаемое значение:
Количество доступных байт (int).

void loop() < if (client.available()) < char c = client.read(); Serial.print( c ); >>

Описание:
Считывает следующий байт, полученный клиентом от сервера (после последнего вызова read())

client.read();

Возвращаемое значение:
Байт (или символ) или -1 если данные отсутствуют.

void loop() < if (client.available()) < char c = client.read(); Serial.print( c ); >>

Описание:
Очищает данные, которые были получены клиентом, но еще не были им прочитаны.

client.flush();

Возвращаемое значение:
Ничего

Описание:
Отключение от сервера.

client.stop();

Возвращаемое значение:
ничего

Ethernet Shield hr91105a (w5100) . Урок 16. Ардуино

Ethernet Shield и электромагнитное реле

Привет! Пришло время подключить Ардуино к интернету. Одно из самых интересных направлений использования Ардуино — это интернет вещей. А управление устройствами на Ардуино через интернет, пожалуй, самое востребованное направление на сегодня. Поэтому сегодня поговорим о дополнительной плате для подключения Ардуино к интернету, об Ethernet Shield.

В предыдущем уроке мы говорили о bluetooth модуле и электромагнитном реле. Это тоже часть проектов на Ардуино, которые помогают в интернете вещей и беспроводной передаче информации от Ардуино к приложениям в телефоне или компьютере. Поэтому, посмотрите его, если пропустили или уже забыли.

А сегодня мы повторим предыдущий урок, но вместо bluetooth модуля используем подключение через ethernet. Напишем сервер, к которому можно будет подключиться из браузера. И простую веб страницу, на которой можно будет зажигать свет.

Для того, чтобы выполнить этот урок нам понадобиться

  • Ардуино UNO
  • Макетная плата
  • Перемычки
  • Ethernet Shield
  • Реле SRD-05VDC-SL-C
  • Лампа на 220 вольт и патрон к ней
  • Ethernet провод
  • Кабель USB

Об электромагнитном реле мы в прошлый раз мы говорили более подробно. В этом плане сегодняшний проект не измениться. Нам нужно получить на Ардуино управляющий сигнал. И в зависимости от него, включить или выключить реле.

Управляющий сигнал будем получать от платы расширения Ethernet shield и веб страницы, которая будет генерироваться внутри кода. Когда пользователь нажмет на кнопку, чтобы включить свет, сервер получит данные и использует, для управления реле.

Ethernet Shield

В нашем распоряжении оказался ethernet shield hanrun hr91105a или w5100. Он имеет форм фактор для подключения к плате Ардуино Uno.

Он предоставляет доступ к TCP и UDP стекам. А библиотека для работы с ethernet shield позволяет быстро подключить устройство и настроить скетч.

Контакты сверху платы позволяют подключать дополнительные устройства и использовать контакты Ардуино как обычно.

Имейте в виду, при подключении платы, пины 4, 10, 11, 12 и 13 используются для взаимодействия платы с Ардуино. Использовать их для других устройств уже нельзя.

Так же на плате есть слот для карты micro-SD. С его помощью можно сохранять необходимую информацию на карту памяти. Или загружать на нее веб страницы. Памяти внутри Ардуино хватит только на небольшую страницу с парой кнопок.

На плате расширения есть несколько индикаторных светодиодов

  • PWR: показывает, что платы подключены к питанию
  • LINK: показывает, подключение к сетевому устройству и мигает когда плата получает или отправляет данные
  • FULLD: показывает, что интернет соединение full duplex
  • 100M: показывает, что скорость соединения поддерживает 100 Mb/s (а не 10 Mb/s)
  • RX: мигает, когда плата получает данные
  • TX: мигает, когда плата отправляет данные
  • COLL: мигает, когда обнаружены интернет коллизии

Принципиальная схема

Подключим Ethernet shield к материнской плате Ардуино. А электромагнитное реле уже к плате расширения. Используем питание 5 вольт и землю. А для управление реле возьмем 7 цифровой пин.

Принципиальная схема подключения Ethernet shield и реле

Программа

Смысл проекта такой же как и с bluetooth. Плата должна получить от нас сигнал и установить реле в нужное состояние. Тогда подключенное к реле оборудование включится или выключится соответственно.

Используем пример из библиотеки Ethernet.

Откроем скетч из Меню File -> Examples -> Ethernet -> WebServer

Здесь используются библиотеки и

Вы можете задать mac адрес и ip адрес для вашей платы. Ip адрес должен подходить для вашей локальной сети. HTTP сервер будет работать на 80 порту как обычно. А реле подключим к 7 пину.

// Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; IPAddress ip(192, 168, 0, 177); EthernetServer server(80); int RelayPin = 7; 

В функции setup() настраиваем все необходимые функции для работы через интернет. И раскомментируем строку Ethernet.init(10);

 // You can use Ethernet.init(pin) to configure the CS pin Ethernet.init(10); // Most Arduino shields

Настроим пин для реле на вывод и выключим его.

 // start the server server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); pinMode(RelayPin, OUTPUT); digitalWrite(RelayPin, 0);

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

void loop() < // listen for incoming clients EthernetClient client = server.available(); if (client) < Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; String readString = ""; while (client.connected()) < if (client.available()) < char c = client.read(); readString += c;

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

 //Serial.write(c); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) < readString.replace("http://192.168.0.177/LightOff?", "refferer"); readString.replace("http://192.168.0.177/LightOn?", "refferer"); Serial.println(readString);

Теперь мы можемиспользовать информацию о состоянии реле и сформировать нужную веб страницу для пользователя.

 // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); client.println(""); client.println(""); // output the value of each analog input pin if(readString.indexOf("LightOn") > 0) < digitalWrite(RelayPin, 1); >else < digitalWrite(RelayPin, 0); >int Relay = digitalRead(RelayPin); String ButtonText = ""; String ButtonLink = ""; if( Relay ) < ButtonText = " LightOff "; ButtonLink = "/LightOff"; >else < ButtonText = " LightOn "; ButtonLink = "/LightOn"; >client.print("

Relay is "); client.print(Relay); client.println("


"); client.print("
"); client.println("
"); break;

В итоге получим кнопку со ссылкой на включение реле, если реле выключено. И наоборот, на выключение, если свет включен в настоящий момент.

Полный текст программы

#include #include // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; IPAddress ip(192, 168, 0, 177); // Initialize the Ethernet server library // with the IP address and port you want to use // (port 80 is default for HTTP): EthernetServer server(80); int RelayPin = 7; void setup() < // You can use Ethernet.init(pin) to configure the CS pin Ethernet.init(10); // Most Arduino shields //Ethernet.init(5); // MKR ETH shield //Ethernet.init(0); // Teensy 2.0 //Ethernet.init(20); // Teensy++ 2.0 //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) < ; // wait for serial port to connect. Needed for native USB port only >Serial.println("Ethernet WebServer Example"); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); // Check for Ethernet hardware present if (Ethernet.hardwareStatus() == EthernetNoHardware) < Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :("); while (true) < delay(1); // do nothing, no point running without Ethernet hardware >> if (Ethernet.linkStatus() == LinkOFF) < Serial.println("Ethernet cable is not connected."); >// start the server server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); pinMode(RelayPin, OUTPUT); digitalWrite(RelayPin, 0); > void loop() < // listen for incoming clients EthernetClient client = server.available(); if (client) < Serial.println("new client"); // an http request ends with a blank line boolean currentLineIsBlank = true; String readString = ""; while (client.connected()) < if (client.available()) < char c = client.read(); readString += c; //Serial.write(c); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) < readString.replace("http://192.168.0.177/LightOff?", "refferer"); readString.replace("http://192.168.0.177/LightOn?", "refferer"); Serial.println(readString); // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); // the connection will be closed after completion of the response client.println(); client.println(""); client.println(""); // output the value of each analog input pin if(readString.indexOf("LightOn") > 0) < digitalWrite(RelayPin, 1); >else < digitalWrite(RelayPin, 0); >int Relay = digitalRead(RelayPin); String ButtonText = ""; String ButtonLink = ""; if( Relay ) < ButtonText = " LightOff "; ButtonLink = "/LightOff"; >else < ButtonText = " LightOn "; ButtonLink = "/LightOn"; >client.print("

Relay is "); client.print(Relay); client.println("


"); client.print("
"); client.println("
"); break; > if (c == '\n') < // you're starting a new line currentLineIsBlank = true; >else if (c != '\r') < // you've gotten a character on the current line currentLineIsBlank = false; >> > // give the web browser time to receive the data delay(1); // close the connection: client.stop(); Serial.println("client disconnected"); > >

Если все настроено правильно, то зайдя по адресу указанному в настройках IPAddress ip(192, 168, 0, 177) мы увидим веб страницу.

И нажав на кнопку мы сможем управлять реле, соединенным с платой Ардуино.

Web страница на Ардуино

Заключение

Мы использовали Ethernet shield для Ардуино, чтобы подключить устройство к интернету. И настроили управление светом через веб страницу сгенерированную на Ардуино.

Естественно, вы можете использовать такую схему для управления любыми устройствами. А использование электромагнитного реле дает возможность включать и выключать электрические приборы с любой нагрузкой.

Подключение Arduino к Интернету: настройка режима клиент-сервер, обработка GET и POST запросов

Предисловие Здравствуй уважаемый читатель, если ты набрел на эту статью, то скорее всего тебя интересует вопрос организации связи устройства на базе Ардуино со Всемирной сетью. В данной статье подробно рассматриваются вопросы настройки устройства на базе Ардуино в качестве клиента и сервера, генерирование HTML-страницы, основные способы обработки POST и GET запросов средствами Ардуино и многое другое. Доступ к Интернету – очень сложная тема, можно написать целые тома книг о лучшем способе подключения Ардуино к Интернету. В этой статье мы рассмотрим использование платы расширения Arduino Ethernet Shield для создания веб-страницы и отправки данных в Сеть. Объяснить в одной статье, как работает Всемирная паутина, – слишком амбициозная затея, поэтому я ограничусь лишь описанием технологий, с которыми вам в процессе работы придется сталкиваться. Введение С долей иронии вспоминаю свои первые попытки поднять сервер на Ардуино, изнурительное блуждание по Всемирной паутине с целью найти пример обработки GET и POST данных, к сожалению, на тот момент до многих вещей приходилось доходить методом проб и ошибок. Данная статья должна избавить вас от типичных ошибок, с которыми сталкиваются разработчики при работе в сети с помощью Aрдуино. Статья рассчитана в первую очередь на новичков, однако и бывалые разработчики найдут в ней много интересного. Все листинги программ, приведенные в данной статье, написаны для Arduino UNO R3 и Ethernet Shield 2. Пользователи, которые имели дело с Ардуино уно, знают, что сама по себе плата работать с сетью не может, так как на ней попросту отсутствуют аппаратные для этого средства, однако, благодаря модульной структуре платформы, мы можем использовать дополнительные платы расширения возможностей. Одной из таких плат является Ethenet Shield 2, позволяющая выступать Ардуино в виде полноценного сетевого устройства: общаться с аналогичными устройствами, с персональными компьютерами, принтерами и тд. Как сказано в даташите, плата построена на чипе Wiznet W5500 и поддерживает протоколы TCP/UDP и до восьми открытых соединений. Забегая вперед, скажу, если в вашем проекте планируется, что устройство должно обрабатывать запросы от нескольких хостов одновременно, то можете сразу забыть про Ардуино. Для этого данная платформа никак не подходит, и лучшим вариантом будет использовать платформу, специально созданную для этих целей и имеющую достаточно ресурсов. Для работы с данной платой никаких сторонних библиотек устанавливать не нужно, т.к. необходимая библиотека уже содержится в ArduinoIDE. Данная библиотека позволяет использовать Ардуино как в качестве клиента, так и в качестве сервера. Отходя от темы Ардуино, скажу, что в большинстве случаев одни устройства в сети выступают в качестве клиентов, другие – в качестве серверов, иные варианты нас попросту не интересуют. Взаимодействие между сервером и клиентом осуществляется с помощью HTTP-запросов. Клиентское приложение формирует запрос и отправляет его на сервер, после чего серверное программное обеспечение обрабатывает данный запрос, формирует ответ и передаёт его обратно клиенту. После этого клиентское приложение может продолжить отправлять другие запросы, которые будут обработаны аналогичным образом. Рассмотрим такой пример, в один из прекрасных дней вам захотелось почитать что-нибудь интересное на сайте хабр. Для этого вы открываете браузер и набираете в адресной строке habrahabr.ru. После чего ваш браузер посылает запрос на то, чтобы сервер сайта Хабрахабр предоставил вам HTML-страницу. Сразу хочу заметить, что сам по себе сервер никому и никогда ничто не отправит, его для этого должен попросить клиент (браузер). Самый простой запрос, который можно будет отправить, будет иметь следующий вид:

GET / HTTP/1.1 Host: habrahabr.ru

И примерно такой мы получим ответ, когда сервер обработает наш запрос:

HTTP/1.1 200 OK Connection:"keep-alive" Content-Type:"text/html; charset=UTF-8" Date:"Sun, 06 Dec 2015 19:34:28 GMT" Keep-Alive:"timeout=15" Server:"QRATOR" Transfer-Encoding:"chunked" X-Content-Type-Options:"nosniff" X-Engine:"engine-slave" X-Frame-Options:"SAMEORIGIN, SAMEORIGIN" x-powered-by:"PHP/5.5.11"

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

  • Client
  • EthernetClient()
  • if (EthernetClient)
  • connected()
  • connect()
  • write()
  • print()
  • println()
  • available()
  • read()
  • flush()
  • stop()

Прежде чем приступить к непосредственному программированию, хотелось бы пару слов сказать об IP-адресах. Определение «IP – маршрутизируемый протокол сетевого уровня стека …», на мой взгляд, довольно трудное для восприятия человеку, не имеющего опыта работы с ним. Проводя аналогию, можно сказать, что IP – это своеобразный адрес в сети, такой же как почтовый индекс или телефонный номер. Как мы с вами знаем, одинаковых почтовых индексов и телефонных номеров не существует, это же распространяется и на IP-адреса. Сетевые адреса имеют все устройства, подключенные к сети. Как и за телефонные номера (ресурс нумерации), за IP-адреса тоже приходится платить (прим. В большинстве случаев нам предоставляется временный IP-адрес, плата за который не взимается).

Если вы используете домашний роутер, то с большой вероятностью, диапазон ваших IP-адресов равен 192.168.0.N, где N может быть от 1 до 254. Помимо этого, стоит знать также маску подсети, чтобы точно можно было определить, находится рассматриваемый нами IP-адрес в данной сети или нет. Понимаю, что довольно трудно понять суть вещей, о которых не имеешь представления. По большей части нам эти знания и не понадобятся, а тем, кто желает узнать больше об IP и сабнетинге, стоит почитать пару статей на хабре.

Узнать сетевые параметры вы можете через командную строку, введя в нее команду ipconfig. Все эти данные нужны для того, чтобы выбрать свободный ip-адрес для Arduino. Мой вам совет, задайте IP-адрес Ардуино в диапазоне от 192.168.0.100-192.168.0.200, при маске подсети 255.255.255.0. Сильно не пугайтесь выше изложенной информации, так как на практике я еще ни разу не сталкивался с тем, чтобы в домашней сети какие-либо устройства не могли поделить между собой IP-адрес.

Теперь, когда мы разобрались, что такое IP-адрес, переходим непосредственно программированию. В данном разделе мы создадим простой HTTP-запрос и отправим его на сервер сайта www.timeapi.org (онлайн время) с целью получить точное время по Гринвичу. Полученный ответ мы выведем через serial-порт на экран нашего компьютера.

Загрузим в память Ардуино следующий скетч:

#include #include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; char server[] = "www.timeapi.org"; IPAddress ip(192, 168, 0, 2); EthernetClient client; void setup() < Serial.begin(9600); Ethernet.begin(mac, ip); // Дадим время шилду на инициализацию delay(1000); Serial.println("connecting. "); if (client.connect(server, 80)) < Serial.println("---------------"); // Создаем HTTP-запрос client.println("GET /utc/now HTTP/1.1"); client.println("Host: www.timeapi.org"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); >else < // if you didn't get a connection to the server: Serial.println("connection failed"); >> void loop() < // Если есть доступные биты, читаем их и выводим на экран if (client.available()) < char c = client.read(); Serial.print(c); >// Если соединение прервано, отключаем клиент if (!client.connected()) < Serial.println(); Serial.println("---------------"); Serial.println("disconnecting"); client.stop(); // Останавливаем выполнение программы while (true); >>

Открыв функцию мониторинга порта, мы увидим, что сервер прислал нам следующий ответ:

connecting. --------------- HTTP/1.1 200 OK Date: Sun, 06 Dec 2015 17:48:31 GMT Connection: close X-Frame-Options: sameorigin X-Xss-Protection: 1; mode=block Content-Type: text/html;charset=utf-8 Content-Length: 25 Server: thin 1.5.0 codename Knife Via: 1.1 vegur 2015-12-06T17:48:32+00:00 --------------- disconnecting

Как мы видим, ответ содержит множество параметров (заголовков), однако интересовать нас будет лишь первая строка, и то, что содержится после двух переносов строк, (прим. Два переноса используются для разграничения заголовков и тела ответа, заголовок Content-Length показывает размер тела ответа в байтах) по существу это и есть те данные, ради которых мы отправляли запрос серверу.

В первой строке HTTP/1.1 говорит нам о том, что используется протокол HTTP версии 1.1, второй элемент – 200 OK – это код состояния запроса, в нашем случае он означает, что запрос прошел успешно. Самые распространенные ответы, помимо 200 OK, – это 404 (не найдено) и 400 («плохой» или неправильный запрос).

Теперь вернемся к скетчу и разберем все более подробно. Первое что мы делаем, это подключаем необходимы библиотеки, а именно Ethernet.h и SPI.h (Ардуино уно взаимодействует с платой расширения по шине SPI, объединяющей в себе выводы 11, 12 и 13). Далее мы задаем MAC и IP-адреса, а также указываем IP-адрес или доменное имя ресурса, к серверу которого мы будем посылать запрос.

В методе setup функцией Ethernet.begin(mac, ip) мы запускаем нашу плату, и проверяем, если соединение с сервером установлено, то отправляем наш запрос. Не забываем прописывать пустую строку после запроса.

В методе loop мы функцией client.available() проверяем количество непрочитанных байт (т.е. количество байт, принятых клиентом от удаленного сервера, с которым установлено соединение), и если таковые имеются, то записываем их в переменную c.

Как только мы считаем последний байт, соединение будет считаться потерянным (прерванным). Следует обратить внимание на то, что клиент считается подключённым, если подключение уже закрыто, но остались несчитанные данные.

Напоследок хочется добавить, что режим клиента для Ардуино наиболее подходящий, так как он позволяет отправлять данные с различных датчиков на сервер, обрабатывать его ответ и при этом задействовать минимальное количество ресурсов платы.

Ардуино в режиме сервера

В данном режиме Ардуино создает сервер, ожидающий входящие соединения через указанный порт, чаще всего это 80 порт. В предыдущем разделе мы отправляли запрос удаленному серверу, чтобы он предоставил нам html-страницу. В этом разделе мы рассмотрим данный пример уже с другой стороны, в качестве клиента будет выступать наш ПК, а в качестве сервера Ардуино. Мы отправим запрос к Арудино, и после того, как он его обработает, сгенерирует для нас HTML-страницу.

Класс Server библиотеки Ethernet.h предоставляет нам доступ к следующим функциям:

Прежде чем переходить к непосредственному программированию, я расскажу вам о структуре HTML-страницы. Сам по себе HTML является стандартным языком разметки документов во Всемирной паутине. Для веб-разработчиков правилом хорошего тона является разграничение кода и оформления, т.е. чтобы код HTML был свободен от элементов оформления вроде установки цвета, размера шрифта и других параметров. В идеале, веб-страница должна содержать только теги логического форматирования, а вид элементов задаётся через стили. Другими словами, это означает, что язык программирования отвечает за все вычисления, HTML за то, что должно находиться на странице, а CSS как это содержимое (контент) должно выглядеть.

Чем больше тегов и селекторов мы будем использовать в HTML и CSS соответственно, тем больше ресурсов будет затрачено платой на генерацию страницы, особенно сильно это отразится на оперативной памяти, так как все строковые значения хранятся в ней. В связи с чем, использование CSS в составе скетча Ардуино практически невозможно. В своих проектах я загружал CSS-стили с удаленного сервера, предварительно подключив их в шапке страницы.

Если открыть любую веб-страницу, то она будет содержать в себе типичные элементы, которые не меняются от вида и направленности сайта. Ниже представлен HTML-код простой страницы, содержащей в себе основные тэги.

    Заголовок  

Абзац

Теперь давайте подробно разберем каждую строку нашего HTML кода. Элемент предназначен для указания типа текущего документа – DTD (document type definition, описание типа документа). Это необходимо, чтобы браузер понимал, как следует интерпретировать текущую веб-страницу, ведь HTML существует в нескольких версиях, кроме того, имеется XHTML (EXtensible Hyper Text Markup Language, расширенный язык разметки гипертекста), похожий на HTML, но различающийся с ним по синтаксису. Чтобы браузер «не путался» и понимал, согласно какому стандарту отображать веб-страницу и необходимо в первой строке кода задавать . Существует несколько видов , они различаются в зависимости от версии HTML, на которую ориентированы. В нашем случае мы использовали HTML версии 5, самая актуальная версия на момент написания статьи.

Тег определяет начало HTML-файла, внутри него хранится заголовок () и тело документа ().Заголовок документа, как еще называют блок , может содержать текст и теги, но содержимое этого раздела не показывается напрямую на странице, за исключением контейнера .Тег является универсальным и добавляет целый класс возможностей, в частности, с помощью метатегов, как обобщенно называют этот тег, можно изменять кодировку страницы, добавлять ключевые слова, описание документа и многое другое. Тег определяет заголовок веб-страницы. В операционной системе Windows текст заголовка отображается в левом верхнем углу окна браузера. Обязательно следует добавлять закрывающий тег , чтобы показать, что блок заголовка документа завершен.Тело документа предназначено для размещения тегов и содержательной части веб-страницы.Тег

определяет абзац (параграф) текста. Если закрывающего тега нет, считается, что конец абзаца совпадает с началом следующего блочного элемента.Тег

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

Помимо выше стандартных тэгов, существует огромное количество строчных и блочных элементов. Ознакомится с ними можно на сайте htmlbook.ru. Так же хочется упомянуть вам о таком нюансе, при котором все параметры (отступы, шрифты и тд.), которые вы не прописали, браузер выставит за вас согласно своим настройкам. Бывает так, что в Хроме страница выглядит нормально, в Мозиле немного все сжато, в Интернет Эксплорере вообще все набекрень.

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

    Ардуино  

Свободно байтов: N

И так как теперь Ардуино выполняет функцию сервера, то мы будем отправлять заголовки клиенту в случае успешного выполнения запроса.

#include #include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; // Макадрес byte ip[] = < 192, 168, 0, 2 >; // IP адрес (изменить в title) EthernetServer server(80); void setup() < //Старт Serial.begin(9600); Serial.println("FREE RAM: "); Serial.println(freeRam()); Ethernet.begin(mac, ip); server.begin(); >void loop() < EthernetClient client = server.available(); if (client) < // Проверяем подключен ли клиент к серверу while (client.connected()) < if (client.available()) < // Выводим HTML страницу client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(""); client.println(""); client.println(""); client.println(""); client.println("Home"); client.println(""); client.println(""); client.println("

Home Server

"); client.println("

Свободно памяти: "); client.println(freeRam()); client.println(" Байт

"); client.println(""); client.println(""); client.stop(); > > > > int freeRam ()

Как мы видим, на то, чтобы поднять сервер было задействовано 642 Байта из 2048 (прим. Информация видна странице по адресу http://192.168.0.2/). Теперь немного изменим HTML-страницу и загрузим ее в память микроконтроллера.

#include #include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; // Макадрес byte ip[] = < 192, 168, 0, 2 >; // IP адрес EthernetServer server(80); void setup() < //Старт Serial.begin(9600); Serial.println("FREE RAM: "); Serial.println(freeRam()); Ethernet.begin(mac, ip); server.begin(); >void loop() < EthernetClient client = server.available(); if (client) < // Проверяем подключен ли клиент к серверу while (client.connected()) < if (client.available()) < // Выводим HTML страницу client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(); client.println(""); client.println(""); client.println(""); client.println(""); client.println("Home"); client.println(""); client.println(""); client.println("

Home Server

"); client.println("

Свободно памяти: "); client.println(freeRam()); client.println(" Байт

"); client.println("

Arduino — это электронный конструктор и удобная платформа быстрой разработки электронных устройств для новичков и профессионалов.

"); client.println(""); client.println(""); client.stop(); > > > > int freeRam ()

Добавив всего один абзац, объем задействованной оперативной памяти увеличился на 239 байта, что довольно много для, если принимать в расчет тот факт, что объем RAM памяти Ардуино уно всего 2048 байта.

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

Рассмотрим пример вывода на веб-страницу информации о значении температуры и влажности, используя датчик DHT11, подключенного ко 2 пину Ардуино.

#include #include #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; // Макадрес byte ip[] = < 192, 168, 0, 2 >; // IP адрес (изменить в title) EthernetServer server(80); void setup() < //Старт Serial.begin(9600); Serial.println("FREE RAM: "); Serial.println(freeRam()); Ethernet.begin(mac, ip); server.begin(); >void loop() < float h = dht.readHumidity(); float t = dht.readTemperature(); EthernetClient client = server.available(); if (client) < // Проверяем подключен ли клиент к серверу while (client.connected()) < if (client.available()) < // Выводим HTML страницу client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(); client.println(""); client.println(""); client.println(""); client.println(""); client.println("Home"); client.println(""); client.println(""); client.println("

Home Server

"); client.println("

Температура: "); client.println(t); client.println("

"); client.println("

Влажность: "); client.println(h); client.println("

"); client.println(""); client.println(""); client.stop(); > > > > int freeRam ()

Как вы сами убедились, нет ничего сложного в том, чтобы организовать свой маленький веб-сервер на Ардуино. Надеюсь, данный раздел был вам интересен, и вы узнали много нового.

Обработка POST и GET данных

Всемирная паутина и протокол HTTP основаны на ряде методов запросов или «глаголов», включая POST и GET, а также PUT, DELETE и ряд других. Веб-браузеры обычно используют только GET и POST. Чтобы наглядно увидеть разницу в двух этих запросах, проведем небольшой сравнительный анализ.

Если говорить о способах передачи, то POST входит в состав стандартного потока, GET в свою очередь передается вместе с адресом. Максимальный объём данных при отправки методом POST составляет 8 КБ, а для метода GET всего 255 символа.

На основании этой характеристики можно делать вывод, когда нужно использовать POST, а когда GET. Например, при передаче логина и пароля нельзя ставить метод GET, так как он основан на передаче данных через адресную строку. Иначе после нажатия кнопки «Отправить», в адресной строке появится что-то вроде этого: «http://mysite.ru/login.php?log=User&pass=123456» – пароль в таком случае может увидеть любой желающий. Поэтому при работе с формами (включая формы авторизации) необходимо использовать метод POST.

Каждый для сам решает, каким лучше методом ему пользоваться. На практике для передачи данных о состоянии датчиков я использую метод GET, и выглядит это примерно следующим образом: led1=0&led2=1&pir=0 – где 1 и 0 обозначают состояние датчика или светодиода.

В данном разделе мы рассмотрим примеры обработки HTTP-запроса. Так как запрос представляет собой нечто иное как строковое значение, то и для его обработки соответственно мы будем использовать строковые функции. Для работы с текстом мы будем использовать класс String, который позволяет осуществлять более сложную обработку текстовых строк, по сравнению с обычными массивами символов. Следует иметь ввиду, что строковые константы, заключенные в двойные кавычки, интерпретируются как массивы символов, а не экземпляры класса String.

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

#include #include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; // Мак адрес byte ip[] = < 192, 168, 0, 2 >; // IP адрес EthernetServer server(80); String readString = String(30); // Парсим запрос к серверу (ардуино) void setup() < Serial.begin(9600); Serial.println("device is run"); Ethernet.begin(mac, ip); server.begin(); >void loop() < EthernetClient client = server.available(); if (client) < // Проверяем подключен ли клиент к серверу while (client.connected()) < char c = client.read(); if (readString.length() < 30) < readString += c; >if (c == '\n') < if(readString.indexOf("p=1") >0) < Serial.println("device is on"); >if(readString.indexOf("p=0") > 0) < Serial.println("device is off"); >client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(""); client.println(""); client.println(""); client.println(""); client.println("Home"); client.println(""); client.println(""); client.println("Устройство:"); client.println("
"); client.println("Выкл"); client.println(" Вкл"); client.println(""); client.println(""); readString=""; client.stop(); > > > >

В данном скетче данные, пришедшие к серверу по байтно, записываются в переменную char c (прим. В переменной содержится только один символ за один период цикла) с помощью функции client.read(), после чего записываются в переменную readString, формирую тем самым полную строку запроса. Как мы с вами убедились в прошлом разделе, запрос к серверу может быть довольно большой, если сравнивать с ресурсами Ардуино, поэтому, чтобы не переполнить оперативную память контроллера, мы установим ограничение на запрос в 30 символов, проверка данного условия осуществляется функцией readString.length(). Так как передаваемые GET данные содержатся в первой строке, мы будем записывать только ее, все остальное отбрасываем, для этого используем проверку с условием (c == '\n').

Дальше мы с помощью функции readString.indexOf("p=1") проверяем наличие подстроки p=1, в случае, если такая подстрока содержится в переменной readString функция возвращает значение true. Минусом данной обработки запроса является тот факт, что мы заранее должны знать все возможные значения, которые может иметь параметр p.

Для следующего скетча нам потребуется библиотека TextFinder для Ардуино, разработанная Майклом Марголисом. Библиотека TextFinder позволяет выделить текстовую подстроку из входящего потока байтов. Она может использоваться как для приложений Ethernet, так и для приложений последовательной связи (прим. Serial-порт).

Загрузить данную библиотеку можно с сайта www.arduino.cc/ playground/Code/TextFinder, после чего ее необходимо импортировать в Arduino IDE.

#include #include #include byte mac[] = < 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED >; // Мак адрес byte ip[] = < 192, 168, 0, 2 >; // IP адрес (изменить в title) EthernetServer server(80); int get = 0; void setup() < //Старт Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); Serial.println("device is run"); >void loop() < EthernetClient client = server.available(); if (client) < TextFinder response(client); while (client.connected()) < if (client.available()) < if(response.find("GET /")) < if (response.find("p=")) < get = response.getValue(); Serial.println(get); >> // Выводим HTML страницу client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println(); client.println(""); client.println(""); client.println(""); client.println(""); client.println("Home"); client.println(""); client.println(""); client.println("

Server

"); client.println("

Нажата ссылка: "); client.println(get); client.println("

"); client.println("

Link 1
Link 2

"); client.println(""); client.println(""); client.stop(); > > > >

В целом скетч мало чем отличается от скетча, рассмотренного в предыдущем примере. В данном примере конструктор TextFinder response(client) получает экземпляр потока «клиент» для обработки, функция response.find("GET /") считывает поток до тех пор, пока не будет найдена подстрока «GET /» после чего возвращает true в случае успеха и поиск прекращается. Обратите внимание, что TextFinder осуществляет один проход через поток, при этом отсутствует возможность вернуться, чтобы найти что-то еще.

Работу данного скетча можно ускорить, используя функцию response.findUntil("value", "\n\r") вместо функции response.find(). Данная функция останавливает поиск на символе переносе строки (возврат каретки), если элемент value не был найден. В нашем случае функция будет иметь вид response.findUntil("GET /", "\n\r").

В данном примере мы получали значение параметра p, используя функцию response.getValue(). Данная функция возвращает первое действительное целое число: все символы, которые не являются числами, включая знаки арифметики, пропускаются. Функция завершает считывание при появлении первого нечислового символа, следующего после числа. Если число не было найдено, функция возвращает 0.

Пример: в приведенном выше скетче первая строка запроса к серверу при нажатии ссылки будет иметь вид «GET /?p=1 HTTP/1.1 \n\r». Функцией response.findUntil("GET /", "\n\r") находим параметр «GET и останавливаем поиск, затем находим данной функцией параметр «p=» и снова останавливаем поиск, после чего функция response.getValue() начинает считывать целочисленные значения, функция считает значение 1 и остановится на символе H, так как был найден нечисловой символ. Таким образом, функция response.getValue() вернет значение 1.

Итак, на данном этапе мы с вами разобрались, как обрабатывать GET запрос: либо используя функцию indexOf(), либо с помощью библиотеки TextFinder. Теперь речь пойдет об обработки POST-запроса. Если при методе GET передаваемые параметры содержится в первой строке, то в случае с POST методом данные находится после двух символов переноса строки, в общем случае запрос может иметь вид:

POST / HTTP/1.0\r\n . \r\n p=1&led=0

Это означает, что при использовании библиотеки TextFinder Ардуино будет перебирать весь запрос на поиск нужных параметров, что очень сильно скажется на скорости работы контроллера, и время ответа сервера увеличится в сотки раз, в связи с чем приходится отказаться от использования данной библиотеке.

Во всех предыдущих примерах наш сервер по запросу предоставлял нам HTML-страницу, в данном примере мы будем считать, что POST-данные передаются нам от некого устройства или приложения, и наша задача заключается в их обработке. Для этого создадим простую HTML-страницу:

    Arduino   

LED control

Включить Выключить

Данная страница имеет два элемента типа «radio», которые будут эмитировать панель управление светодиодом. Ниже приведен скетч, который отвечает за обработку POST-запроса.

#include #include #include byte mac[] = < 0xDE, 0xAD, 0xC0, 0xA8, 0x01, 0x34 >; IPAddress ip(192,168,0,2); EthernetServer server(80); EthernetClient client; // Время задержки int WAIT = 300; // Буфер для хранения HTTP POST запроса #define bufferMax 128 int bufferSize; char buffer[bufferMax]; String readString = String(128); char post; void setup() < Serial.begin(9600); // Создание подключения setupCommunications(); >void loop() < // если клиент подключен client = server.available(); // принемаем POST запрос getPostRequest(); >void setupCommunications() < Serial.println("Establishing network connection. "); Ethernet.begin(mac, ip); // Пауза, чтобы обеспечить успешное соединение delay(WAIT); // старт сервер server.begin(); >void getPostRequest() < // если клиент подключен. if (client) < Serial.println("Client connected"); boolean currentLineIsBlank = true; bufferSize = 0; while (client.connected()) < if(client.available())< char c = client.read(); // если вы получили символ новой строки // и символ пустой строки, то POST запрос закончился // и вы можете отправить ответ if (c == '\n' && currentLineIsBlank) < // Здесь содержатся данные POST запроса while(client.available()) < post = client.read(); if(bufferSize < bufferMax) buffer[bufferSize++] = post; // сохраняем новый символ в буфере и создаем приращение bufferSize >Serial.println("Received POST request:"); // Разбор HTTP POST запроса ParseReceivedRequest(); // Выполнение команд PerformRequestedCommands(); // Отправка ответа sendResponse(); > else if (c == '\n') < currentLineIsBlank = true; >else if (c != '\r') < currentLineIsBlank = false; >> > Serial.println("Port closed"); > > void sendResponse() < Serial.println("Sending response"); client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.stop(); delay(WAIT); >void ParseReceivedRequest() < Serial.println(buffer); >void PerformRequestedCommands() < readString = buffer; if(readString.indexOf('led=on') >0) < Serial.println("LED on"); >else if (readString.indexOf('led=off') > 0) < Serial.println("LED off"); >>

Результат работы данной программы можно посмотреть с помощью функции «Мониторинг порта» встроенной в Arduino IDE. Я не буду комментировать код данной программы, так он мало чем отличается от тех примеров, которые мы рассмотрели раннее.

Заключение

Долго думал, что написать в заключении, так ничего поэтичного в голову не пришло, поэтому просто пожелаю вам удачи при подключение своего устройства к глобальной сети и хочу порекомендовать вам очень хорошую книгу Иго Т. на данную тему, называется она «Arduino, датчики и сети для связи устройств».

Теги:

Grankin Опубликована: 02.01.2016 0 0

Вознаградить Я собрал 0 0

Оценить статью

  • Техническая грамотность

Ethernet - client.localPort()

Returns the local port number the client is connected to.

Syntax

client.localPort 

Parameters

Returns

  • the local port number the client is connected to (uint16_t).

Example

#include #include byte mac[] = ; IPAddress ip(10, 0, 0, 177); // telnet defaults to port 23 EthernetServer server = EthernetServer(23); void setup() < // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) < ; // wait for serial port to connect. Needed for native USB port only >// initialize the Ethernet device Ethernet.begin(mac, ip); // start listening for clients server.begin(); > void loop() < // if an incoming client connects, there will be bytes available to read: EthernetClient client = server.available(); if (client) < Serial.print("Client is connected on port: "); Serial.println(client.localPort()); client.stop(); >> 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *