เบื้องหลังแอปเพื่อการค้นหาผู้ประสบภัยโดยปราศจากระบบโทรคมนาคม IamHere
ส่วนนี้ข้ามได้นะครับ ทักทายกันเฉย ๆ
สวัสดีครับ ไม่ได้กลับมาเขียนบล็อกนานมาก เคยมีคนขอไว้เมื่อนานมาแล้วว่าอยากให้อธิบายเรื่องกลไกภายในของแอป IamHere ซึ่งเป็นโปรเจ็กต์ที่ร่วมกับเพื่อนในมหาลัยพัฒนาขึ้นและนำไปส่งแข่งที่ประเทศญี่ปุ่น และการประกวดซอฟต์แวร์ระดับประเทศ (NSC) วันนี้เลยมานั่งเขียนอธิบายให้ฟังกัน พยายามเขียนแบบไม่มีเชิงเทคนิค แบบเดียวกับตอนอธิบายที่บูธการแข่งขันครับ
จุดประสงค์และการใช้งาน
IamHere เป็นแอปที่มีจุดประสงค์เพื่ออำนวยความสะดวกให้หน่วยกู้ภัยสามารถหาผู้ประสบภัยที่ติดอยู่ใต้ซากปรักหักพังได้รวดเร็วขึ้น โดยข้อกำหนดของแอปคือทั้งผู้ประสบภัยและหน่วยกู้ภัยต้องติดตั้งแอปนี้ไว้ตลอดเวลา ฝั่งของผู้ประสบภัยนั้นตัวแอปจะทำงานอัตโนมัติตั้งแต่การเปิดแอปเมื่อเปิดมือถือ และส่งสัญญาณระบุว่าตนอยู่บริเวณไหน
กลไกของแอปไม่ได้พึ่งพาสัญญาณระบุตำแหน่งอย่าง GPS แต่ใช้สัญญาณเสียงที่เรียบง่าย โดยเมื่อเกิดเหตุภัยพิบัติ หน่วยกู้ภัยจะเข้าพื้นที่เพื่อค้นหาผู้รอดชีวิต และเมื่อหน่วยกู้ภัยเปิดสัญญาณ WI-FI พิเศษผ่าน hotspot ของมือถือตนเอง (หน่วยกู้ภัย) และใช้ชื่อ WI-FI พิเศษที่แอปสร้างให้
เมื่อมือถือผู้ประสบภัยได้ตรวจพบสัญญาณ WI-FI พิเศษนี้จะทำการถอดคำสั่งที่แฝงมาในชื่อ WI-FI เพื่อทำงานตามคำสั่ง ซึ่งคือการส่งเสียงร้องออกมา
โดยเสียงร้องจากมือถือของผู้ประสบภัยจะช่วยให้หน่วยกู้ภัยตามหาผู้รอดชีวิตได้ง่ายขึ้น จากปกติที่ต้องตะโกนหาแล้วรอฟังเสียงตอบ
เบื้องหลังแอปพลิเคชัน
ตัวมือถือที่ลงแอปพลิเคชันฝั่งผู้ประสบภัยนั้นจำเป็นต้องเป็น Android 4.0 อย่างต่ำ
ตัวแอปนั้นมีความสามารถสำคัญอยู่ดังนี้ ซึ่งเดี๋ยวผมจะอธิบายต่อด้านล่าง
- แอปพลิเคชันทำงานอัตโนมัติหลังเปิดเครื่อง
- ไม่จำเป็นต้องพึ่งระบบโทรคมนาคม หรือจะถูกปิด cellular data / WI-FI ก็ทำงานได้
- แอปฝั่งหน่วยกู้ภัยสามารถนับจำนวนมือถือที่ถูกตรวจพบได้
ไม่จำเป็นต้องพึ่งระบบโทรคมนาคม
(คำว่าโทรคมนาคมนี่พูดให้ดูเท่ เอาจริง ๆ คือแค่ไม่ใช่อินเตอร์เน็ตและสัญญาณมือถือครับ) ปกติแล้วมือถือ Android ไม่ได้ปิด WI-FI ของมือถือคุณจริง ๆ ทุกครั้งที่คุณกดปิด WI-FI ด้วยสัญลักษณ์หรือไอคอนบนหน้าจอมือถือ ตัวแอนดรอยด์แค่ทำการปิดไม่ให้คุณเห็นหรือต่อสัญญาณได้ แต่เบื้องหลังของระบบยังคงสามารถสแกนหาสัญญาณรอบ ๆ ตัวมือถือเองอยู่ตลอด นั้นหมายถึง ถึงแม้ผู้ใช้จะปิด WI-FI แต่มือถือยังรู้ว่ารอบตัวมันมีสัญญาณชื่ออะไรที่เปิดให้บริการอยู่บ้างนั้นเอง
และเมื่อเราได้ชื่อสัญญาณรอบ ๆ มาแล้ว เราจึงนำมาแยกตรวจสอบหาสัญญาณที่เป็นสัญญาณพิเศษของแอปฝั่งหน่วยกู้ภัยได้นั้นเอง
ทำงานอัตโนมัติหลังเปิดเครื่อง
เหมือนกับแอป Facebook หรืออื่น ๆ ที่เมื่อเปิดมือถือขึ้นมาพวกมันก็จะเริ่มทำงานอัตโนมัติทันที แล้วจึงแจ้งเตือนให้คุณอ่านหลังเปิดเครื่อง
IamHere ก็เหมือนกัน ตัวแอปฝั่งผู้ประสบภัยจะเปิดการทำงานซ่อนไว้เบื้องหลังไม่ให้ผู้ใช้เห็น แต่หากเจอสัญญาณที่เป็นของฝั่งหน่วยกู้ภัยก็จะสั่งให้มือถือฝั่งผู้ประสบภัยทำงานตามคำสั่งที่ถูกแฝงมากับชื่อสัญญาณ
นับจำนวนมือถือที่ถูกตรวจพบได้
วิธีที่จะสามารถนับมือถือที่ถูกตรวจพบได้คือการเชื่อมต่อกับสัญญาณของหน่วยกู้ภัย แต่เพราะมีโจทย์ว่ามือถือผู้ประสบภัยต้องทำงานได้แม้ปิดสัญญาณ WI-FI ดังนั้นเราจึงเขียนให้แอปของเราบังคับให้มือถือผู้ประสบภัยเปิดสัญญาณ WI-FI ขึ้นมาไม่ว่าจะปิดหรือเปิดอยู่ และต่อเข้าไปหาชื่อสัญญาณพิเศษของหน่วยกู้ภัย
เมื่อเกิดการเชื่อมต่อขึ้นมา แอปฝั่งหน่วยกู้ภัยจะเรียกข้อมูล MAC Address (หมายเลขประจำอุปกรณ์บนเครือข่าย) มาบันทึกไว้และนับจำนวนว่ามีกี่หมายเลขที่ถูกบันทึกตอนนี้ จึงได้มาเป็นจำนวนมือถือที่ตรวจพบ
สาเหตุที่เลือกใช้หมายเลข Mac Address เพราะเป็นหมายเลขที่มีโอกาสซ้ำกันน้อยที่สุดในกลุ่มข้อมูลที่เราจะหาได้จากเครือข่าย WI-FI ณ เวลานั้น
อาจมีคนสงสัยว่าถ้าใช้วิธีต่อ WI-FI เรื่อย ๆ แบบนี้แต่ hotspot ของมือถือหน่วยกู้ภัยรับได้แค่ 5 คนพร้อมกัน แล้วคนอื่นจะต่อสัญญาณเข้ามาไง
วิธีที่เราใช้แก้ปัญหานี้คือ ทุกครั้งที่แอปฝั่งผู้ประสบภัยเชื่อมต่อสัญญาณของหน่วยกู้ภัย แอปจะเก็บหมายเลขของสัญญาณนั้นไว้ ซึ่งเป็นหมายเลขเฉพาะของแต่ละอุปกรณ์ปล่อยสัญญาณ ซึ่งจะไม่ต่อซ้ำกับสัญญาณที่มาจากผู้ปล่อยสัญญาณเดิมกับที่เคยต่อมาก่อน และจากนั้นเมื่อการเชื่อมต่อสมบูรณ์จะทิ้งช่วงเวลาไม่กี่วินาทีแล้วตัดการเชื่อมต่อออก เพื่อให้มือถือของผู้ประสบภัยคนอื่นได้เข้ามาเชื่อมต่อด้วย และเพราะดังนี้ ต่อให้มีหลายอุปกรณ์ของหน่วยยกู้ภัยที่ปล่อยสัญญาณออกมา มือถือของผู้ประสบภัยก็จะไล่เชื่อมต่อไปเรื่อย ๆ แต่ไม่ต่อซ้ำอันเดิมแน่นอน
สรุป
ทั้งหมดก็หมดเท่านี้ครับ ตัวแอปไม่ค่อยซับซ้อนเท่าไหร่ แต่กว่าจะหาวิธีมาได้ตอนแรกก็งงกันแทบแย่ว่าจะทำไงเพื่อให้ช่วยหาผู้ประสบภัยใต้ซากปรักหักพังได้โดยไม่ต้องพึ่งระบบโครงสร้างพื้นฐานเลย ที่อยากทำเกี่ยวกับภัยพิบัติเพราะตอนแรกเราจะไปแข่งที่ญี่ปุ่นกัน เลยคิดว่า ตามใจทางญี่ปุ่นหน่อยละกัน เรื่องแนว ๆ นี้น่าจะได้คะแนนเยอะครับ
เว็บต้นฉบับ > http://iamhere.cloudian.in.th/
ภาพตัวอย่างแอป ฝั่งผู้ประสบภัย (สีส้ม) และหน่วยกู้ภัย (สีฟ้า)
ความจริงแล้วตัวแอปฝั่งผู้ประสบภัยจะส่งตำแหน่งของตนเองขึ้นไปบนเซิร์ฟเวอร์ของระบบด้วยวันละหนึ่งครั้ง แต่ตัวข้อมูลจะถูกลดรายละเอียดให้เหลือแค่ระดับอำเภอเพื่อความเป็นส่วนตัว แต่ความสามารถนี้ของระบบมันเล็กน้อย ผมเลยไม่ได้พูดถึงตอนแรกครับ
ด้านล่างนี้เป็นตัวอย่างของหน้าแสดงผลข้อมูลตำแหน่งและจำนวนประชากรของแอปฝั่งผู้ประสบภัยครับ
Source code: https://github.com/chin8628/IamHere