บทความการใช้งานเริ่มต้น ESP8266 NodeMCU และการใช้งาน Application ต่างๆ ตอนที่ 3 การใช้งาน TCP/IP

บทความการใช้งานเริ่มต้น ESP8266 NodeMCU และการใช้งาน Application ต่างๆ

ตอนที่ 3 การใช้งาน TCP/IP

01

ในการใช้งานเครือข่ายด้วยโปรโตคอล TCP นั้นสามารถใช้งานได้ 2 โหมด ได้แก่ TCP Server และ TCP Client

  • Server เป็นการกำหนดให้ ESP8266 ทำหน้าที่เป็นเครื่องแม่ข่ายให้บริการอย่างใดอย่างหนึ่ง โดยการเปิดพอร์ต (Listening) เพื่อรอรับการเชื่อมต่อจากเครื่องลูกข่าย
  • Client เป็นการกำหนดให้ ESP8266 ทำหน้าที่เป็นเครื่องลูกข่าย โดยเชื่อมต่อไปยังเครื่องแม่ข่ายด้วยไอพีแอดเดรสและพอร์ตที่กำหนดไว้เพื่อขอใช้บริการนั้นๆ

ฟังก์ชั่นสำหรับใช้งาน TCP Client
WiFiClient();
         คือ การประกาศสร้าง object ของ WifiClient

virtual int connect(IPAddress ip, uint16_t port);
         เป็นฟังก์ชั่นสำหรับสั่งให้ ESP8266 เชื่อมต่อกับ Server ด้วย IP และ Port
         parameter
                  ip = สำหรับกำหนด IP ของ Server ที่ต้องการเชื่อมต่อ
                  port = สำหรับกำหนด Port ที่ Server เปิดรับอยู่

virtual int connect(const char *host, uint16_t port)
         เป็นฟังก์ชั่นสำหรับสั่งให้ ESP8266 เชื่อมต่อกับ Server ด้วย URL และ Port
         parameter
                  host = สำหรับกำหนด URL ของ Server ที่ต้องการเชื่อมต่อ
                  port = สำหรับกำหนด Port ที่ Server เปิดรับอยู่

virtual size_t write(uint8_t b);
         เป็นฟังก์ชั่นสำหรับส่งค่าขนาด 1 ไบต์ออกไป
         parameter
                  b = คือ ตัวแปลค่าขนาด 1 ไบต์ออกไป
         return
ฟังก์ชั่นจะ Return จำนวนไบต์ที่ส่งออกไป

virtual write(const uint8_t *buf, size_t size)
         เป็นฟังก์ชั่นสำหรับส่งค่าขนาดหลายๆ ไบต์ออกไป
         parameter
                  buf = คือ pointer ที่ชี้ตำแหน่ง data ที่ต้องการส่งออกไป
                  size = จำนวนไบต์ที่ต้องการส่ง
         return
                  ฟังก์ชั่นจะส่งกลับค่าเป็นจำนวนไบต์ที่ส่งออกไป
print, println
         เป็นฟังก์ชั่นสำหรับส่งค่าที่เป็นข้อความออกไป โดย println จะส่ง “\r\n”(0x0A,0x0D) ตามหลังข้อความออกไปด้วย

virtual int available()
         เป็นฟังก์ชั่นสำหรับตรวจเช็คจำนวนไบต์ที่รับเข้ามาเก็บใน Buffer และ พร้อมที่จะอ่านออกมาจาก Buffer 
         return
                  ฟังก์ชั่นจะส่งกลับค่าเป็นจำนวนไบต์ใน Buffer ออกมา

virtual int read()
         เป็นฟังก์ชั่นสำหรับอ่านค่าจาก Buffer ที่รับ Data เข้ามาจากทาง TCP ครั้งละ 1ไบต์
         return
                  ฟังก์ชั่นจะส่งกลับค่าเป็นค่าใน Buffer ออกมาครั้งละ 1ไบต์

virtual int read(uint8_t *buf, size_t size)
         เป็นฟังก์ชั่นสำหรับอ่านค่าจาก Buffer ที่รับ Data เข้ามาจากทาง TCP ครั้งละหลายๆไบต์
         parameter
                  buf = คือ pointer ที่ชี้ตำแหน่งที่เก็บ data
                  size = จำนวนไบต์ที่ต้องการอ่าน
         return
                  ฟังก์ชั่นจะส่งกลับค่าเป็นจำนวนไบต์ที่อ่านออกมา

