สวัสดีครับ
หลังจากที่ AIS ประกาศ pre-order module NB-IoT ไปเมื่อเดือนธันวาคมที่ผ่านมา ผมซึ่งสนใจจะนำมาใช้กับ senior project อยู่แล้วเลยสั่งซื้อมาชุดหนึ่ง และเมื่อเดือนพฤษภาคมที่ผ่านมา module ก็เปิดให้ซื้อ เลยเป็นที่มาของรีวิวครั้งนี้ครับ
NB-IoT คืออะไร
NB-IoT หรือ Narrow-band Internetof Things คือเทคโนโลยีโทรคมนาคมแบบ LTE ที่ออกแบบมาสำหรับใช้งานกับอุปกรณ์ที่เน้นการสื่อสารไม่เน้นความเร็วมาก แต่เน้นการประหยัดพลังงาน และมีการติดต่อสม่ำเสมอด้วยข้อมูลปริมาณน้อย เช่นระบบโทรมาตร หรืออุปกรณ์สั่งการต่างๆ ที่ไม่เน้นความรวดเร็วในการตอบสนอง (non real-time applications) โดยทำงานในช่วง subcarier กว้างราวๆ 200 KHz ของความถี่สำหรับให้บริการโทรศัพท์มือถืออยู่แล้ว (กรณีของ AIS ทำงานที่ 900 MHz)
NB-IoT มีข้อดีสำคัญที่ดีกว่าการใช้เครือข่าย LTE ปกติ เช่น:
- เครือข่ายของ NB-IoT เป็นเคือข่ายที่แยกต่างหากจากเครือข่ายมือถือปกติ ความแออัดจึงน้อยกว่า
- ประหยัดพลังงานกว่า เนื่องจากรูปแบบการเข้ารหัสคลื่นสัญญาณ (waceform modulation) ที่ง่ายกว่าปกติ ทำให้ใช้พลังงานในการประมวลผลและส่งสัญญาณน้อยกว่า
- ราคาชิพถูกกว่า เนื่องจากความซับซ้อนในการออกแบบน้อยกว่า ส่วนหนึ่งเนื่องจากแถบความถี่ที่ใช้น้อยกว่าปกติที่ใช้แถบความถี่ประมาณ 1.2 MHz
ว่าด้วย Module
สำหรับ Module ที่ AIS ส่งมาให้นักพัฒนาลองใช้ จะเป็น DEVUINO เป็นลักษณะ Breakout board ของ Arduino พูดง่ายๆ คือสามารถเสียบทับ pin ของ Arduino Uno เดิมได้เลยครับ
และตัวบอร์ดก็ฝัง E-Sim มาให้พร้อมเลย ฉะนั้นแค่ซื้อและลงทะเบียนก็สามารถใช้งานได้เลย
Mini-project: Cellular Tower logger
ที่มา
ตอนแรกที่ผมได้มา ผมเองอยากจะลองใช้งานเป็น Sensors logger แต่ตอนนั้นผมเองยังไม่รู้ว่าจะเก็บคว่าอะไรระหว่างทางดี แต่สิ่งสำคัญคือต้องรู้คือระบบกำลังเก็บข้อมูลที่ไหน ครั้นจะใช้ GPS ก็ดูจะไม่ประหยัดพลังงานเท่าไหร่ เพราะตัว GPS Module นั้นค่อนข้างกินพลังงานในช่วงที่กำลังจับสัญญาณดาวเทียม ผมเลยกะจะใช้การทำ Cellular Tower triangulation เพื่อหาตำแหน่งคร่าวๆ
(สำหรับใครที่ไม่รู้ว่า CTT คืออะไร มันคือการหาตำแหน่งปัจจุบันโดยคร่าวๆ โดยอาศัยการหาตำแหน่งของเสาสัญญาณโทรศัพท์มือถือประกอบกับความแรงของสัญญาณมือถือ ณ ขณะนั้นหลายๆ เสา แล้วเอามาดูว่ารัศมีสัญญาณมีจุดใดคาบเกี่ยวกับเสาอื่นที่เคยเก็บไว้บ้าง ก็จะได้พิกัดคร่าวๆ ครับ ใครที่ต้องการศึกษาเพิ่มเติม ลองอ่านรายงานเรื่องนี้ที่ผมเคยเขียนไว้ในวิชา Location-base applications ดูครับ)
ปัญหาคือตำแหน่งของเสาที่ได้ ปกติจะอยู่ในรูปของ Location Area Code (LAC) คู่กับ Physical Cellular ID (CID) เมื่อเอารหัสเสาฯ นี้ไปหาคำแหน่งของเราคู่กับความแรงของสัญญาณผ่าน API เปิดต่างๆ เช่น Google map location API หรือ Unwiredlab Location API เป็นต้น แต่ในระบบ NB-IoT จะได้เป็น Tracking Area Code (TAC) กับ E-UTRANS ID (EIC) และเนื่องจากยังอยู่ในช่วงเริ่มต้น ข้อมูลเสาที่ว่าเลยยังไม่มีในฐานข้อมูลที่ว่ามาครับ
ผมเลย E-Mail ไปถามหน่วยพัฒนาของ AIS
และนี่คือคำตอบที่ได้เมื่อวันที่ 5 พ.ค. (ซึ่งจนกระทั่งวันที่เขียนบทความนี้ก็ยังไม่มีความคืบหน้าครับ)
ถ้าเป็นกรณีอื่นที่ผมติดต่อช่องทางอื่น ผมคงกลายเป็น Popuko โทรไปทวงไปแล้ว
แต่เนื่องจากผมติดต่อได้แค่ทาง E-Mail และศรัทธาในปรัชญาของ Blognone ที่ว่า “อยากได้ต้องทำเอง”
ผเลยตัดสินใจทำ module เก็บข้อมูลเสาที่ว่ามานี้ซะเองเลยครับ!
สถาปัตยกรรมของระบบ
คุณสามารถดู Source code ทั้งหมดที่ใช้ใน mini-project นี้ได้ที่ https://github.com/itpcc/NB-IoT-Cellular-logger
ส่วนอุปกรณ์
การทำงานของตัว module ผมใช้ Arduino Uno คู่กับ GPS ต่อกับตัว Module NB-IoT ครับ แล้วใช้ power bank ทั่วไปจ่ายไฟผ่าน USB ครับ (จริงๆ กะจะให้แสดงค่าที่เก็บได้บนจอ OLED ด้วย แต่ปรากฏว่าแรมไม่พอหรืออะไรรบกวนไม่ทราบ ติด Error ส่งค่าไม่ออก เลยตัดออกไปแล้ว monitor บน Firebase)
สำหรับ code ที่ใช้ก็ล้อกับ example ที่ AIS ให้มาเลย แต่ตัว Library เนื่องจากไม่มี method ในการอ่านรหัสเสาสัญญาณที่ใช้ปัจจุบัน เลยเพิ่ม method ที่ว่าขึ้นมาครับ ซึ่งก็ไม่ได้ซับซ้อนกว่าเดิมเท่าไหร่ เพราะถึงแม้ว่า AIS จะไม่ได้ทำ manual ไว้ให้ แต่ Qualcomm มี AT commands references manual ให้ เลยยังพอจะทำความเข้าใจการทำงานแล้วแทรกการแปรค่าได้อยู่ครับ
ส่วนการอ่านพิกัดผ่าน GPS นั้นก็ใช้การอ่านข้อมูลผ่าน serial interface ที่ module ส่งออกมาอัตโนมัติทุกๆ วินาทีอยู่แล้วได้เลย ปัญหาที่พบมี 2 อย่างครับ คือ
1. เราไม่สามารถใช้ AltSoftSerial ที่ออกแบบมาเป็น Hardware-based Software Serial interface library และเหมาะสำหรับเรื่องนี้ได้ เพราะถูกใช้กับ NB-IoT module ไปแล้ว เลยต้องใช้ NeoSoftSerial ที่เป็น Software Serial แทน เลยต้องสร้างฟังก็ชั่นตรวจจับ $GPGGA sentence เอง
2. ข้อมูลที่ส่งมาจาก GPS จะอยู่ในรูป NMEA sentence (อ่านรายละเอียดเพิ่มเติมได้ที่นี่ครับ) ซึ่งพิกัดที่ได้จะอยู่ในรูป degree และ minute ถ้าจะเอาไปใช้จริงต้องแปลงให้อยู่ในรูป degree อย่างเดียวก่อนครับ
ปัญหาสำคัญที่เจอกลับเป็นตอนส่งครับ เนื่องจากเมื่อเอาข้อมูลทั้งหมดมาต่อกัน ต่อให้จัดรูปแบบ CSV แล้วก็ยังยาวเกิน 32 ตัวอักษร ทำให้ไม่สามารถส่งข้อมูลออกไปได้ (คือมันจะยัง encode เป็น hex string ได้ แต่จะขึ้น error กลับมา)
ผมเลยต้องแก้ปัญหาโดยการแยกกันส่ง GPS และรหัสเสาแล้วเชื่อมกันผ่าน sequence number แต่ละครั้งในการส่ง และ encode ตัวเลขต่างๆ ทั้งรหัสเสาและ sequence number ให้อยู่ใยรูปฐาน 36 เพื่อให้สั้นที่สุด (โดยที่ยังไม่ต้องสร้าง function encode ต่างหาก) ก่อนจะส่งออกไปครับ
กว่าจะส่งได้ครบก็เล่นเอาหัวร้อนไปไม่น้อยเลย 😰
ส่วน server
ตัว server จริงๆ ก็ไม่มีอะไรมากครับ เพราะตัว protocol UDP ที่ใช้ในการส่งข้อมูลจาก NB-IoT ไม่ได้ซับซ้อนมาก บวกกับเสียเวลาไปกับตัว module มามากพอแล้ว เลยทำแค่แปลงตัวเลขกลับมาเป็นฐาน 10 และ 16 แล้วโยนเข้า Firestore ไปประมวลผลทีหลัง
ลงมือ!
ผมทดลองโดยเอาไป module ไปพร้อมกับผมเมื่อวันที่ 10 พ.ค. ตอนแรกตั้งใจว่าจะเก็บข้อมูลระหว่างเดินทางจาก มจธ. ไปบ้านหม้อด้วย (ไปซื้ออุปกรณ์ทำโปรเจ็คมาดองเพิ่ม) แต่ปรากฎว่า server มีปัญหา internet ระหว่างทาง เลยบันทึกได้ถึงแค่ช่วงตลาดบางปะกอกเท่านั้นเอง แต่ผลที่ได้น่าพึงพอใจดีครับ สามารถเก็บได้ครบมั้ง Cellular ID ความแรงของสัญญาณ และพิกัดที่เก็บข้อมูลเลย
สรุปปิดท้าย
ผมมองว่า DEVIO NB-SHIELD I อาจจะยังไม่เหมาะนักสำหรับผู้ที่เริ่มต้นจะทำ IoT device นะครับ เพราะ Ecosystem, document เองก็ยังไม่ค่อยโอเคเท่าไหร่สำหรับผม (แม้แต่ AIS Magellan ที่โม้ซะดิบดีว่าเหมาะสำหรับงานนี้ก็ยังไม่มีแม้แต่ UDP server ให้บริการ) การพัฒนาเองยังค่อนข้างกินเวลาพอสมควร แต่ผมค่อนข้างชอบที่ทำเป็น Arduino Uno breakout board นะครับ มันทำให้ง่าย ไม่รุงรังมากนัก
อาจจะต้องให้เวลาทีมงานอีกสักนิดครับ เพราะว่ากันตามตรง NB-IoT เองก็ยังค่อนข้างใหม่อยู่
คงต้องรอ True และ CAT ปล่อยบอร์ดของตัวเองบ้าง ถ้ามีโอกาสผมจะนำมารีวิวอีกทีนะครับ
สวัสดีครับ