Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/WiFiChatServer

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

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

Цепь

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.

Код

  1. /*
  2. Чат-сервер с помощью WiFi Shield
  3.  
  4. Простой сервер, рассылающий все входящие сообщения всем
  5. подключенным клиентам. Чтобы использовать, подключитесь к IP-адресу
  6. своего девайса и начинайте печатать. Кроме того в Serial Monitor можно
  7. будет наблюдать и все сообщения, отправляемые клиентами.
  8.  
  9. Этот пример написан таким образом, чтобы его можно было использовать
  10. для сетей с шифрованием через WPA. Если в вашем случае
  11. используется сеть с WEP-шифрованием, просто поменяйте соответствующим
  12. образом функцию Wifi.begin().
  13.  
  14. Цепь:
  15. * WiFi Shield, подключенный к Arduino
  16.  
  17. Создан 18 декабря 2009 Дэвидом А. Меллисом (David A. Mellis),
  18. модифицирован 31 мая 2012 Томом Иго (Tom Igoe).
  19. */
  20.  
  21. #include <SPI.h>
  22. #include <WiFi.h>
  23.  
  24. char ssid[] = "yourNetwork";       // SSID (название) вашей сети
  25. char pass[] = "secretPassword";    // пароль к вашей сети (он нужен для WPA, а для WEP используйте ключ)
  26.  
  27. int keyIndex = 0;            // индекс ключа к вашей сети (нужен только для WEP)
  28.  
  29. int status = WL_IDLE_STATUS;
  30.  
  31. WiFiServer server(23);
  32.  
  33. boolean alreadyConnected = false; // переменная, которая будет давать понять, подключился или клиент в прошлый раз или нет
  34.  
  35. void setup() {
  36.   // Инициализируем последовательную передачу данных и ждем открытия порта:
  37.   Serial.begin(9600);
  38.   while (!Serial) {
  39.     ; // ждем подключения последовательного порта (нужно только для Leonardo)
  40.   }
  41.  
  42.   // Проверяем наличие WiFi Shield:
  43.   if (WiFi.status() == WL_NO_SHIELD) {
  44.     Serial.println("WiFi shield not present");  //  "WiFi Shield не подключен"
  45.     // Дальше не продолжаем:
  46.     while(true);
  47.   }
  48.  
  49.   // Пытаемся подключиться к WiFi-сети:
  50.   while ( status != WL_CONNECTED) {
  51.     Serial.print("Attempting to connect to SSID: ");  //  "Пробуем подключиться к SSID: "
  52.     Serial.println(ssid);
  53.     // Подключаемся к сети с шифрованием WPA или WPA2.
  54.     // Если используете открытую или WEP-зашифрованную сеть, измените эту строчку:    
  55.     status = WiFi.begin(ssid, pass);
  56.  
  57.     // Ждем подключения 10 секунд:
  58.     delay(10000);
  59.   }
  60.   // Запускаем сервер:
  61.   server.begin();
  62.   // Мы подключились, поэтому выводим на Serial Monitor информацию о сети, к которой подключились:
  63.   printWifiStatus();
  64.  }
  65.  
  66.  
  67. void loop() {
  68.   // Ждем нового клиента:
  69.   WiFiClient client = server.available();
  70.  
  71.  
  72.   // Когда клиент отправит первый байт, здороваемся с ним:
  73.   if (client) {
  74.     if (!alreadyConnected) {
  75.       // Очищаем буфер для входящих данных:
  76.       client.flush();    
  77.       Serial.println("We have a new client");      //  "У нас новый клиент"
  78.       client.println("Hello, client!");  //  "Привет, клиент!"
  79.       alreadyConnected = true;
  80.     }
  81.  
  82.     if (client.available() > 0) {
  83.       // Считываем байты, пришедшие от клиента:
  84.       char thisChar = client.read();
  85.       // Отражаем эти байты обратно клиенту:
  86.       server.write(thisChar);
  87.       // После этого отражаем их самому серверу:
  88.       Serial.write(thisChar);
  89.     }
  90.   }
  91. }
  92.  
  93. //  Пользовательская функция для отображения информации о сети, к которой мы подключились:
  94. void printWifiStatus() {
  95.   // Показываем на Serial Monitor название (т.е. SSID) сети, к которой подключились:
  96.   Serial.print("SSID: ");
  97.   Serial.println(WiFi.SSID());
  98.  
  99.   // Показываем IP-адрес WiFi Shield:
  100.   IPAddress ip = WiFi.localIP();
  101.   Serial.print("IP Address: ");  //  "IP-адрес: "
  102.   Serial.println(ip);
  103.  
  104.   // Показываем мощность приемного сигнала:
  105.   long rssi = WiFi.RSSI();
  106.   Serial.print("signal strength (RSSI):");  //  "Мощность сигнала (RSSI):"
  107.   Serial.print(rssi);
  108.   Serial.println(" dBm");
  109. }

См.также

  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

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

  1. Arduino - WiFi Chat Server