Arduino:Примеры/wifi101WiFiChatServer

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

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


Чат-сервер с помощью WiFi Shield 101[1]

С помощью этого примера мы создадим простой чат-сервер, который будет рассылать все входящие сообщения (даже те, что будете печатать вы сами через серверную часть системы) всем подключенным клиентам. Чтобы использовать его, откройте монитор порта, подключитесь к IP-адресу вашего WiFi Shield 101, а затем начинайте печатать. Кроме того, в мониторе порта можно будет наблюдать входящие сообщения всех остальных клиентов.

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

  • Модуль Arduino WiFi Shield 101
  • Плата Arduino или Genuino Zero (или MKR1000)

Цепь

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
 
Простой сервер, рассылающий все входящие сообщения всем 
подключенным клиентам. Чтобы использовать, подключитесь к IP-адресу
своего девайса и начинайте печатать. Кроме того в мониторе порта можно
будет наблюдать и все сообщения, отправляемые клиентами.

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

Цепь:
* WiFi Shield, подключенный к Arduino
 
Создан 18 декабря 2009 Дэвидом А. Меллисом (David A. Mellis),
модифицирован 31 мая 2012 Томом Иго (Tom Igoe).
*/

#include <SPI.h>
#include <WiFi101.h>

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

int keyIndex = 0;            // индекс ключа к вашей сети (нужен только для WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(23);

boolean alreadyConnected = false; // переменная, которая будет давать понять, подключился или клиент в прошлый раз или нет

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) {
    if (!alreadyConnected) {
      // Очищаем буфер для входящих данных:
      client.flush();    
      Serial.println("We have a new client");      //  "У нас новый клиент"
      client.println("Hello, client!");  //  "Привет, клиент!"
      alreadyConnected = true;
    } 

    if (client.available() > 0) {
      // Считываем байты, пришедшие от клиента:
      char thisChar = client.read();
      // Отражаем эти байты обратно клиенту:
      server.write(thisChar);
      // После этого отражаем их самому серверу:
      Serial.write(thisChar);
    }
  }
}

//  Пользовательская функция для отображения информации о сети, к которой мы подключились:
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. WiFi library – Your reference for the WiFi101 Library.
  2. WiFi Shield – Product details for the WiFi 101 Shield.
  3. MKR1000 – Product details for the MKR1000 board.
  4. Connect No Encryption - Demonstrates how to connect to an open network.
  5. Connect With WEP - Demonstrates how to connect to a network that is encrypted with WEP.
  6. Connect With WPA - Demonstrates how to connect to a network that is encrypted with WPA2 Personal.
  7. Scan Networks - Displays all WiFi networks in range.
  8. Simple Web Server WiFi – Turn on and off an LED accessing this simple Web Server.
  9. UDP NTP Client - Query a Network Time Protocol (NTP) server using UDP.
  10. WiFi Web Client - Connect to a remote webserver.
  11. WiFi Web Client Repeating - Repeatedly make HTTP calls to a server.
  12. WiFi Web Server - Serve a webpage from the WiFi shield with Analog Input values.
  13. WiFi Send Receive UDP String - Send and receive a UDP string.

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