การควบคุมโมดูลไอโอทีผ่านเว็บแอพพลิเคชั่นด้วยโปรโตคอล TCP/UDP

Image placeholder
แวะมาทักทายกันได้

หลายคนที่เคยเล่นบอร์ด Arduino ตระกูล ESP คงจะคุ้นเคยกันเป็นอย่างดีในการทำ Web Server เพื่อควบคุมหรือดูผลลัพท์ข้อมูลจาก Sensor บนบอร์ดโดยตรงอย่างเช่นในบทความด้านล่างนี้ 

ฝากกดโฆษณา Google Ads สัก click  เพื่อเป็นกำลังใจแก่ผู้เขียนด้วยนะครับ

https://randomnerdtutorials.com/esp8266-relay-module-ac-web-server/


แล้วถ้าเราต้องการควบคุมมากกว่า 1 จุดล่ะ??? คำตอบที่ได้อาจจะใช้ Module หลายตัว แล้วใช้ Web Server ตามแต่ละ Module โดยระบุตาม IP Address ไป หน้าตาของระบบก็จะประมาณนี้


มีหลายเว็บเหมือนภาพด้านบน น่าจะปวดหัวน่าดู เพราะอาจจะทำให้สับสนได้ วิธีแก้ก็อาจจะตั้งชื่อให้ต่างกัน ก็อาจจะช่วยได้ แต่ไม่ Make Sense ที่จะทำ


เราก็สร้างเว็บแอพพลิเคชั่นขึ้นมาระบบหนึ่งเพื่อที่จะจัดการควบคุมและสั่งงานไปยัง Node ต่างๆในระบบของเรา จะได้เหมือนภาพด้านบน คราวนี้เราก็จะได้เว็บเดียวที่สามารถควบคุม Module ใดๆก็เพียงเพจหนึ่งเพจเท่านั้น ดูง่ายขึ้นเยอะเลยใช่มั้ย


คราวนี้ก็เกิดคำถามว่าแล้วเราจะควบคุม บอร์ดต่างๆด้วยเว็บเดียวอย่างไร

มาทำความรู้จักกับระบบสื่อสารที่มีมาอย่างยาวนานนั้นก็คือ Protocol TCP/UDP ที่นำมาอธิบายเพื่อแก้ปัญหานี้ สำหรับบทความนี้ผู้เขียนจะเน้นเขียนไปในทางการนำมาประยุกต์ใช้ จึงขอกล่าวถึง TCP และ UDP แบบคร่าวๆเท่านั้น เพื่อให้พอเห็นภาพ 

โปรโตคอลทั้งสอง TCP/UDP เป็นโปรโตคอลในชั้น Transport Layer ซึ่งสามารถสร้างข้อมูล Package เพื่อเกาะหรือเรียงต่อกันไปบน Internet Protocol ได้ซึ่งหมายความว่าทั้งสองโปรโตคอลนั้นสามารถใช้ IP Address ในการ รับและส่งข้อมูลไปยังคอมพิวเตอร์ปลายทางได้เหมือนกัน 

สิ่งที่แตกต่างระหว่างสองโปรโตคอลนี้ที่แยกอย่างชัดเจนจะเป็นเรื่องของวิธีการและมาตรฐานของการสื่อสารที่อธิบายได้อย่างง่ายๆ คือ

การเชื่อมต่อ (Connection) คือ การทำให้มั่นใจได้ว่า ผู้ส่งและผู้รับ มีตัวตนและสามารถส่งข้อมูลได้ถูกต้องและส่งได้อย่างแน่นอน

สถานะ (state) คือ ความสามารถในการรู้สถานะของสารที่ส่ง เช่น ส่งข้อมูลถึงมือของผู้รับแล้วหรือไม่ และ ถูกต้องครบถ้วนหรือไม่

ลำดับการส่งข้อมูล (Sequence) คือ สารที่ส่งไปจะถูกต้องได้จะต้องเรียงลำดับข้อมูลไปยังผู้รับอย่างถูกต้อง ซึ่งจะเน้นย้ำลำดับในการส่งข้อมูล ถ้าลำดับข้อมูลยังส่งไม่ได้ ข้อมูลลำดับที่ 2,3 ก็จะต้องรอจนกว่าลำดับที่ 1 จะส่งสำเร็จ 

