คลังเก็บหมวดหมู่: Web Application

บันทึก node.js + express + mongodb

ลง software ต่างๆ ตามลิ้งนี้
https://www.sitepoint.com/build-simple-beginner-app-node-bootstrap-mongodb/
และลง robomongo ด้วย mognodb management GUI tool ใช้ดีใช้ได้

เริ่มต้นเขียนด้วยไฟล์ start.js เพื่อกำหนด port ที่ server จะรันและรอรับ connection จาก client
และอาจจะสร้างไฟล์ app.js ขึ้นมาอีกไฟล์เพื่อกำหนดโครงสร้างของเว็บ เช่น การโหลด express, pug และโมดูลที่จำเป็นอื่นๆ

ต่อไปก็ การใช้งาน mongodb เริ่มแรกเลย เพื่อความปลอดภัย ก็ควรใส่ authorization เข้าไปด้วย โดยการสร้าง user และกำหนด password และ role ของการเข้าถึง database

เมื่อได้ user, password สำหรับ database ที่เราต้องการสร้างหรือใช้งานแล้ว ต่อไปก็ต้องทำให้ mongoose connect database แบบมี authen
วิธีกำหนด user, password เวลา connect คือใช้ auth: { user: xxx, password: xxx } เนื่องจาก version ของ mongoose ที่ใช้ จึงต้องใส่ useNewUrlParser: true และ useUnifiedTopology: true ด้วย

เมื่อ connect ได้แล้ว ก็ต้องทำ model schema สำหรับ collection ที่เราต้องการจัดการ ก็ทำแยก 1 .js ไฟล์ ต่อ 1 schema เก็บไว้ใน folder ชื่อ models ก็ได้
เวลา exports module ถ้าชื่อ collection ไม่เหมือนกับชื่อของ schema เราต้องบอกมันด้วยตอน export

เมื่อได้ model ก็ถึงตา view ทำการแสดงผล โดยเราจะแสดงผล documents ทั้งหมด ใน collection ด้วย table สิ่งแรดกที่ต้องทำคือ กำหนดเส้นทางให้ router เช่น เมื่อต้องการกำหนด path เป็น /paid เพื่อแสดงผล table ข้อมูลใน collection ชื่อ paid

เมื่อมี GET request ‘/paid’ เข้ามา เราทำการ query documents ใน collection ได้โดยใช้คำสั่ง find() เมื่อได้ก้อนข้อมูลมาเก็บไว้ในตัวแปรตัวหนึ่งแล้ว ก็ส่งต่อให้ view ทำการแสดงผล โดยใช้ pug และ bootstrap

ก่อนจะไปถึงเรื่อง bootstrap มาดูเรื่อง HTTP authentication ก่อน คือ user ต้องทำการ login สำเร็จก่อนจึงจะสามารถเข้าถึงหน้า paid ได้
เราได้ทำโดยใช้ โมดูล http-auth เมื่อทำเสร็จแล้ว จะมี pop-up ขึ้นมาให้ใส่ user name, password เมื่อจะเข้าหน้าที่กำหนด

ก่อนจะใช้งาน bootstrap ซึ่งก็คือเรื่องของ style sheet เราต้องทำการบอก path ที่อยู่ เพื่อให้สามารถเรียกโหลดไฟล์ที่วางอยู่ในนั้นได้ ในที่นี้ก็คือพวก css, js, images โดย ทำการกำหนด static path ให้แก่ express ก่อน หลังจากนั้น เราก็จะสร้าง css ไฟล์กำหนดค่าการแสดงผลให้กับส่วนต่างๆของ view ได้

ส่วน view นี้ เราใช้ pug เป็น template engine เมื่อก่อนชื่อ jade ยังมี engine ตัวอื่นๆอีกที่สามารถนำมาใช้ได้ การใช้งาน pug ก็เหมือนเราเขียนไฟล์ html นั่นเอง แต่จะมีรูปแบบการเขียนที่ง่ายขึ้น ไฟล์จะเป็นนามสกุล .pug แทน ซึ่งชื่อไฟล์ก็จะต้องเหมือนกับในฟังก์ชั่น render

ถึงตรงนี้เราก็ทำเว็บด้วย node.js ได้กะเค้าบ้างแล้ว แต่ที่ทำต่อเพื่อจะส่งงานให้ลูกค้า นั่นคือ การแสดงผล table ให้สวยงามและมีฟังก์ชั่นการทำงานมากขึ้น เช่น การเรียงคอลัมน์ การค้นหา การทำเพจ และการ export ข้อมูล ซึ่งได้หยิบ DataTables มาใช้งาน

กว่าจะใช้งานได้ก็เล่นเอาเหนื่อยเหมือนกัน เพราะ DataTables ใช้ jqeury เลยต้องนั่งหาวิธีที่จะเรียกใช้ $(document) หรืออ้างถึง Element ต่างๆ ในไฟล์ .pug ให้ได้ สุดท้ายจึงพบว่ามันทำได้ง่ายๆเลย โดยการลง package jquery ด้วย npm และใช้วิธีกำหนด static path ไปที่ folder ที่ไฟล์ใน package เหล่านั้นถูกวางอยู่ โดยใช้ app.use() นั่นเอง ก็เลยแก้ปัญหาเรื่อง jQuery และ $ is not undefined ลงได้

I-IoT

