Arduino:Примеры/WiFiChatServer: различия между версиями
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">») |
Нет описания правки |
||
Строка 28: | Строка 28: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Чат-сервер с помощью WiFi Shield | Чат-сервер с помощью WiFi Shield |
Версия от 12:35, 20 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Чат-сервер с помощью 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, ключ и индекс ключа.
На картинке выше сетевой модуль WiFi Shield установлен поверх платы Arduino.
Код
/*
Чат-сервер с помощью WiFi Shield
Простой сервер, рассылающий все входящие сообщения всем
подключенным клиентам. Чтобы использовать, подключитесь к IP-адресу
своего девайса и начинайте печатать. Кроме того в Serial Monitor можно
будет наблюдать и все сообщения, отправляемые клиентами.
Этот пример написан таким образом, чтобы его можно было использовать
для сетей с шифрованием через WPA. Если в вашем случае
используется сеть с WEP-шифрованием, просто поменяйте соответствующим
образом функцию Wifi.begin().
Цепь:
* WiFi Shield, подключенный к Arduino
Создан 18 декабря 2009 Дэвидом А. Меллисом (David A. Mellis),
модифицирован 31 мая 2012 Томом Иго (Tom Igoe).
*/
#include <SPI.h>
#include <WiFi.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) {
; // ждем подключения последовательного порта (нужно только для Leonardo)
}
// Проверяем наличие 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");
}
См.также
- 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