Kiszolgáló (Server)

A webszerver ESP8266-on történő beállítása nagyon kevés kódot igényel, és meglepően egyszerű. Ez a sokoldalú ESP8266WiFi könyvtár által biztosított funkcióknak köszönhető.

A példa célja egy webböngészőben megnyitható weboldal elkészítése. Ezen az oldalon az ESP analóg bemeneti kivezetésének aktuális nyers leolvasását kell mutatnia.


Tartalomjegyzék


Az objektum

Kezdjük egy szerverobjektum létrehozásával.


WiFiServer server(80);

A szerver a 80-as porton válaszol a klienseknek (ebben az esetben a webböngészőknek), amely egy szabványos port, amely a webböngészők webszervereivel kommunikál.


Az oldal

Ezután írjunk egy rövid függvényt prepareHtmlPage(), amely egy String osztályú változót ad vissza, amely tartalmazza a weboldal tartalmát. Ezt a változót ezután átadjuk a szervernek, hogy átadhassuk egy kliensnek.


String prepareHtmlPage()
{
  String htmlPage;
  htmlPage.reserve(1024);               // megakadályozza a ram töredezettségét
  htmlPage = F("HTTP/1.1 200 OK\r\n"
               "Content-Type: text/html\r\n"
               "Connection: close\r\n"  // a kapcsolat a válasz befejezése után megszakad
               "Refresh: 5\r\n"         // az oldal automatikus frissítése 5 másodpercenként
               "\r\n"
               "<!DOCTYPE html>"
               "<html>"
               "Analog input:  ");
  htmlPage += analogRead(A0);
  htmlPage += F("</html>"
                "\r\n");
  return htmlPage;
}

A funkció nem csinál semmi különöset, csak összeállít egy szöveges fejlécet és az oldal HTML-tartalmát.


Először a fejléc

A fejléc tájékoztatja az ügyfelet, hogy milyen típusú tartalmat kell követnie, és hogyan lesz kiszolgálva:


Content-Type: text/html
Connection: close
Refresh: 5

Példánkban a tartalom típusa text/html, kiszolgálás után a kapcsolat megszakad, és a kliensnek 5 másodpercenként újra le kell kérnie a tartalmat. A fejléc egy üres sorral zárul \r\n. Ezzel kell elkülöníteni a fejlécet az azt követő tartalomtól.


<!DOCTYPE html>
<html>
Analog input:  [Value]
</html>

A tartalom két alapvető HTML címkét tartalmaz, az egyik a <!DOCTYPE html> HTML dokumentumtípust jelöli, a másik pedig a dokumentum <html> elejét és végét </html>. Belül van egy nyers érték, amelyet az ESP analóg bemenetéről olvasott be, az analogRead(A0) String típusba konvertálva.


analogRead(A0)


Az oldal kiszolgálva

Ennek a weboldalnak a kiszolgálása a loop()-ban történik, ahol a szerver arra vár, hogy egy új kliens csatlakozzon, és kérést tartalmazó adatokat küldjön:


void loop()
{
  WiFiClient client = server.accept();
  if (client)
  {
    // van egy új ügyfelünk, aki kérést küld
  }
}

Új kliens csatlakoztatása után a szerver elolvassa az ügyfél kérését, és kinyomtatja egy soros monitoron.


while (client.connected())
{
  if (client.available())
  {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
}

Az ügyféltől érkező kérést egy üres sor jelzi. Ha megtaláljuk ezt a jelölést, visszaküldhetjük a weboldalt, és a break segítségével kiléphetünk a while() ciklusból.


if (line.length() == 1 && line[0] == '\n')
{
    client.println(prepareHtmlPage());
    break;
}

A teljes folyamat az ügyféllel való kapcsolat leállításával zárul:


client.stop();

Előtte azonban nem szakíthatjuk meg az ügyfél kérését:


while (client.available()) {
  // de először hagyja, hogy az ügyfél befejezze a kérését,
  // amely a protokolloknak való diplomáciai megfelelést jelenti
  // (és egyébként egyes kliensek panaszkodhatnak, például curl)
  // (ez például egy megfelelő webszerver-könyvtár használatát részesíti előnyben)
  client.read();
}


Rakd össze

A teljes vázlatot az alábbiakban mutatjuk be.


#include <ESP8266WiFi.h>

const char* ssid = "********";
const char* password = "********";

WiFiServer server(80);


void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");

  server.begin();
  Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());
}