virtual void stop()
         เป็นฟังก์ชั่นสำหรับหยุดการเชื่อมต่อกับ Server

         นอกจากฟังก์ชั่นเหล่านี้แล้วยังสามารถใช้ตัวช่วยในการจัดการกับ Data โดยใช้กลุ่ม ฟังก์ชั่น Stream โดยสามารถดูข้อมูลเพิ่มเติมได้จาก http://www.arduino.cc/en/Reference/Stream

ตัวอย่าง Code การใช้ TCP Client

#include <ESP8266WiFi.h>
#define SERVER_PORT 8000            //ค่า port ที่ต้องการเชื่อมต่อ
IPAddress server_ip = {192,168,1,33};       //ค่า ip ของ Server (อย่าลืมแก้เป็น IP ของตัวเอง)
 
const char* ssid = "your ssid";         //ค่าของ SSID (อย่าลืมแก้เป็น ชื่อ SSID ของตัวเอง)
const char* password = "your password"; //ค่าของ SSID (อย่าลืมแก้เป็น password ของตัวเอง)
 
WiFiServer server(SERVER_PORT); //สร้าง object server และกำหนด port ที่ต้องการเชื่อมต่อกับ server
WiFiClient client;              //สร้าง object client
 
void setup() 
{
    Serial.begin(115200);       //เปิดใช้ Serial
    WiFi.begin(ssid, password); //เชื่อมต่อกับ AP
   
     while (WiFi.status() != WL_CONNECTED)  //รอการเชื่อมต่อ
    {
            delay(500);
            Serial.print(".");
    }
   
    Serial.println("");
    Serial.println("WiFi connected");  
    Serial.println("IP address: "); 
    Serial.println(WiFi.localIP()); //แสดงหมายเลข IP
 
    Serial.println("Connect TCP Server");
    while (!client.connect(server_ip,SERVER_PORT)) //เชื่อมต่อกับ Server
    {
            Serial.print(".");
            delay(100);
    } 
    Serial.println("Success"); 
ESP.wdtDisable();  //ปิด watch dog Timer
}
 
void loop() 
{
    while(client.available())   //ตรวจเช็ตว่ามี Data ส่งมาจาก Server หรือไม่
    {
            uint8_t  data =client.read();  //อ่าน Data จาก Buffer
            Serial.write(data); //แสดงผล Data ทาง Serial
    }
               client.println("Hello");     //ส่งค่าที่ได้รับกลับไปยัง Server
               delay(1000);
}

ทดลอง Run Program

         การทดสอบการทดลองนี้ เพื่อให้ง่ายต่อการทดสอบเราจะใช้โปรแกรม Hercules ทำหน้าที่เป็น TCP Server เพื่อรอรับ TCP Client จาก NodeMCU 
         Download Program Hercules >> http://new.hwg.cz/files/download/sw/version/hercules_3-2-8.exe

21

– เปิดโปรแกรม Hercules ขึ้นมา
– ตรวจเช็ค IP ของเครื่อง PC ของเรา (Server) โดยไปที่แท็บ UDP Setup จะมีกรอบที่แสดงข้อมูล IP ของเครื่องPC ของเรา

– ให้นำ IP ของเราไปกำหนดลงใน Codeตัวอย่างของ Arduino ตรง 
         IPAddress {192,168,1,33};
– กำหนด Port ที่ใช้เป็น 
         #define SERVER_PORT 8000
– กำหนด SSID และ Password ตาม Access Point ของเรา 
         const char* ssid = “stk”;
         const char* password = “stk123456”;
– ไปที่โปรแกรม Hercules ไปที่แท็บ TCP กำหนด Port เป็น 8000 แล้วคลิกปุ่ม Listen

โปรแกรม Hercules จะเปิด TCP Server ที่ Port 8000 เพื่อรอรับ Client 
– จากนั้นให้โปรแกรม Code ของเราลงในบอร์ด NodeMCU

– เมื่อโปรแกรมเสร็จแล้วให้เปิด Serial Monitor ขึ้นมา

– ปรับ Baud rate เป็น 115200

– กดปุ่ม Reset บนบอร์ด 
– Nodemcu จะเชื่อมต่อกับ Access point และเชื่อมต่อกับ TCP Server

– ให้ทดลองรับ-ส่งข้อมูลระหว่าง Server และ Client

ฟังก์ชั่นสำหรับใช้งาน TCP Server

WiFiServer(uint16_t port);
         คือการประกาศสร้างออบเจ็กต์ของ WifiServer และกำหนด Port 
         parameter
         Port = Port ที่ต้องการ เปิด Server

