[TH] WiFiClient

หลังจากได้กล่าวถึงคลาส 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() {
}
ภาพที่ 1 ตัวอย่างผลลัพธ์จากการเชื่อต่อกับ jarutex.com

สรุป

จากบทความนี้จะพบว่าการเชื่อมต่อในลักษณะลูกข่ายสามารถกระทำผ่านทางคลาส WiFiClient แต่อย่างไรก็ดีจะพบว่าเมื่อทดลองเชื่อมต่อกับเว็บซึ่งปัจจุบันบังคับให้ใช้โพรโทคอล https และใช้ IPv6 อาจจะทำให้การทำงานเกิดความผิดพลาด แต่อย่างไรก็ดี ใน examples ของ ESP8266 มีตัวอย่างการใช้งานกับ HTTPS ให้ศึกษาและนำไปปรับเปลี่ยนต่อไปได้ สุดท้ายขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดต้องการพูดคุยสามารถคอมเมนท์ได้เลยครับ

แหล่งอ้างอิง

  1. Arduino : WiFiClient()

(C) 2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ

ปรับปรุงเมื่อ 2021-07-31, 2021-11-04