โปรโตคอล TCP เป็นหนึ่งในพื้นฐานของโปรโตคอลบนโลกอินเตอร์เน็ต ในโลกของการเชื่อมต่อเครือข่ายแบบอินเตอร์เน็ตจะมีโปรโตคอลที่เป็นพื้นฐานอยู่ 2 ตัว คือ TCP และ UDP
โปรโตคอล UDP เป็นอีกโปรโตคอลหนึ่งบนโลกอินเตอร์เน็ต มีข้อดีคือสามารถรับ – ส่งข้อมูลได้ความเร็วสูงกว่าโปรโตคอล TCP แต่ข้อเสียคือไม่มีการตรวจสอบผลการส่งข้อมูล ทำให้ข้อมูลที่ส่งมีโอกาสส่งไปไม่ถึงผู้รับ โปรโตคอล UDP มักใช้กับข้อมูลที่ต้องการความรวดเร็วและสามารถผิดพลาดได้บ้าง เช่น การรับ-ส่งข้อมูลวีดีโอสตรีมมิ่ง การรับ-ส่งข้อมูลภายในเกมออนไลน์ โปรโตคอลประยุกต์ที่นำไปใช้งาน เช่น DNS SNMP
โปรโตคอล TCP เป็นโปรโตคอลที่ใช้รับ-ส่งข้อมูลที่นิยมใช้งานมากที่สุดในโลกอินเตอร์เน็ต เนื่องจากการรับ – ส่งข้อมูลบนโปรโตคอล TCP จะมีการตรวจสอบผลการรับ – ส่งข้อมูลทุกครั้ง ข้อมูลที่ได้จึงมีความถูกต้องตามลำดับการส่งข้อมูล ทำให้ถูกใช้เป็นพื้นฐานของโปรโตคอลประยุกต์ต่าง ๆ เช่น HTTP FTP SSH IMAP
ในปัจจุบันความเร็วของอินเตอร์เน็ตได้พัฒนาไปมาก ทำให้โปรโตคอล TCP ถูกนำมาใช้งานในด้านสตรีมมิ่งมากขึ้น ส่งผลให้การใช้งานด้านสตรีมมิ่งมีการใช้งานทั้ง TCP และ UDP ในปริมาณที่ใกล้เคียงกัน
การใช้งานโปรโตคอล TCP จะแบ่งออกเป็น 2 ฝั่ง คือ
ในบทนี้จะเป็นการเรียนรู้ฟังก์ชั่นและทดลองใช้งานการสื่อสารบนโปรโตคอลพื้นฐานที่สุดอย่าง TCP เพื่อปูพื้นฐานไปสู่การใช้โปรโตคอลประยุกต์อื่น ๆ ต่อไป
ฟังก์ชั่นจะแบ่งเป็นทางด้านสร้าง TCP Server และใช้ TCP Client โดยฟังก์ชั่นเริ่มต้นและฟังก์ชั่นยกเลิกการเชื่อมต่อจะต่างกัน แต่จะมีฟังก์ชั่นที่ใช้รับ-ส่งข้อมูลที่เหมือนกัน
การสร้าง TCP Server จะต้องเรียกใช้ไลบารี่ WiFi.h ทุกครั้ง และการใช้งานจะต้องสร้างออปเจคของคลาส WiFiServer ขึ้นมานอกฟังก์ชั่นย่อย มีรูปแบบดังนี้
WiFiServer::WiFiServer(int port=80, int max_clients=4);
มีรายละเอียดของพารามิเตอร์ดังนี้
เริ่มต้นสร้าง TCP Server – จะใช้ฟังก์ชั่นย่อย .begin() มีรูปแบบการใช้งานดังนี้
void WiFiServer::begin();
ไม่มีค่าพารามิเตอร์ และไม่มีการตอบกลับ ฟังก์ชั่นย่อย .begin() จะต้องนำไปไว้ในฟังก์ชั่น setup ทุกครั้ง เพื่อให้เริ่มสร้าง TCP Server ขึ้นมาใช้งาน
ตรวจสอบการเชื่อมต่อเข้ามา – หลังจากใช้ฟังก์ชั่นย่อย .begin() ไปแล้ว จะต้องเริ่มตรวจสอบว่ามี Client เข้ามาเชื่อมต่อหรือไม่ ใช้ฟังก์ชั่นย่อย .available() ซึ่งมีรูปแบบการใช้งานดังนี้
WiFiClient WiFiServer::available();
ไม่มีค่าพารามิเตอร์ และตอบข้อมูลกลับมาในรูปของคลาส WiFiClient
การใช้งาน TCP Client จะต้องเรียกใช้บารี่ WiFi.h ก่อนทุกครั้ง และฟังก์ชั่นย่อยบางส่วนที่ใช้ใน TCP Client จะถูกนำไปใช้งานใน TCP Server ด้วย การจะใช้งาน TCP Client ได้ จะต้องสร้างออปเจคของคลาส WiFiClient ขึ้นมาก่อนใช้งาน โดยสามารถประกาศสร้างไว้นอกฟังก์ชั่นย่อย หรือในฟังก์ชั่นย่อยได้แบบเดียวกับการประกาศตัวแปร ซึ่งการสร้างออปเจคของคลาส WiFiClient จะมีรูปแบบดังนี้
WiFiClient::WiFiClient()
ไม่มีค่าพารามิเตอร์
เชื่อมต่อกับ Server – ใช้ฟังก์ชั่นย่อย .connect() มีรูปแบบการใช้งานดังนี้
int WiFiClient::connect(IPAddress ip, int port);
หรือ
int WiFiClient::connect(const char *host, int port);
มีรายละเอียดของพารามิเตอร์ดังนี้
และมีค่าที่ตอบกลับเป็นชนิด int หากมีค่ามากกว่า 0 จะหมายถึงเชื่อมต่อสำเร็จ
การตรวจสอบการเชื่อมต่อกับ Server – หลังจากเชื่อมต่อสำเร็จแล้ว ขั้นตอนต่อไปคือการสื่อสาร ในระหว่างการสื่อสารจะต้องมีการตรวจสอบตลอดเวลาว่ายังเชื่อมต่อกับ Server อยู่หรือไม่ เพื่อให้โปรแกรมที่ทำไว้ทำงานไม่ผิดพลาด ซึ่งจะใช้ฟังก์ชั่นย่อย .connected() ในการตรวจสอบ มีรูปแบบการใช้งานดังนี้
int WiFiClient::connected();
ไม่มีค่าพารามิเตอร์ และมีการตอบกลับเป็นข้อมูลชนิด int หากมีค่ามากกว่า 0 จะหมายถึงเชื่อมต่ออยู่
การรับ – ส่งข้อมูล – ฟังก์ชั่นที่รับ – ส่งข้อมูลจะรองรับฟังก์ชั่นเดียวกับการใช้งาน UART ซึ่งรองรับฟังก์ชั่นย่อย .available().readStringUntil() .readString() .read() .write() .print() .println() และฟังก์ชั่นอื่น ๆ อีกมากมาย
ล้างข้อมูลใน Buffer – เมื่อต้องการยกเลิกการเชื่อมต่อ จำเป็นที่จะต้องล้างข้อมูลที่จะยังไม่ได้อ่านออกมาเพื่อคืนพื้นที่ให้กับแรม ซึ่งใช้งานฟังก์ชั่นย่อย .flush(); ในการล้างค่า มีรูปแบบการใช้งานดังนี้
void WiFiClient::flush();
ไม่มีค่าพารามิเตอร์ และไม่มีค่าที่ตอบกลับ
ยกเลิกการเชื่อมต่อกับ Server – ใช้ฟังก์ชั่นย่อย .stop() ในการยกเลิก มีรูปแบบการใช้งานดังนี้
void WiFiClient::stop();
ไม่มีค่าพารามิเตอร์ และไม่มีค่าที่ตอบกลับ
สามารถเข้าไปคัดลอกโปรแกรมตัวอย่างได้ที่ https://goo.gl/nRaJLS จากนั้นแก้ไข WIFI_STA_NAME และ WIFI_STA_PASS ให้ถูกต้อง
เปิด Serial Monitor ขึ้นมาก่อน ปรับไปที่ 115200 band จากนั้นอัพโหลดโค้ดโปรแกรมลงบอร์ด NodeMCU-32S ได้เลย แล้วรอจนกว่า Serial Monitor แสดงหมายเลข IP ขึ้นมา
ใช้คอมพิวเตอร์ที่อยู่วงแลนเดียวกับ ESP32 หรือเชื่อมต่อ WiFi ตัวเดียวกับ ESP32 เปิดโปรแกรม Hercules ขึ้นมา (ดาวน์โหลด ได้ที่ https://goo.gl/Y5p8ad) เมื่อเปิดขึ้นมาแล้วให้ไปที่ TCP Client แล้วกรอกช่อง Module IP เป็นหมายเลข IP ใน Serial Monitor จากนั้นกรอก Port เป็น 80 แล้วกด Connect
เมื่อเชื่อมต่อสำเร็จ ที่โปรแกรม Hercules จะแสดงคำว่า Connected และในหน้าต่าง Serial Monitor จะแสดงคำว่า new client
ที่โปรแกรม Hercules ในส่วน Send ด้านล่าง เลือกกรอกข้อความลงในช่องและกด Send จะพบว่าข้อความแสดงที่ Serial Monitor และในโปรแกรม Hercules โดยตัวอักษรสีดำหมายถึงตัวอักษรที่ส่งข้อมูลไป และตัวอักษรสีชมพู คือตัวอักษรที่ส่งข้อมูลกลับมา
เมื่อกดปุ่ม Disconnect ที่หน้าต่าง Serial Monitor จะแจ้งว่า Client ตัดการเชื่อมต่อแล้ว
ผลที่ได้จากการทดลองนี้จะเห็นได้ว่าเราสามารถทดลองสื่อสารผ่าน TCP ได้แล้ว โดยโค้ดที่ใช้ในการทดลองมีดังนี้
บรรทัดที่ 1 ใช้คำสั่ง #include เรียกใช้ไลบารี่ WiFi.h
บรรทัดที่ 3 แทน WIFI_STA_NAME ด้วย “xxxxxxxx” ซึ่งในส่วนนี้จะใช้กำหนดชื่อ WiFi ที่ต้องการเชื่อมต่อด้วย
บรรทัดที่ 4 แทน WIFI_STA_NAME ด้วย ” xxxxxxxxxx” ซึ่งในส่วนนี้จะใช้กำหนดรหัสผ่าน WiFi
บรรทัดที่ 6 สร้างออปเจค server โดยใช้คลาส WiFiServer กำหนด Port เป็น 80
บรรทัดที่ 8 สร้างฟังก์ชั่น setup
บรรทัดที่ 9 เริ่มใช้งาน UART0 ที่ความเร็ว 115200
บรรทัดที่ 10 กำหนดให้ขาใน LED_BUILTIN เป็นเอาต์พุตแบบดิจิตอล
บรรทัดที่ 12 – 15 แสดงผลข้อความไปที่ Serial Monitor
บรรทัดที่ 17 ใช้ฟังก์ชั่น WiFi.mode() กำหนดโหมดใช้งานเป็น STA
บรรทัดที่ 18 ใช้ฟังก์ชั่น WiFi.begin() เริ่มเชื่อมต่อไปที่ Access Point ที่กำหนด
บรรทัดที่ 20 ใช้คำสั่ง while() วนรอบทำคำสั่งในปีกกาหากฟังก์ชั่น WiFi.status() ไม่ส่งกลับค่ามาเป็น WL_CONNECTED
บรรทัดที่ 21 หน่วงเวลา 500 มิลิวินาที หรือครึ่งวินาที
บรรทัดที่ 22 แสดงผลจุด ไปที่ Serial Monitor
บรรทัดที่ 23 สลับสถานะของขา GPIO ตามขาที่อยู่ใน LED_BUILTIN ผลของบรรทัดนี้ทำให้หลอด LED บนบอร์ด NodeMCU-32S กระพริบตลอดเวลาที่รอเชื่อมต่อ
บรรทัดที่ 24 จบคำสั่งในปีกกาของคำสั่ง while
บรรทัดที่ 26 กำหนดให้ขาที่อยู่ใน LED_BUILTIN มีสถานะเป็น HIGH
บรรทัดที่ 27 – 30 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 32 เริ่มใช้งาน TCP Server
บรรทัดที่ 33 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 35 สร้างฟังก์ชั่น loop
บรรทัดที่ 36 ใช้ฟังก์ชั่นย่อย .available() ตรวจสอบ client ใหม่ แล้วนำไปเก็บในออปเจค client
บรรทัดที่ 38 นำตัวแปร client ตรวจสอบว่าเป็น True หรือไม่ ถ้าใช้จะทำโปรแกรมในปีกกา
บรรทัดที่ 39 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 40 ใช้คำสั่ง while วนรอบเมื่อค่าที่ได้จากฟังก์ชั่นย่อย .connected() เป็นจริง
บรรทัดที่ 41 ใช้คำสั่ง if ตรวจสอบค่าที่ได้จากฟังก์ชั่นย่อย .available() ว่ามากกว่า 0 หรือมีการส่งข้อมูลเข้ามาหรือไม่ ถ้าใช้ ทำคำสั่งในปีกกา
บรรทัดที่ 42 ใช้ฟังก์ชั่นย่อย .read() อ่านข้อมูลที่ส่งมา แล้วนำไปเก็บในตัวแปร c
บรรทัดที่ 43 ใช้ฟังก์ชั่นย่อย .write() ส่งข้อมูลในตัวแปร c ออกไป
บรรทัดที่ 44 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 45 จบคำสั่งใน if
บรรทัดที่ 46 หน่วงเวลา 1 มิลิวินาที หรือ 0.001 วินาที
บรรทัดที่ 47 จบคำสั่งในคำสั่ง while
บรรทัดที่ 48 ใช้ฟังก์ชั่นย่อย .stop() ยุติการเชื่อมต่อกับ Client
บรรทัดที่ 49 แสดงผลข้อความไปที่ Serial Monitor
บรรทัดที่ 50 จบคำสั่งใน if
บรรทัดที่ 51 หน่วงเวลา 10 มิลิวินาที หรือ 0.01 วินาที
บรรทัดที่ 52 จบคำสั่งในฟังก์ชั่น loop
จะเห็นได้ว่าโค้ดที่ใช้ทดลองจะแบ่งเป็น 2 ส่วน คือส่วนที่เป็นการเชื่อมต่อ WiFi ที่ได้เรียนรู้จากในบทที่ผ่านมา และส่วนที่เกี่ยวข้องกับการสื่อสารผ่าน TCP การแบ่งทำความเข้าใจไปทีละส่วนทีละบท จึงทำให้สามารถเข้าใจและสนใจไปในส่วนที่ต้องการเรียนรู้ได้ดี
การทดลองใช้ TCP Client จะเป็นการปูพื้นฐานไปสู่การใช้งานโปรโตคอลประยุกต์อื่น ๆ ซึ่งล้วนต้องมีการเชื่อมต่อผ่าน TCP Client ก่อน แล้วจึงเริ่มมีการรับ – ส่งข้อมูลตามข้อกำหนดของแต่ละโปรโตคอล การทดลองนี้จะใช้เครื่องคอมพิวเตอร์ที่อยู่วงแลนเดียวกับ ESP32 เป็นเซิร์ฟเวอร์เพื่อให้ ESP32 ทดสอบเข้ามาเชื่อมต่อเพื่อสื่อสาร
ก่อนอื่นจะต้องมีการตรวจสอบหมายเลข IP ในวงแลนของเครื่องที่จะทำเป็นเซิร์ฟเวอร์เสียก่อน โดยไปที่กลุ่มไอค่อนเมนูด้านล่างขวา คลิกขวาที่ไอค่อน หรือไอค่อน
แล้วเลือก Open Network and ….
จากนั้นตรง Connections คลิกที่คำว่า Ethernet หรือ Wi-Fi
จากนั้นกดไปที่ปุ่ม Details…
แล้วเก็บตรงส่วน IPv4 Address ไว้ก่อน เพื่อใช้นำไปแก้ไขในโค้ดโปรแกรมต่อไป
เปิดโปรแกรม Hercules ขึ้นมา จากนั้นกดไปที่ TCP Server ที่ช่อง Port กรอกเป็น 8000 แล้วกดปุ่ม Listen
เพียงเท่านี้คอมพิวเตอร์ที่ได้ใช้ทดลองก็ได้ตั้ง TCP Server ขึ้นมาแล้วที่พอร์ต 8000 รอเพียง ESP32 เข้ามาเชื่อมต่อเท่านั้น
จากนั้นไปคัดลอกโค้ดโปรแกรมทดลองได้ที่ https://goo.gl/I8v4Ra นำมาแก้ไขตรงส่วนของฟังก์ชั่นย่อย .connect() โดยแก้พารามิเตอร์ host เป็นหมายเลข IP ที่ได้จากขั้นตอนที่แล้ว แก้ตรงส่วน WIFI_STA_NAME และ WIFI_STA_PASS เป็น WiFi ที่อยู่ในวงแลนวงเดียวกับเครื่องคอมพิวเตอร์ที่ทำเป็นเซิร์ฟเวอร์ แล้วอัพโหลดโค้ดโปรแกรมลงบอร์ด NodeMCU-32S ได้เลย
เมื่ออัพโหลดโปรแกรมเสร็จแล้ว ให้เปิด Serial Monitor ขึ้นมา ปรับเป็น 115200 band แล้วรอจนกว่าจะเชื่อมต่อ WiFi เสร็จ จนเชื่อมต่อกับเซิร์ฟเวอร์ที่สร้างไว้สำเร็จ
มาที่โปรแกรม Hercules สามารถทดลองส่งข้อความ โดยพิมพ์ในช่อง Send แล้วกดปุ่ม Send ได้เลย
ที่ช่อง Sent data จะแสดงข้อมูลที่ส่งออกไป และช่อง Received data จะแสดงข้อมูลที่รับเข้ามา และที่ Serial Monitor จะแสดงข้อมูลที่ได้รับมา
เมื่อกดที่ปุ่ม Close จะเป็นการยุติการสร้าง TCP Server ที่หน้าต่าง Serial Monitor จะแสดงข้อความว่า Disconnect. เมื่อ ESP32 ยุติการเชื่อมต่อกับ Server
และโค้ดที่ได้ทำการทดลองมีดังนี้
บรรทัดที่ 1 ใช้คำสั่ง #include เรียกใช้ไลบารี่ WiFi.h
บรรทัดที่ 3 แทน WIFI_STA_NAME ด้วย “xxxxxxxxxx” ซึ่งในส่วนนี้จะใช้กำหนดชื่อ WiFi ที่ต้องการเชื่อมต่อด้วย
บรรทัดที่ 4 แทน WIFI_STA_NAME ด้วย ” xxxxxxxxxx” ซึ่งในส่วนนี้จะใช้กำหนดรหัสผ่าน WiFi
บรรทัดที่ 6 สร้างฟังก์ชั่น setup
บรรทัดที่ 7 เริ่มใช้งาน UART0 ที่ความเร็ว 115200
บรรทัดที่ 8 กำหนดให้ขาใน LED_BUILTIN เป็นเอาต์พุตแบบดิจิตอล
บรรทัดที่ 10 – 13 แสดงผลข้อความไปที่ Serial Monitor
บรรทัดที่ 15 ใช้ฟังก์ชั่น WiFi.mode() กำหนดโหมดใช้งานเป็น STA
บรรทัดที่ 16 ใช้ฟังก์ชั่น WiFi.begin() เริ่มเชื่อมต่อไปที่ Access Point ที่กำหนด
บรรทัดที่ 18 ใช้คำสั่ง while() วนรอบทำคำสั่งในปีกกา หากฟังก์ชั่น WiFi.status() ไม่ส่งกลับค่ามาเป็น WL_CONNECTED
บรรทัดที่ 19 หน่วงเวลา 500 มิลิวินาที หรือครึ่งวินาที
บรรทัดที่ 20 แสดงผลจุด ไปที่ Serial Monitor
บรรทัดที่ 21 สลับสถานะของขา GPIO ตามขาที่อยู่ใน LED_BUILTIN ผลของบรรทัดนี้ทำให้หลอด LED บนบอร์ด NodeMCU-32S กระพริบตลอดเวลาที่รอเชื่อมต่อ
บรรทัดที่ 22 จบคำสั่งในปีกกาของคำสั่ง while
บรรทัดที่ 24 กำหนดให้ขาที่อยู่ใน LED_BUILTIN มีสถานะเป็น HIGH
บรรทัดที่ 25 – 28 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 30 สร้างออปเจค client ด้วยคลาส WiFiClient
บรรทัดที่ 32 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 33 ใช้ฟังก์ชั่นย่อย .connect() เชื่อมต่อไปยัง IP ที่กำหนด และกำหนดพอร์ตเป็น 8000 จากนั้นใช้คำสั่ง if ในการตรวจสอบผลการเชื่อมต่อ ถ้าสามารถเชื่อมต่อได้จะเข้าไปทำคำสั่งในปีกกา
บรรทัดที่ 34 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 35 ใช้คำสั่ง while วนลูปทำคำสั่งในปีกกาเมื่อมีการเชื่อมต่อกับเซิร์ฟเวอร์อยู่
บรรทัดที่ 36 ใช้คำสั่ง if ตรวจสอบว่ามีข้อมูลใหม่เข้ามาหรือไม่ ถ้ามีเข้ามาใหม่ให้ทำคำสั่งในปีกกา
บรรทัดที่ 37 อ่านข้อมูลออกมา 1 ตัวอักษร หรือ 1 ไบต์ แล้วนำไปเก็บในตัวแปร c
บรรทัดที่ 38 ส่งข้อมูลในตัวแปร c กลับไปยังเซิร์ฟเวอร์
บรรทัดที่ 39 แสดงผลตัวแปร c ไปที่ Serial Monitor
บรรทัดที่ 40 จบคำสั่งใน if
บรรทัดที่ 41 หน่วงเวลา 1 มิลิวินาที หรือ 0.001 วินาที
บรรทัดที่ 42 จบคำสั่งใน while
บรรทัดที่ 43 ใช้ฟังก์ชั่นย่อย .stop() เพื่อตัดการเชื่อมต่อกับเซิร์ฟเวอร์
บรรทัดที่ 44 – 45 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 46 จบคำสั่งใน if และเมื่อใช้เงื่อนไขใน if เป็นเท็จ จะทำในปีกกาของ else
บรรทัดที่ 47 แสดงผลไปที่ Serial Monitor
บรรทัดที่ 48 จบคำสั่งใน else
บรรทัดที่ 49 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 51 สร้างและจบคำสั่งในฟังก์ชั่น loop
เนื่องจากหลอด LED บนบอร์ด NodeMCU-32S ได้ถูกนำไปใช้งานบอกสถานะการเชื่อมต่อ WiFi แล้ว จึงต้องต่อหลอด LED เพิ่มขึ้นมาเพื่อใช้ในการทดลอง โดยต่อได้ตามวงจรด้านล่างนี้
จากนั้นให้เข้าไปคัดลอกโปรแกรมตัวอย่างได้ที่ https://goo.gl/oljJw0 แก้ตรงส่วน WIFI_STA_NAME และ WIFI_STA_PASS จากนั้นอัพโหลดโค้ดโปรแกรมลง NodeMCU-32S ได้เลย เปิด Serial Monitor ขึ้นมา ปรับไปที่ 115200 รอจนกว่าจะเชื่อมต่อ WiFi เสร็จ และขึ้นหมายเลข IP มา
ใช้คอมพิวเตอร์ที่อยู่ในวงแลนเดียวกับ ESP32 เปิดโปรแกรม Hercules ขึ้นมา แล้วกดไปที่ TCP Client จากนั้นกรอกหมายเลข IP ของ ESP32 ลงในช่อง Module IP และกรอกช่อง Port เป็น 80 แล้วกด Connect จากนั้นในกลุ่มของ Send ด้านล่าง เลือกใช้งาน 2 ช่อง กรอก ON และ OFF อย่างละช่อง จากนั้นทดลองกดปุ่ม Send ประจำช่องนั้น ๆ ผลที่คือเมื่อส่ง ON หลอด LED ที่ต่อเพิ่มไว้จะติด และเมื่อส่ง OFF หลอด LED จะดับ พร้อมทั้งแจ้งผลกลับมาเป็น OK ให้รับรู้
ที่หน้าต่าง Serial Monitor จะแสดงสถานะการควบคุมหลอด LED ให้ทราบ
จากผลการทดลองที่สามารถทำให้หลอด LED ติด – ดับ ได้ตามที่ส่งข้อมูลไป ได้มีการใช้โค้ดในการทดลองดังนี้
เนื่องจากโค้ดส่วนใหญ่จะเหมือนกับในหัวข้อ ทดลองสร้าง TCP Server ดังนั้นจะอธิบายเฉพาะบรรทัดที่เพิ่มขึ้นมาเท่านั้น ซึ่งบรรทัดที่เพิ่มเติมขึ้นมามีดังนี้
บรรทัดที่ 6 ประกาศแทน LED_PIN ด้วยเลข 23 ใช้กำหนดขา GPIO ที่ต่ออยู่กับหลอด LED
บรรทัดที่ 43 กำหนดให้ตัดข้อความเมื่อไม่มีการส่งข้อมูลเข้ามาเกิน 100 มิลิวินาที หรือ 0.1 วินาที
บรรทัดที่ 46 ใช้ฟังก์ชั่นย่อย .readString() อ่านข้อมูลที่ส่งเข้ามา แล้วนำข้อมูลที่ได้ไปเก็บไว้ในตัวแปร msg
บรรทัดที่ 47 ใช้ Ternary Operators เปรียบเทียบตัวแปร msg ว่าเป็น ON หรือไม่ ถ้าใช่ จะส่งค่า HIGH กลับไป และถ้าไม่ใช่ จะส่งค่า LOW กลับไป ค่าที่ส่งกลับไปถูกนำไปใช้เขียนข้อมูลออกขา GPIO แบบดิจิตอลด้วยฟังก์ชั่น digitalWrite()
บรรทัดที่ 48 ใช้ฟังก์ชั่นย่อย .print() ส่งข้อมูลไปที่ Client
บรรทัดที่ 49 ส่งข้อความไปที่ Serial Monitor
ในบทนี้เป็นการเรียนรู้ใช้งานฟังก์ชั่นต่าง ๆ ที่เกี่ยวข้องกับโปรโตคอล TCP ซึ่งเป็นพื้นฐานของโปรโตคอลประยุกต์ที่จะเรียนรู้ในบทต่อไปคือ HTTP การใช้โปรโตคอล TCP ในการสื่อสารโดยตรงมีข้อดีที่สามารถกำหนดรูปแบบการสื่อสารได้เอง และเหมาะสำหรับการรับ – ส่งข้อมูลที่ต้องการความรวดเร็วและถูกต้อง นอกจากนี้ในบทนี้ยังมีการทดลองควบคุมหลอด LED ผ่านโปรโตคอล TCP เพื่อให้สามารถเข้าใจได้มากขึ้นว่าหากนำไปใช้งานจริงจะมีรูปแบบการเขียนโปรแกรมอย่างไร