หลังจากได้กล่าวถึงคลาส ESP8266WiFi ไปในบทความก่อนหน้านี้ ครั้งนี้มาเรียนรู้เกี่ยวกับการใช้คลาส WiFiClient เพื่อเขียนโปรแกรมในฝั่งลูกข่ายที่เชื่อมโยงไปยังเครื่องให้บริการหรือ Server
เมื่อผู้เขียนโปรแกรมได้ทำการเชื่อมต่อเข้ากับเครือข่ายไร้สายในโหมด STA ทำให้ไมโครคอนโทรลเลอร์สามารถใช้งานเครือข่ายอินเทอร์เน็ตทั้งแบบเครือข่ายภายในและเครือข่ายภายนอก จึงสามารถเขียนโปรแกรมเพื่อเป็นลูกข่ายเข้าใช้บริการผ่านทางหมายเลขพอร์ตสื่อสารของเครื่องให้บริการที่ต้องการเข้าถึงด้วยหมายเลขไอพี
WiFiClient
คลาส WiFiClient ที่ผู้เขียนโปรแกรมจะต้องสร้างวัตถุจากคลาสนี้เพื่อเชื่อมต่อไปยังเครื่องให้บริการผ่านทาง IP Address และหมายเลขพอร์ตที่ต้องการสื่อสาร ซึ่งการสร้างวัตถุประเภท WiFiClient เขียนคำสั่งได้ดังนี้
WiFiClient ชื่อวัตถุ;
การขอเชื่อมต่อไปยังเครื่องให้บริการที่หมายเลขไอพีและพอร์ตที่ต้องการนั้นใช้คำสั่ง connect() ตามรูปแบบการใช้งานต่อไปนี้ โดยผลลัพธ์ที่ได้กลับมาเป็น true หรือ false นอกจากนี้ต้องสร้างตัวแปรตำแหน่งไอพีของเครื่องให้บริการจากคลาส IPAddress
IPAddress หมายเลขไอพี( xx, xx, xx, xx );
ผลของการเชื่อมต่อ = วัตถุ.connect( หมายเลขไอพี, หมายเลขพอร์ต );
หรือ กรณีที่เครือข่ายไร้สายที่เชื่อมต่อนั้นมีบริการ DNS อยู่ในระบบ ทำให้สามารถใช้ชื่อ หรือ URL แทนหมายเลขไอพีได้ ดังนั้น รูปแบบของคำสั่งเชื่อมต่อจึงเป็นดังต่อไปนี้
ผลของการเชื่อมต่อ = วัตถุ.connect( URL, หมายเลขพอร์ต )
กรณีที่ต้องการทราบสถานะของการเชื่อมต่อให้เรียกใช้คำสั่ง connected() เพื่อดูผลลัพธ์ว่าเป็น true หรือ false
สถานะการเชื่อมต่อ = วัตถุ.connected()
การส่งข้อมูลไปยังเครื่องให้บริการที่เรียกว่าการร้องขอ (Request) ใช้คำสั่ง println() ดังนี้ ซึ่งคำร้องขอนั้นแตกต่างกันไปตามบริการหรือโพรโทคอลที่ต้องการสื่อสาร ผู้เขียนโปรแกรมต้องศึกษารายละเอียดเพิ่มเติม
วัตถุ.println( คำร้องขอ )
เมื่อต้องการทราบว่าเครื่องให้บริการได้ส่งข้อมูลกลับมาตามการร้องขอหรือไม่ จะต้องใช้คำสั่ง available() เป็นคำสั่งตรวจสอบสถานะของการมีข้อมูลส่งกลับจากเครื่องให้บริการดังต่อไปนี้
สถานะ = วัตถุ.available()
การอ่านข้อมูลตอบกลับจากเครื่องให้บริการใช้คำสั่ง read() ซึ่งให้ข้อมูลกลับมาเป็นไบต์ ดังนี้
ข้อมูล = วัตถุ.read()
เมื่อสิ้นสุดการเชื่อมต่อจะต้องเรียกใช้คำสั่ง stop() ดังนี้
วัตถุ.stop()
คำสั่งสำหรับอ่านสตริงจาก WiFiClient จนกว่าจะพบตัวอักษรที่ระบุคือ
วัตถุแบบสตริง=วัตถุ.readStringUntil( ตัวอักษรที่ต้องการ )
ตัวอย่างโปรแกรมสำหรับเชื่อมต่อเข้า AP เพื่อใช้งานระบบอินเทอร์เน็ต หลังจากนั้นร้องขอการเข้าถึง server ของ jarutex.com และอ่านค่าคืนกลับมาแสดง สุดท้ายปิดการทำงานเป็นดังนี้ และตัวอย่างผลลัพธ์เป็นดังภาพที่ 1
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#define AP_NAME "ชื่อAP"
#define AP_PASSWD "รหัสของAP"
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.println("\n\n");
WiFi.mode(WIFI_STA);
WiFi.begin( AP_NAME, AP_PASSWD );
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
if (client.connect("jarutex.com", 80)) {
Serial.println("Yes");
client.print(String("GET ") + "/" + " HTTP/1.1\r\n" +
"Host: " + "jarutex.com" + "\r\n" +
"Connection: close\r\n\r\n");
delay(1000);
while (client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
}
client.stop();
} else {
Serial.println("OMG!");
}
WiFi.disconnect();
}
void loop() {
}
สรุป
จากบทความนี้จะพบว่าการเชื่อมต่อในลักษณะลูกข่ายสามารถกระทำผ่านทางคลาส WiFiClient แต่อย่างไรก็ดีจะพบว่าเมื่อทดลองเชื่อมต่อกับเว็บซึ่งปัจจุบันบังคับให้ใช้โพรโทคอล https และใช้ IPv6 อาจจะทำให้การทำงานเกิดความผิดพลาด แต่อย่างไรก็ดี ใน examples ของ ESP8266 มีตัวอย่างการใช้งานกับ HTTPS ให้ศึกษาและนำไปปรับเปลี่ยนต่อไปได้ สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดต้องการพูดคุยสามารถคอมเมนท์ได้เลยครับ
แหล่งอ้างอิง
- Arduino : WiFiClient()
(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-31, 2021-11-04