Arduino:Примеры/WiFiWebServer
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Содержание
Веб-сервер при помощи WiFi Shield[1]
В этом примере вы при помощи платы Arduino и модуля WiFi Shield создадите простой веб-сервер. Также понадобится библиотека WiFi, с помощью которой ваш девайс сможет отвечать на HTTP-запросы. Когда все будет готово, откройте браузер и введите в адресную строку IP-адрес вашего WiFi Shield, после чего Arduino ответит HTML-кодом, с помощью которого отобразит входные данные ото всех шести аналоговых контактов.
Этот пример написан для работы с сетями, использующими WPA-шифрование. Если вы используете WEP-зашифрованную сеть, соответствующим образом поменяйте функцию Wifi.begin().
Необходимое оборудование
- Сетевой модуль Arduino WiFi Shield;
- Плата Arduino, совместимая с WiFi Shield;
- 6 аналоговых датчиков, присоединенных к аналоговым контактам Arduino (с 0-ого по 5-ый) – опционально;
Цепь
WiFi Shield для SPI-соединения с модулем HDG104 использует 10-ый, 11-ый, 12-ый и 13-ый контакты. Для управления SS-контактом SD-карты используется 4-ый цифровой контакт.
Также для этого примера понадобится доступ к 802.11b/g сети, подключенной к интернету. Кроме того, в скетче надо будет поменять сетевые настройки, чтобы они соответствовали сети, к которой вы собираетесь подключиться.
Для сетей, использующих шифрование через WPA и WPA Personal, понадобятся SSID и пароль. К сети, использующей шифрование через WPA Enterprise, Shield подключиться не сможет.
Пароли к сетям с WEP-шифрованием – это шестнадцатеричные строки, называемые «ключами». Причем WEP-сеть может иметь 4 разных ключа, каждому из которых будет присвоен свой собственный «индекс». Таким образом, для WEP-зашифрованных сетей вам понадобятся SSID, ключ и индекс ключа.
На картинке выше сетевой модуль WiFi Shield установлен поверх платы Arduino.
Внимание
Для этого примера не требуется SD-карта. Однако, если карта будет вставлена, но использоваться не будет, скетч может зависнуть, потому что 4-ый контакт используется как SS-контакт (активация через LOW) SD-карты, а будучи неиспользованным, он по умолчанию выставляется в INPUT. Два возможных решения:
- Выньте SD-карту;
- Добавьте в блок setup() следующие строчки кода:
1 pinMode(4, OUTPUT);
2 digitalWrite(4, HIGH);
Код
1 /*
2 Веб-сервер с помощью WiFi Shield
3
4 Простой веб-сервер, который при помощи модуля WiFi Shield показывает
5 значения от входных аналоговых контактов.
6
7 Этот пример написан для работы с WPA-зашифрованными сетями.
8 Если вы имеете дело с WEP-зашифрованной сетью, просто
9 соответствующим образом поменяйте функцию Wifi.begin().
10
11 Цепь:
12 * WiFi Shield, подключенный к Arduino
13 * Аналоговые датчики, подключенные к контактам с A0 по A5 (опционально)
14
15 Создан 13 июля 2010 пользователем dlf (Metodo2 srl),
16 модифицирован 31 мая 2012 Томом Иго (Tom Igoe).
17 */
18
19 #include <SPI.h>
20 #include <WiFi.h>
21
22
23 char ssid[] = "yourNetwork"; // название (SSID) вашей сети
24 char pass[] = "secretPassword"; // пароль к вашей сети
25 int keyIndex = 0; // индекс ключа к вашей сети (нужно только для WEP)
26
27 int status = WL_IDLE_STATUS;
28
29 WiFiServer server(80);
30
31 void setup() {
32 // Инициализируем последовательную передачу данных и ждем открытия порта:
33 Serial.begin(9600);
34 while (!Serial) {
35 ; // ждем подключения последовательного порта (нужно только для Leonardo)
36 }
37
38 // Проверяем наличие WiFi Shield
39 if (WiFi.status() == WL_NO_SHIELD) {
40 Serial.println("WiFi shield not present"); // "WiFi Shield не подключен"
41 // Дальше не продолжаем:
42 while(true);
43 }
44
45 // Пробуем подключиться к WiFi-сети:
46 while ( status != WL_CONNECTED) {
47 Serial.print("Attempting to connect to SSID: "); // "Пытаемся подключиться к SSID: "
48 Serial.println(ssid);
49 // Подключаемся к сети зашифрованной через WPA или WPA2.
50 // Если вы подключаетесь к WEP-зашифрованной сети, нижеследующую строчку кода надо будет подредактировать:
51 status = WiFi.begin(ssid, pass);
52
53 // Ждем подключения 10 секунд:
54 delay(10000);
55 }
56 server.begin();
57 // Итак, мы подключились, поэтому выводим на Serial Monitor
58 // информацию о сети и сетевом оборудовании:
59 printWifiStatus();
60 }
61
62
63 void loop() {
64 // Прослушиваем подключающихся клиентов:
65 WiFiClient client = server.available();
66 if (client) {
67 Serial.println("new client"); // "Новый клиент"
68 // HTTP-запрос заканчивается пустой строкой:
69 boolean currentLineIsBlank = true;
70 while (client.connected()) {
71 if (client.available()) {
72 char c = client.read();
73 Serial.write(c);
74 // Если вы добрались до конца строки (получили символ новой строки),
75 // и эта строка – пустая, значит это конец HTTP-запроса,
76 // и, следовательно, мы можем приступить к отправке ответа:
77 if (c == '\n' && currentLineIsBlank) {
78 // Отправляем стандартный заголовок для HTTP-ответа:
79 client.println("HTTP/1.1 200 OK");
80 client.println("Content-Type: text/html");
81 client.println("Connection: close"); // после выполнения запроса соединение будет отключено
82 client.println("Refresh: 5"); // автоматически обновляем страницу каждые 5 секунд
83 client.println();
84 client.println("<!DOCTYPE HTML>");
85 client.println("<html>");
86 // Показываем данные от всех аналоговых датчиков:
87 for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
88 int sensorReading = analogRead(analogChannel);
89 client.print("analog input ");
90 client.print(analogChannel);
91 client.print(" is ");
92 client.print(sensorReading);
93 client.println("<br />");
94 }
95 client.println("</html>");
96 break;
97 }
98 if (c == '\n') {
99 // Вы начинаете новую строчку:
100 currentLineIsBlank = true;
101 }
102 else if (c != '\r') {
103 // В текущей строке еще есть символы:
104 currentLineIsBlank = false;
105 }
106 }
107 }
108 // Даем браузеру время, чтобы получить данные:
109 delay(1);
110
111 // Отключаем соединение:
112 client.stop();
113 Serial.println("client disonnected"); // "Клиент отключился"
114 }
115 }
116
117 // Пользовательская функция для отображения на Serial Monitor
118 // информации о сети и используемом сетевом оборудовании:
119 void printWifiStatus() {
120 // Показываем SSID (название) сети, к которой подключились:
121 Serial.print("SSID: ");
122 Serial.println(WiFi.SSID());
123
124 // Показываем IP-адрес WiFi Shield:
125 IPAddress ip = WiFi.localIP();
126 Serial.print("IP Address: "); // "IP-адрес: "
127 Serial.println(ip);
128
129 // Показываем мощность приемного сигнала:
130 long rssi = WiFi.RSSI();
131 Serial.print("signal strength (RSSI):"); // "Мощность сигнала (RSSI): "
132 Serial.print(rssi);
133 Serial.println(" dBm");
134 }
См.также
- ConnectNoEncryption : Demonstrates how to connect to an open network
- ConnectWithWEP : Demonstrates how to connect to a network that is encrypted with WEP
- ConnectWithWPA : Demonstrates how to connect to a network that is encrypted with WPA2 Personal
- ScanNetworks : Displays all WiFi networks in range
- WiFiChatServer : Set up a simple chat server
- WiFiWebClient : Connect to a remote webserver
- WiFiWebClientRepeating: Repeatedly make HTTP calls to a server
- WiFiWebServer : Serve a webpage from the WiFi shield
Внешние ссылки