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

ในการใช้งานเครือข่ายด้วยโปรโตคอล 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

– เปิดโปรแกรม 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

– กำหนด 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