Arduino:Примеры/DhcpChatServer

Материал из Онлайн справочника
Версия от 12:33, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Чат-сервер через DHCP[1]

Этот пример показывает, как с помощью Ethernet Shield подключаться к TELNET-серверу. Сообщения от этого сервера будут выводиться через последовательный порт, однако данный пример позволяет еще и отправлять сообщения на TELNET-сервер. Для этих целей отлично подходит Serial Monitor.

Кроме того, этот скетч пытается получить IP-адрес через DHCP, и делает это при помощи вызова функции Ethernet.begin(mac). Впрочем, при использовании DHCP-расширений стоит быть осторожнее, т.к. они сильно увеличивают размер скетча.

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

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

Необходимое ПО

  • TELNET-сервер;
  • Также для этой цели может подойти скетч Processing под названием ChatServer;

Цепь

Shield позволяет подключить плату Arduino к Ethernet-контроллеру WizNet (через SPI), и это подключение осуществляется при помощи 10-ого, 11-ого, 12-ого и 13-ого контактов. У более поздних моделей Shield имеется встроенный слот для SD-карты, SS-контакт которой в данном примере управляется через 4-ый цифровой контакт.

Shield должен быть подключен к сети при помощи Ethernet-кабеля. Также вам надо поменять сетевые настройки в скетче, чтобы они соответствовали настройкам вашей сети.

Shield устанавливается поверх платы Arduino.

Код

/*
Чат-сервер через DHCP
 
Простой сервер, который раздает все входящие сообщения всем подключенным клиентам.
Чтобы начать пользоваться чатом, подключитесь к IP-адресу своего девайса и начинайте печатать.
Кроме того, входящие сообщения, написанные клиентами, будут видны и в Serial Monitor.
В скетче используется Arduino Ethernet Shield на базе WizNet.

Эта версия пытается получить IP-адрес через DHCP.

Цепь:
* Shield подключен к 10-ому, 11-ому, 12-ому и 13-ому контактам.

Создан 21 мая 2011, 
модифицирован 9 апреля 2012 Томом Иго (Tom Igoe),
основан на примере ChatServer Дэвида А. Меллиса (David A. Mellis).
*/

#include <SPI.h>
#include <Ethernet.h>

// Ниже введите MAC-адрес и IP-адрес вашего контроллера.
// IP-адрес будет зависеть от вашей локальной сети.
// Внутренний адрес модема (gateway) и маска подсети (subnet) – опционально:
byte mac[] = { 
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);

// Создаем сервер, который будет «прослушивать»
// входящие соединения на порте 23:
EthernetServer server(23);
boolean gotAMessage = false; // переменная, с помощью которой скетч будет знать, получено сообщение от клиента или нет

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


  // Запускаем Ethernet-соединение:
  Serial.println("Trying to get an IP address using DHCP");  //  "Пытаемся получить IP-адрес через DHCP"
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");  //  "Не удалось сконфигурировать Ethernet при помощи DHCP"
    // Инициализируем Ethernet-девайс не при помощи DHCP:
    Ethernet.begin(mac, ip, gateway, subnet);
  }
  // Выводим на Serial Monitor локальный IP-адрес:
  Serial.print("My IP address: ");  //  "Мой IP-адрес: "

  ip = Ethernet.localIP();
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // Выводим значение каждого байта IP-адреса:
    Serial.print(ip[thisByte], DEC);
    Serial.print("."); 
  }
  Serial.println();
  // Начинаем слушать клиентов:
  server.begin();
 
}

void loop() {
  // Ждем нового клиента:
  EthernetClient client = server.available();

  // Когда клиент отсылает первый байт, здороваемся:
  if (client) {
    if (!gotAMessage) {
      Serial.println("We have a new client");  //  "У нас новый клиент"
      client.println("Hello, client!");  //  "Привет, клиент!"

      gotAMessage = true;
    }

    // Считываем байты от этого клиента:
    char thisChar = client.read();
    // Шлем эти байты обратно клиенту...
    server.write(thisChar);
    // ...а также серверу:
    Serial.print(thisChar);
  }
}

См.также

  1. Arduino Ethernet Shield
  2. Getting started with the ethernet shield
  3. Ethernet library
  4. ChatServer
  5. WebClient
  6. WebServer
  7. PachubeCient?
  8. TwitterClient
  9. BarometricPressureWebServer

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