WiFiClient available(uint8_t* status = NULL);
         คือฟังก์ชั่นสำหรับตรวจเช็คว่ามี Client เชื่อมต่อเข้ามาหรือไม่ โดยจะส่งกลับเป็นออบเจ็กต์ของ Client ออกมา
         parameter
                  Status = ไม่มีการใช้งาน

void begin();
         คือฟังก์ชั่นสำหรับเริ่มต้นการใช้งานในส่วนของ TCP Server นี้มาการใช้งาน TCP Client ในส่วนการ รับส่งข้อมูลกับ Client ท่านสามารถดูข้อมูลในส่วนของ Client ในข้างต้นประกอบการใช้งาน

bool hasClient();
         คือฟังก์ชั่นสำหรับตรวจเช็คว่ามี Client กำลังเชื่อมต่อกับ Server อยู่หรือไม่ 
         หากมีจะส่งค่ากลับเป็น true หากยังมี client อยู่จะส่งค่ากลับเป็น false

ตัวอย่าง Code การใช้ TCP Server?

#include <ESP8266WiFi.h>
#define SERVER_PORT 8000    //กำหนด Port ใช้งาน
const char* ssid = "stk";       //กำหนด SSID
const char* password = "stk123456"; //กำหนด Password
WiFiServer server(SERVER_PORT); //สร้าง object server และกำหนด port
 
void setup() 
{
            Serial.begin(115200);   //เปิดใช้ Serial
    Serial.println("");
            Serial.println("");
            WiFi.begin(ssid, password); //เชื่อมต่อกับ AP
     while (WiFi.status() != WL_CONNECTED)  //รอการเชื่อมต่อ
    {
            delay(500);
            Serial.print(".");
    }
            Serial.println("WiFi connected");   //แสดงข้อความเชื่อมต่อสำเร็จ  
    Serial.println("IP address: "); 
    Serial.println(WiFi.localIP());     //แสดงหมายเลข IP
            server.begin();             //เริ่มต้นทำงาน TCP Server
            Serial.println("Server started");       //แสดงข้อความ server เริ่มทำงาน 
ESP.wdtDisable();            //ปิด watch dog Timer
}
 
void loop() 
{
        WiFiClient client = server.available();  //รอรับ การเชื่อมต่อจาก Client
        if (client)         //ตรวจเช็คว่ามี Client เชื่อมต่อเข้ามาหรือไม่
        {
            Serial.println("new client");   //แสดงข้อความว่ามี Client เชื่อมต่อเข้ามา
            while(1)        //วนรอบตลอด
            {
                    while(client.available())   //ตรวจเช็ตว่ามี Data ส่งมาจาก Client  หรือไม่
                    {
                            uint8_t data =client.read();  //อ่าน Data จาก Buffer
                            Serial.write(data); //แสดงผล Data ทาง Serial
                    }
                    if(server.hasClient())  //ตรวจเช็คว่ายังมี  Client เชื่อมต่ออยู่หรือไม่ 
                    {
                        return;         //ถ้าไม่มีให้ออกจาก ลูป ไปเริ่มต้นรอรับ Client ใหม่
                 }
            }
        
     } 
}

ทดลอง Run Program

30

– กำหนด Port ให้ใช้งานที่ port 800
         #define SERVER_PORT 8000
– กำหนด SSID และ Password ตาม Access point ที่ใช้งาน 
         const char* ssid = “stk”;
         const char* password = “stk123456”;
– จากนั้นให้โปรแกรม Code ของเราลงในบอร์ด NodeMCU

– เมื่อโปรแกรมเสร็จแล้ว ให้เปิด Serial Monitor ขึ้นมา

– ปรับ Baud rate เป็น 115200

– กดปุ่ม Reset บนบอร์ด 
– NodeMCU จะรันโปรแกรมของเราขึ้นมาและแสดง IP ของตัว NodeMCU (หากต้องการใช้งานแบบ Static IP ให้ดูวิธีการเชื่อมต่อในบทความตอนที่ 2)

– เปิดโปรแกรม Hercules ขึ้นมา
– ไปที่แท็บ TCP Client กำหนด IP ไปยังหมายเลข IP ของ NodeMCU และกำหนด Port ไปที่ 8000 (ตาม Code ที่สั่งให้เปิด TCP Server ที่ port8000)

– คลิกที่ปุ่ม Connect

– สังเกตที่ Serial Monitor ของ Arduino จะแสดงข้อความ new client

– ทดสอบใช้ Hercules ส่งข้อมูล ไปยัง Server

– ทดลอง Disconnect แล้ว Connect ใหม่ แล้ว ส่งข้อมูลไปยัง Server

<< ย้อนกลับหน้าสารบัญ