Arduino:Примеры/WiFiWebServer

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Веб-сервер при помощи 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, ключ и индекс ключа.

WiFiShield bb.png

На картинке выше сетевой модуль 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 }

См.также

  1. ConnectNoEncryption : Demonstrates how to connect to an open network
  2. ConnectWithWEP : Demonstrates how to connect to a network that is encrypted with WEP
  3. ConnectWithWPA : Demonstrates how to connect to a network that is encrypted with WPA2 Personal
  4. ScanNetworks : Displays all WiFi networks in range
  5. WiFiChatServer : Set up a simple chat server
  6. WiFiWebClient : Connect to a remote webserver
  7. WiFiWebClientRepeating: Repeatedly make HTTP calls to a server
  8. WiFiWebServer : Serve a webpage from the WiFi shield

Внешние ссылки