Arduino:Примеры/WiFiWebClientRepeating

Материал из Онлайн справочника
Версия от 09:27, 14 декабря 2016; 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">»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Повторяющийся запрос с помощью WiFi Shield[1]

Этот пример демонстрирует, как при помощи WiFi Shield делать повторяющийся HTTP-запрос. В процессе будет создан клиент, который каждые 10 секунд будет подключаться к странице https://www.arduino.cc/latest.txt, а ее содержание будет отображаться на Serial Monitor.

По умолчанию скетч написан таким образом, чтобы работать через WPA-зашифрованную сеть. Впрочем, его можно переписать, чтобы он вместо WPA работал с WEP – для этого поменяйте соответствующим образом функцию Wifi.begin().

Необходимое оборудование

  • Сетевой модуль Arduino WiFi Shield;
  • Плата Arduino, совместимая с Arduino;

Цепь

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.

Код

/*
Веб-клиент, делающий повторяющиеся HTTP-запросы 

Этот скетч подключается к веб-серверу, а затем при помощи WiFi Shield
делает запросы. 

Цепь:
* WiFi Shield, подключенный к SPI-контактам и 7-ому контакту Arduino

Создан 23 апреля 2012,
модифицирован 31 мая 2012 Томом Иго (Tom Igoe),
еще раз модифицирован 13 января 2014 Федерико Ванзати (Federico Vanzati).

http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating

Этот код не защищен авторским правом.
*/

#include <SPI.h>
#include <WiFi.h>

char ssid[] = "yourNetwork";      //  SSID (имя) вашей сети
char pass[] = "secretPassword";   //  пароль к вашей сети
int keyIndex = 0;                 //  индекс ключа для вашей сети (нужно только для WEP)

int status = WL_IDLE_STATUS;

// Инициализируем клиентскую библиотеку WiFi:
WiFiClient client;

// Адрес сервера::
char server[] = "www.arduino.cc";
//IPAddress server(64,131,82,241);

unsigned long lastConnectionTime = 0;            // время, когда вы в последний раз подключались к серверу (в миллисекундах)
const unsigned long postingInterval = 10L * 1000L; // задержка между обновлениями (в миллисекундах)

void setup() {
  // Инициализируем последовательную передачу данных и ждем открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для Leonardo)
  }

  // Проверяем наличие Shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");  //  "WiFi Shield не подключен"
    // Дальше не продолжаем:
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv != "1.1.0") {
    Serial.println("Please upgrade the firmware");  //  "Пожалуйста, обновите прошивку"
  }

  // Пробуем подключиться к 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);
  }
  // Итак, мы подключились, поэтому сообщаем об этом на Serial Monitor:
  printWifiStatus();
}

void loop() {
  // Если через сетевое подключение пришли какие-нибудь данные, 
  // выводим их на Serial Monitor. Это нужно только в отладочных целях:
  while (client.available()) {
    char c = client.read();
    Serial.write(c);
  }

  // Если с момента последнего подключения прошло 10 секунд,
  // подключаемся снова, а затем отправляем новый запрос:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }

}

// Эта пользовательская функция осуществляет HTTP-подключение к серверу:
void httpRequest() {
  // Перед отправкой нового запроса отключаем все соединения.
  // Это освободит сокет на WiFi Shield:
  client.stop();

  // Если подключение прошло успешно:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");  //  "Подключение..."
    // Отправляем HTTP-Запрос типа PUT:
    client.println("GET /latest.txt HTTP/1.1");
    client.println("Host: www.arduino.cc");
    client.println("User-Agent: ArduinoWiFi/1.1");
    client.println("Connection: close");
    client.println();

    // Отмечаем время, было установлено когда подключение:
    lastConnectionTime = millis();
  } else {
    // Если подключиться не удалось, сообщаем об это на Serial Monitor:
    Serial.println("connection failed");  //  "Подключиться не удалось"
  }
}

//  Пользовательская функция для отображения информации о сети и сетевом оборудовании: 
void printWifiStatus() {
  // Показываем на Serial Monitor название (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");
}

См.также

  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

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