// weblap elkészítése egy kliensnek (böngészőnek) történő elküldéshez
String prepareHtmlPage()
{
  String htmlPage;
  htmlPage.reserve(1024);               // megakadályozza a ram töredezettségét
  htmlPage = F("HTTP/1.1 200 OK\r\n"
               "Content-Type: text/html\r\n"
               "Connection: close\r\n"  // a kapcsolat a válasz befejezése után megszakad
               "Refresh: 5\r\n"         // az oldal automatikus frissítése 5 másodpercenként
               "\r\n"
               "<!DOCTYPE html>"
               "<html>"
               "Analog input:  ");
  htmlPage += analogRead(A0);
  htmlPage += F("</html>"
                "\r\n");
  return htmlPage;
}


void loop()
{
  WiFiClient client = server.accept();
  // várja meg, amíg egy kliens (böngésző) csatlakozik
  if (client)
  {
    Serial.println("\n[Client connected]");
    while (client.connected())
    {
      // soronként olvassa el, amit a kliens (böngésző) kér
      if (client.available())
      {
        String line = client.readStringUntil('\r');
        Serial.print(line);
        // várja meg az ügyfél kérésének végét, amely üres sorral van megjelölve
        if (line.length() == 1 && line[0] == '\n')
        {
          client.println(prepareHtmlPage());
          break;
        }
      }
    }

    while (client.available()) {
      // de először hagyja, hogy az ügyfél befejezze a kérését,
      // amely a protokolloknak való diplomáciai megfelelést jelenti
      // (és egyébként egyes kliensek panaszkodhatnak, például curl)
      // (ez például egy megfelelő webszerver-könyvtár használatát részesíti előnyben)
      client.read();
      }

    // zárja le a kapcsolatot:
    client.stop();
    Serial.println("[Client disconnected]");
  }
}


Indítsd el

Frissítse az ssid-t és a password-öt a vázlatban, hogy megfeleljenek a hozzáférési pont hitelesítő adatainak. Töltse be a vázlatot az ESP modulba, és nyisson meg egy soros monitort. Először megerősítést kell látnia, hogy a modul a hozzáférési ponthoz csatlakozott és a webszerver elindult.


Connecting to sensor-net ........ connected
Web server started, open 192.168.1.104 in a web browser

Írja be a megadott IP-címet egy webböngészőbe. Látnia kell az ESP8266 által kiszolgált oldalt:

Az oldal 5 másodpercenként frissül. Minden alkalommal, amikor ez megtörténik, látnia kell egy kérést az ügyféltől (a webböngészőtől) kinyomtatva a soros monitoron:


[Client connected]
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: 192.168.1.104
DNT: 1
Connection: Keep-Alive
[client disconnected]


Következtetés

A fenti példa azt mutatja, hogy egy webszerver ESP8266-on szinte pillanatok alatt beállítható. Az ilyen szerverek könnyedén fel tudják állítani a sokkal erősebb hardverek és szoftverek kérését, például egy webböngészővel rendelkező számítógépet. Nézzen meg más osztályokat, például az ESP8266WebServer-t, amelyek segítségével fejlettebb alkalmazásokat programozhat.

Ha szeretne egy másik szerver példát kipróbálni, nézze meg a WiFiManualWebServer.ino webhelyet, amely lehetőséget biztosít a GPIO PIN-kód be- és kikapcsolására a webböngészőben.

A szerverek megvalósításához és kezeléséhez biztosított funkciók listáját a Szerver osztály dokumentációjában találja.


© Copyright 2017, Ivan Grokhotkov Revision b080c507. Fordította: Maczák András