Arduino:Примеры/wifi101WiFiWebServer: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">») |
Нет описания правки |
||
Строка 31: | Строка 31: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Веб-сервер с помощью WiFi Shield | Веб-сервер с помощью WiFi Shield |
Версия от 18:20, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Веб-сервер при помощи WiFi Shield 101[1]
В этом примере вы при помощи модуля WiFi Shield 101 или платы MKR1000 создать простой веб-сервер. Также понадобится библиотека WiFi101, с помощью которой ваш девайс сможет отвечать на HTTP-запросы. Когда все будет готово, откройте браузер и введите в адресную строку IP-адрес вашего WiFi Shield 101, после чего Arduino ответит HTML-кодом, с помощью которого отобразит входные данные ото всех шести аналоговых контактов.
Этот пример написан для работы с сетями, использующими WPA-шифрование. Если вы используете WEP-зашифрованную сеть, соответствующим образом поменяйте функцию WiFi.begin().
Необходимое оборудование
- Модуль Arduino WiFi Shield 101
- Плата Arduino или Genuino Zero (или MKR1000)
- 6 аналоговых датчиков, присоединенных к аналоговым контактам Arduino (с 0-ого по 5-ый) – опционально
Цепь
7-ой цифровой контакт используется в качестве контакта для «рукопожатия» между WiFi Shield 101 и платой, т.е. ни для каких других целей его использовать не следует.
Также для этого примера понадобится доступ к 802.11b/g сети, подключенной к интернету. Кроме того, в скетче надо будет поменять сетевые настройки, чтобы они соответствовали сети, к которой вы собираетесь подключиться.
Для сетей, использующих шифрование через WPA и WPA Personal, понадобятся SSID и пароль. К сети, использующей шифрование через WPA Enterprise, Shield подключиться не сможет.
Пароли к сетям с WEP-шифрованием – это шестнадцатеричные строки, называемые «ключами». Причем WEP-сеть может иметь 4 разных ключа, каждому из которых будет присвоен свой собственный «индекс». Таким образом, для WEP-зашифрованных сетей вам понадобятся SSID, ключ и индекс ключа.
На картинке выше модуль WiFi Shield 101 установлен поверх платы Arduino/Genuino Zero.
Код
/*
Веб-сервер с помощью WiFi Shield
Простой веб-сервер, который при помощи модуля WiFi Shield показывает
значения от входных аналоговых контактов.
Этот пример написан для работы с WPA-зашифрованными сетями.
Если вы имеете дело с WEP-зашифрованной сетью, просто
соответствующим образом поменяйте функцию Wifi.begin().
Цепь:
* WiFi Shield, подключенный к Arduino
* Аналоговые датчики, подключенные к контактам с A0 по A5 (опционально)
Создан 13 июля 2010 пользователем dlf (Metodo2 srl),
модифицирован 31 мая 2012 Томом Иго (Tom Igoe).
*/
#include <SPI.h>
#include <WiFi101.h>
char ssid[] = "yourNetwork"; // название (SSID) вашей сети
char pass[] = "secretPassword"; // пароль к вашей сети
int keyIndex = 0; // индекс ключа к вашей сети (нужно только для WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
// Инициализируем последовательную передачу данных и ждем открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ждем подключения последовательного порта (нужно только для плат со штатным USB-портом)
}
// Проверяем наличие WiFi Shield
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present"); // "WiFi Shield не подключен"
// Дальше не продолжаем:
while(true);
}
// Пробуем подключиться к WiFi-сети:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: "); // "Пытаемся подключиться к SSID: "
Serial.println(ssid);
// Подключаемся к сети зашифрованной через WPA или WPA2.
// Если вы подключаетесь к WEP-зашифрованной сети, нижеследующую строчку кода надо будет подредактировать:
status = WiFi.begin(ssid, pass);
// Ждем подключения 10 секунд:
delay(10000);
}
server.begin();
// Итак, мы подключились, поэтому выводим на Serial Monitor
// информацию о сети и сетевом оборудовании:
printWifiStatus();
}
void loop() {
// Прослушиваем подключающихся клиентов:
WiFiClient client = server.available();
if (client) {
Serial.println("new client"); // "Новый клиент"
// HTTP-запрос заканчивается пустой строкой:
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// Если вы добрались до конца строки (получили символ новой строки),
// и эта строка – пустая, значит это конец HTTP-запроса,
// и, следовательно, мы можем приступить к отправке ответа:
if (c == '\n' && currentLineIsBlank) {
// Отправляем стандартный заголовок для HTTP-ответа:
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // после выполнения запроса соединение будет отключено
client.println("Refresh: 5"); // автоматически обновляем страницу каждые 5 секунд
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
// Показываем данные от всех аналоговых датчиков:
for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
int sensorReading = analogRead(analogChannel);
client.print("analog input ");
client.print(analogChannel);
client.print(" is ");
client.print(sensorReading);
client.println("<br />");
}
client.println("</html>");
break;
}
if (c == '\n') {
// Вы начинаете новую строчку:
currentLineIsBlank = true;
}
else if (c != '\r') {
// В текущей строке еще есть символы:
currentLineIsBlank = false;
}
}
}
// Даем браузеру время, чтобы получить данные:
delay(1);
// Отключаем соединение:
client.stop();
Serial.println("client disonnected"); // "Клиент отключился"
}
}
// Пользовательская функция для отображения на Serial Monitor
// информации о сети и используемом сетевом оборудовании:
void printWifiStatus() {
// Показываем SSID (название) сети, к которой подключились:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// Показываем IP-адрес WiFi Shield:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: "); // "IP-адрес: "
Serial.println(ip);
// Показываем мощность приемного сигнала:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):"); // "Мощность сигнала (RSSI): "
Serial.print(rssi);
Serial.println(" dBm");
}
См.также
- WiFi library – Your reference for the WiFi101 Library.
- WiFi Shield – Product details for the WiFi 101 Shield.
- MKR1000 – Product details for the MKR1000 board.
- Connect No Encryption - Demonstrates how to connect to an open network.
- Connect With WEP - Demonstrates how to connect to a network that is encrypted with WEP.
- Connect With WPA - Demonstrates how to connect to a network that is encrypted with WPA2 Personal.
- Scan Networks - Displays all WiFi networks in range.
- Simple Web Server WiFi – Turn on and off an LED accessing this simple Web Server.
- UDP NTP Client - Query a Network Time Protocol (NTP) server using UDP.
- WiFi Chat Server - Set up a simple chat server.
- WiFi Web Client - Connect to a remote webserver.
- WiFi Web Client Repeating - Repeatedly make HTTP calls to a server.
- WiFi Send Receive UDP String - Send and receive a UDP string.