สวัสดีครับ
หลังจากที่คราวที่แล้วเราได้ลองทำในส่วนของ Web server แล้ว
สิ่งสำคัญในการจะทำให้ติดต่อกับเจ้า RaspberryPi ที่เป็น module ในบ้านได้ ก็ต้องสร้างการเชื่อมต่อขึ้นมาครับ
ในคราวแรก กลุ่มเรากะจะให้ เป็น server แล้วให้ server ใหญ่ยิงคำสั่งการทำงานของระบบไฟฟ้ากลับไปที่ RaspberryPi ประมาณนี้ครับ
ปัญหามันมีอยู่ว่า ในการใช้งานจริง IP ที่จะใช้ในการติดต่อนั้นถูกเปลี่ยนแปลงไปตามการจ่าย IP ของแต่ละ ISP ที่ผู้ใช้มี วิธีหนึ่งที่จะทำให้สามารถติดต่อกันผ่านแนวคิดนี้ได้ก็คือการทำ VPN ครับ
เจ้า VPN นั้นถ้าพูดให้กระชับมันคือการสร้างเครือข่ายเสมือนว่าอยู่ในเครือข่ายเดียวกันโดยการสร้างช่องทาง (บางทีก็เรียกว่าท่อ) เพิ่มขึ้นมาโดยอาศัยช่องทางปกติที่ใช้กันอยู่เช่น internet เป็นต้น (ถ้าคนที่ชอบเล่นเกมส์ออนไลน์ฝั่งญี่ปุ่นหรืออเมริกาคงคุ้นเคยกันดี) ซึ่งในการทดลองสร้างนั้น เราได้ทำตามวิธีการที่ Digital Ocean แนะนำมา โดยการใช้ pptp สร้าง VPN จำลองขึ้นมา
อย่างไรก็ตาม เมื่อลองพิจารณาโมเดลนี้แล้ว ก็พบว่า การให้ RaspberryPi ทำตัวเป็น server นั้น นอกจากจะสิ้นเปลืองทรัพยากรระบบในการสั่งการเครื่องใช้ไฟฟ้าไปกับการทำงานเป็น server ซึ่งมีความซับซ้อนแล้ว การสั่งการแต่ละครั้งยังเปลืองแบนด์วิธทุกครั้งทั้งการส่งและการรับ กล่าวคือจะต้องมีการส่ง header ไปทุกครั้งที่มีการติดต่อ บางครั้งค่าที่ต้องการจะส่งมีขนาดเล็กกว่า header เสียด้วยซ้ำ ประหนึ่งการส่งจดหมายผ่านไปรษณีย์ที่ต้องจ่าหน้าทุกครั้งไม่ว่าจะส่งหรือตอบกลับจดหมายไปหาที่อยู่เดิม แม้จะเป็นการส่งข้อความหรือคำสนเท่ห์สั้นๆ จึงปรับเปลี่ยนขั้นตอนเป็นการให้ RaspberryPi เป็น client เปิดการเชื่อมต่อกับ server แบบ WebSocket แล้วติดต่อผ่านทาง WebSocket จนกว่าจะปิดเครื่องหรือเลิกใช้งานโปรแกรมหรือไม่ได้สั่งการนานเกินกว่าที่กำหนด ประหนึ่งการติดต่อทางโทรศัพท์ การส่งคำสั่งหรือ header ก็ทำเพียงตอนที่เริ่มติดต่อหรือโทรไปหาอีกฝ่าย แล้วคุยกันไปได้เรื่อยๆ โดยไม่ต้องบอกซ้ำทุกครั้งว่าโทรไปหาใคร จนกว่าจะกดวางสายจึงส่งคำสั่งสั้นๆ ว่าเลิกติดต่อแล้ว
อย่างไรก็ตาม การติดต่อผ่าน Websocket นั้น ตัว php เองสามารถทำได้เพียงฝั่ง server ส่วนฝั่ง client นั้น เนื่องจากเราไม่อยากให้ใช้ Apache หรือ Web server บน RaspberryPi จึงปรับฝั่งนี้ให้ใช้ Node.js แทน ซึ่งนอกจากจะกินทรัพยากรต่ำแล้ว ยังมี Library และชุมชนค่อนข้างดีอีกด้วย
สำหรับ Node.js เนื่องจากเป็น platform ใหม่สำหรับเรา จึงเริ่มจากการ hello world ก่อนครับ ^-^”
ต่อไปจะพูดถึงการทำ WebSocket อย่างจริงจังด้วย socket.io กันครับ