UDP

Az alábbi példaalkalmazás célja az ESP8266 és egy külső kliens közötti UDP kommunikáció bemutatása. Az alkalmazás (amely egy szerver szerepét tölti be) a loop()-on belül ellenőrzi, hogy megérkezett-e egy UDP-csomag. Érvényes csomag fogadásakor egy nyugtázó csomag visszaküldésre kerül a kliensnek ugyanarra a portra, amelyen kiküldték.


Tartalomjegyzék


Declarációk

A vázlat elején két könyvtárat kell hozzáadnunk:


#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

Az első, az ESP8266WiFi.h könyvtár alapértelmezés szerint szükséges, ha az ESP8266 Wi-Fi-jét használjuk. A második, a WiFiUdp.h kifejezetten az UDP-rutinok programozásához szükséges.

Miután a könyvtárak a helyükön vannak, létre kell hoznunk egy WiFiUDP objektumot. Ezután meg kell adnunk egy portot a bejövő csomagok figyelésére. Vannak egyezmények a portszámok használatára vonatkozóan, további információkért tekintse meg a TCP és UDP portszámok listáját. Végül be kell állítanunk egy puffert a bejövő csomagok számára, és meg kell határoznunk egy válaszüzenetet.


WiFiUDP Udp;
unsigned int localUdpPort = 4210;
char incomingPacket[256];
char replyPacket[] = "Hi there! Got the message :-)";


Wi-Fi kapcsolat

A setup() elején hajtsunk végre tipikus kódot a hozzáférési ponthoz való csatlakozáshoz. Erről a Gyors indítás-ban volt szó. Igény esetén kérjük, hivatkozzon rá.


UDP beállítása

A kapcsolat létrejötte után elkezdheti figyelni a bejövő csomagokat.


Udp.begin(localUdpPort);

Ez mind szükséges előkészület. Áttérhetünk a loop()-ra, amely a tényleges UDP-kommunikációt fogja kezelni.


Megérkezett egy UDP csomag!

A bejövő UDP-csomagolásra való várakozás a következő kóddal történik:


int packetSize = Udp.parsePacket();
if (packetSize)
{
  Serial.printf("Received %d bytes from %s, port %d\n", packetSize,
        Udp.remoteIP().toString().c_str(), Udp.remotePort());
  int len = Udp.read(incomingPacket, 255);
  if (len > 0)
  {
    incomingPacket[len] = '\0';
  }
  Serial.printf("UDP packet contents: %s\n", incomingPacket);

  (...)
}

Amint egy csomag megérkezik, a kód kiírja a küldő IP-címét és portját, valamint a fogadott csomag hosszát. Ha a csomag nem üres, akkor annak tartalma is kinyomtatásra kerül.


Nyugtázó kiküldése

Minden fogadott csomaghoz visszaküldünk egy nyugtázó csomagot:


Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(replyPacket);
Udp.endPacket();

Felhívjuk figyelmét, hogy a választ a feladó IP-címére és portjára küldjük az Udp.remoteIP() és az Udp.remotePort() használatával.


Teljes vázlat

Az alábbiakban bemutatjuk az összes leírt funkciót végrehajtó vázlatot:


#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

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

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // a figyelt helyi port
char incomingPacket[255];  // puffer a bejövő csomagoknak
char  replyPacket[] = "Hi there! Got the message :-)";  // a visszaküldendő válaszkarakterlánc


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");

  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}


void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // fogadja a bejövő UDP-csomagokat
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize,
            Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);

    // küldje vissza a választ arra az IP-címre és portra, ahonnan a csomagot kaptuk
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacket);
    Udp.endPacket();
  }
}


Hogyan ellenőrizhető?

Töltse fel a vázlatot a modulba, és nyissa meg a soros monitort. Meg kell jelennie a megerősítésnek, hogy az ESP csatlakozott a Wi-Fi-hez, és elkezdte figyelni az UDP-csomagokat:


Connecting to twc-net-3 ........ connected
Now listening at IP 192.168.1.104, UDP port 4210

Most egy másik alkalmazásra van szükségünk, hogy néhány csomagot elküldhessünk az IP-re és a fenti ESP által bemutatott portra.

Ahelyett, hogy programoznánk egy másik ESP-t, tegyük egyszerűbbé a dolgot, és használjunk egy célzott alkalmazást. Kiválasztottam a Packet Sender-t. Elérhető a népszerű operációs rendszerekhez. Töltse le, telepítse és futtassa.

Amint megjelenik a Packet Sender ablaka, írja be a következő információkat: * Name A csomag neve * ASCII A csomagon belül küldendő üzenet ASCII-szövege * Address Az ESP által megjelenített IP-cím * Port Az ESP által megjelenített port * UDP Válassza ki az UDP-t.

Amit beírtam, az alább látható:

Most klikkelj a Send-re.

Közvetlenül ezután a következőket kell látnia az ESP soros monitorán:


Received 12 bytes from 192.168.1.106, port 55056
UDP packet contents: Hello World!

A 192.168.1.106, az 55056-os port szöveg azonosítja azt a számítógépet, amelyről a csomagot küldik. Valószínűleg más értékeket fog látni.

Mivel az ESP visszaigazoló csomagot küld, látnia kell a naplóban a Packet Sender ablakának alsó részén.


Következtetés

Ez az egyszerű példa bemutatja, hogyan küldhet és fogadhat UDP-csomagokat az ESP és egy külső alkalmazás között. Miután kipróbálta ezt a minimális beállítást, képesnek kell lennie arra, hogy beprogramozza az ESP-t, hogy bármilyen más UDP-eszközzel kommunikáljon. Ha problémák merülnek fel az új eszközzel való kommunikáció során, használja a Packet Sender vagy más hasonló programot a hibaelhárításhoz.

Az UDP-csomagok küldéséhez és fogadásához biztosított funkciók áttekintéséhez tekintse meg az UDP osztály dokumentációját.


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