ช่วงสิ้นปีมีโอกาสทำการทดลองสองสามตัวที่เกี่ยวข้องกับ I-IoT
เริ่มด้วย
1. ใช้ Raspberry Pi อ่านสัญญาณจาก ultrasonic sensor ส่งเข้า HMI software ผ่านทาง Modbus TCP ก็เหมือนกับเป็นการทดลองทำระบบ SCADA นั่นเอง

2. อ่านค่าจาก เซ็นเซอร์ ด้วยโปรโตคอล Modbus RTU ผ่านทาง RS485 แล้วส่งให้ software น่าจะเรียกได้ว่าเป็น edge software อย่าง KEPServerEX ที่ทำตัวเป็น OPC UA server แล้วให้ Node-RED ไปดึงข้อมูลมาแสดงผล โดยการสร้าง dash board และสามารถดูได้บน web browser

 

3. ส่วนอีกแบบหนึ่ง สำหรับระบบ SCADA เดิม ที่สามารถ export ข้อมูลออกมาเป็น csv หรือ excel ได้ อยากจะเอาข้อมูลการ operate ขึ้นเว็บออนไลน์ เพื่อทำการวิเคราะห์และแสดงผลออกมาเป็น ตาราง หรือ chart ต่างๆโดยไม่ต้องไปยุ่งกับระบบเดิมมากนัก ก็ใช้วิธีทำ dash board ด้วย การเขียน web application ขึ้นมาต่างหาก แล้วโยนไฟล์ที่ export ออกมาขึ้นไปให้

ใครที่สนใจต้องการทำ dash board  ติดต่อได้ครับ ผมรับงานนะครับ อิอิ

ทดลองเล่น LoRa

มีโอกาสได้ทำการทดลองใช้งาน LoRa module กับ IoT platform ทั้งแบบ LoRa ธรรมดา และ LoRaWAN ความแตกต่างระหว่าง 2 แบบนี้ คือ LoRaWAN มี network protocol เพิ่มเข้ามาเป็นมาตรฐานการสื่อสารเช่นเดียวกับพวก WIFI แต่ก็ไม่ถึงกับมีความจำเป็นจะต้องใช้แบบ LoRaWAN แต่เพียงอย่างเดียวเท่านั้น งานระบบง่ายๆ หรือเขียน gateway เองได้ ก็จะสามารถใช้ LoRa module ได้หลากหลายแบบขึ้น เช่น ใช้โมดูลที่แปลง LoRa เป็น UART ให้เลย หรือถ้าใครต้องการระบบที่มีมาตรฐาน มีความปลอดภัย ก็ใช้ LoRaWAN ไป

ระบบแรกที่ได้ทดลองทำคือ Thingsboard.io โดยใช้ MQTT เป็นตัวส่งข้อมูลขึ้นไปให้ ฝั่ง LoRa device กับ gateway ก็เขียนโปรแกรมรับส่งข้อมูลเอง

ส่วนอีก platform หนึ่งคือ TheThingsNetwork.org อันนี้มี LMIC library ที่ implement LoRaWAN stack ให้ มีโปรแกรม gateway ที่มีคนเขียนด้วย LMIC ให้ได้ลองศึกษากันงานกันได้เลย ที่ผมทำการทดลอง ก็ใช้ single channel gateway ซึ่งอันที่จริงก็ไม่ได้เป็นไปตามมาตรฐาน (ควรจะเป็น multi-channel) แต่ก็หยวนๆกันไป เพราะ hardware มีราคาถูกกว่า คนเข้าถึงเพื่อเรียนรู้ได้ง่ายกว่า

ก็ต้องรอดูกันไปว่า จะเกิดมั้ย เพราะ การสื่อสารแบบอื่นๆ อย่างเช่น NB-IoT ก็มีบริษัทฝั่งอเมริกาหนุนอยู่ครับ

MQTT + Silk

Silk เป็น web framework อีกตัวหนึ่งครับ แต่ไอเดียจะแตกต่างจากตัวอื่นๆที่เคยเขียนถึงไป ตัวนี้ค่อนข้างถูกจริตกับผมมากกว่าตัวอื่นๆ เนื่องจากมันคือการเขียน HTML document ด้วย QML

การที่มันยังสามารถใช้ model/view ของ QML ได้นั้น ทำให้เราสามาารถดึงข้อมูลจาก C++ model ไปแสดงใน HTML table ได้อย่างง่ายดาย

การที่มันยังเขียน web ได้ในแบบเดิมๆ ใช้ javascript ได้ ก็ทำให้ไม่ต้องเปลี่ยนแปลงวิธีการเขียนในส่วนนี้ไป

และด้วยความที่มันเป็น C++ web server โดยตัวมันเอง มันน่าจะเหมาะกับโปรเจ็คเล็กๆ อย่างพวก IoT ที่ไม่ได้ต้องการรองรับ client จำนวนมาก

จากที่ว่ามา ผมจึงเอามันมาลองกับ MQTT โดยมี hardware คือ nodemcu เอามาต่อกับ sensor DS18B20 เขียนโปรแกรมด้วย Arduino IDE โดย ก็ต้องลง library ESP8266, OneWire, PubSubClient (MQTT), DallasTemperature เพื่อให้ใช้อ่านค่าอุณหภูมิและส่งข้อมูลไปให้ MQTT server ผ่าน wifi ได้

 

ตัว server ก็เป็น linux รัน mosquitto ที่รองรับ websocket และ รัน silk webserver โดยเขียน web app ให้ subscribe MQTT message ผ่าน websocket ได้โดยใช้ paho javascipt client และใช้ justgage แสดงผลข้อมูลที่ได้ในแบบ graphics