ซึ่งทั้ง สามอย่างที่กล่าวมา TCP มีทั้งหมดแต่ UDP ไม่มีเพราะถูกออกแบบมาให้ทำงานอย่างเรียบง่าย และส่งข้อมูลได้อย่างรวดเร็ว

รายละเอียดขั้นตอนอย่างละเอียดของการทำงานโปรโตคอล TCP/UDP สามารถหาอ่านได้บทความทั่วไปผู้เขียนคิดว่าน่าจะเพียงพอต่อการมองเห็นภาพในการนำมาประยุกต์ใช้งานในบทความนี้

ถ้าจากบทความด้านบนที่แปะ link เอาไว้นั้น สั่งเกตได้ว่า จะใช้ Protocol ของ HTTP ซึ่งอันที่จริง HTTP มีลักษณะขั้นตอนการสื่อสารที่อยู่ในรูปแบบของ TCP เช่นกัน เมื่ออ่านมาถึงตรงนี้อาจจะสงสัยว่าแล้วทำไมถึงไม่ใช้ Protocol HTTP เหมือนกับในบทความที่กล่าวถึง ทำไมต้องมาใช้ TCP หรือ UDP 

HTTP เป็นโปรโตคอลหนึ่งที่สื่อสารผ่าน Application Browser ซึ่งมีหน้าที่เอาไว้ติดต่อกับผู้ใช้ซึ่งเป็น TCP รูปแบบหนึ่งที่ใช้ IP Address กรณีที่เป็น Module เดียวจึงสามารถควบคุม Module เพียง IP Address ตัวเดียวกันกับที่ติดต่อกับผู้ใช้ได้ แต่ว่าเมื่อมี Module หลายตัวแล้ว HTTP ที่สามารถใช้ได้กับ IP Address เพียง IP เดียวคือ IP ที่ใช้ติดต่อกับผู้ใช้ จึงจำเป็นจะต้องนำ Protocol TCP หรือ UDP เข้ามาช่วยในการสื่อสารไปยัง IP Address ต่างๆที่ระบุปลายทาง


เห็น concept มาพอสมควรแล้วคราวนี้เรามาดูในส่วนของ code กันบ้าง ผู้เขียนจะขอยกตัวอย่างเฉพาะ UDP เท่านั้น ผู้เขียนใช้ Nodejs ในการเขียนเว็บแอพพลิเคชั่น


UDP-SERVER


var PORT = 33332;
var HOST = '127.0.0.1';

var dgram = require('dgram');
var server = dgram.createSocket('udp4');

server.on('listening', function() {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ':' + address.port);
});

server.on('message', function(message, remote) {
console.log(remote.address + ':' + remote.port +' - ' + message);
});

server.bind(PORT);




UDP-CLIENT

var PORT = 33332;
var HOST = '127.0.0.1';

var dgram = require('dgram');
var message = new Buffer('SKLSONGKIAT is Engineer!');

var client = dgram.createSocket('udp4');
client.send(message, 0, message.length, PORT, HOST, function(err, bytes) {
if (err) throw err;
console.log('UDP message sent to ' + HOST +':'+ PORT);
client.close();
});



อธิบาย Code อย่างคร่าวๆ คือ ในการเชื่อมต่อ ของ Client จะเชื่อมต่อผ่าน Port 33332 ด้วย IP Localhost (127.0.0.1) เพราะอยู่บนเครื่องเดียวกันโดยที่ส่งข้อมูลมาด้วยข้อความสตริง "SKLSONGKIAT is Software Engineer!"  และ ที่ UDP-SERVER ก็จะต้อง Listen ด้วย Port เดียวกันไม่เช่นนั้นจะไม่ได้ข้อมูล ก็เหมือนกับหาประตูเข้าไม่เจอ



ลองเอา Code ไปประยุกต์ดูบนเว็บแอพพลิเคชั่นของตัวเองได้ โดยใช้ Code ฝั่ง Client แล้วติดต่อไปยัง Module IOT ต่างๆโดยให้ เป็นฝั่ง Server อย่างเช่น Code ในเว็บด้านล่างนี้

https://www.instructables.com/ESP32-Control-Via-UDP-Datagrams/?fbclid=IwAR0urdd_Oc-CMdiVxGbQGJeum7GxeyZ_fUOyBCVHFQHWMT5QVemPEQFMVp0

ผู้เขียนทดสอบมาแล้ว ใช้งานได้จริงๆ 



แวะมาทักทายกันได้
donate