IoT Weekend: ควบคุมการเปิด/ปิดหลอดไฟด้วย LINE Bot ผ่าน Messaging API และ MQTT Protocol [ver. 2018] Part 2
สืบเนื่องจากบทความที่แล้ว ที่ได้นำทุกท่านเข้ามาสู่โลกของ IoT หรือ Internet of Things โดยมีการนำ Messaging API ของทาง LINE เข้ามาประยุกต์ร่วมด้วย ในบทความนี้จะครับ โมจะพูดถึงการสร้าง LINE ChatBot จากการเรียกใช้ Messaging API ที่ทาง LINE ได้จัดเตรียมไว้ให้ โดยจะพัฒนาด้วยภาษา Ruby และใช้ Heroku การ Deploy เพื่อนำไปควบคุม เปิด/ปิดหลอดไฟ และสามารถแนวคิดนำไปต่อยอดได้สร้างสรรค์สิ่งใหม่ๆ
KeyWording จะได้พูดถึงในบทความ(ทั้ง 3 Part)นี้
MQTT, Broker, Pub-Sub, Ruby, Sinatra, ChatBot, Gem
สิ่งที่ใช้ในการทำครั้งนี้นะครับ
- Heroku Account
- มี server 2 ตัว อันนึงเอาไว้วาง เจ้า LINE Bot กับ อีกอันเอาไว้ วาง MQTT Broker (Part 1+2) - LINE Developer Account สำหรับสร้าง DevTrial BoT (Part 2)
- IoT Device
- ซึ่งในที่นี้โมใช้ ESP32 กับ LED สีแดง 1 ดวง (Part 3)
ซึ่งใน Part 1 โมได้นำทุกท่าน ลองตั้ง MQTT Broker เอาไว้ให้ได้ทดลองการทำงานของ MQTT Protocol ครั้งนี้จะใช้ LINE Messagin API เป็น Publisher เอาไว้ให้เป็นคนส่งข้อมูล (Text Messaage) เข้าไปยัง MQTT Broker
สิ่งที่จำเป็นสำหรับในการพัฒนานะครับ
- Ruby โดย เวอร์ชั่นที่ใช้เขียน 2.3.3
- Git
- MQTT Broker จากบทควาทที่แล้ว
- Your Own Choice of Code Editor ซึ่งซึ่ในบทความนี้โมใช้ VSCode
ต่อไปจะมาลงรายละเอียดการสร้าง Bot แบบ Step-by-step กัน Let’s Go!!!!
ขั้นตอนแรกคือเตรียม Channel ใน LINE Developers Console ขึ้นมาก่อน ให้ทำการสร้างบัญชีผู้ใช้งานได้ที่ https://developers.line.me
พอได้บัญชีผู้ใช้แล้ว ก็เข้าไปที่ https://developers.line.me/console/register/provider / เพื่อสร้าง Provider ขึ้นมา
เมื่อเราสร้าง Provider เป็นเรียบร้อยแล้วให้เลือก Messaging API เพื่อสร้าง Channel ที่จะมารองรับการเรียกใช้
ทำการตั้งชื่อ Channel
สำหรับ Developer Trial Plan จะอนุญาตให้เพิ่มเพื่อนได้ 50 คนเท่านั้น
ใส่ข้อมูลและรายละเอียดของ Channel ให้ครบ
เมื่อทำการกรอกข้อมูลเสร็จเรียบร้อยแล้ว ถัดมาจะเป็นการตั้งค่า Channel ในส่วนที่จำเป็นเพื่อให้เราเขียนแอพเพื่อทำการติดต่อได้ โดยสิ่งที่จำเป็นต้องใช้คือ Channel Access Token และ Webhook URL
กด Issue เพื่อสร้าง Channel Access Token สำหรับการ Authorize Request ไว้ใช้งาน
โดยเจ้า Access Token นี้จะหมดอายุก็ต่อเมื่อมีการสร้าง Access Token ใหม่ขึ้นมา ซึ่งเราสามารถกำหนดได้ว่าหลังจากสร้าง Access Token ใหม่แล้วจะให้ของเก่าใช้งานได้อีกกี่ชั่วโมงจึงจะหมดอายุ เมื่อกด Issue เราจะได้ Access Token พร้อมใช้งาน ให้เรา Copy เก็บไว้ เพื่อจะได้เอาไปใช้ตอนเขียนแอพ
ให้ปิด Auto-reply messages และ Greeting Message ด้วยเพราะเราจะเขียนให้ Bot เป็นผู้ที่ตอบเอง
ถัดมาเป็น Webhook URL ซึ่งเป็น URL ที่เราจะใช้ไว้รับ Request เมื่อเกิด Event ขึ้นมาจะมีการเรียก URL ดังกล่าวทันที ซึ่ง URL ที่ว่านี้เราจะได้จาก Heroku เมื่อเรานำ แอพตัวที่กำลังจะพาทุกท่านเขียน ขึ้นไป Deploy สามารถสมัครใช้งาน Heroku ได้ที่นี่
เริ่มสร้าง App โดย Log in แล้วเข้าไปที่ https://dashboard.heroku.com/apps
เลือก New -> Create new app ใส่ app-name ตามต้องการ เมื่อเสร็จแล้ว เราก็จะได้ Domain ของ app เราเป็น https://{ app-name}.herokuapp.com ยกตัวอย่าง https://app-name.herokuapp.com
กลับมาที่ LINE Developer Console ตรง Use webhooks ให้กดเป็น Enabled และใส่ Webhook URL ลงไปตามที่เราตั้งชื่อไว้ใน Heroku ตามด้วย Path ที่เราต้องการจะให้ API วิ่งกลับไปหา ไม่ว่าจะเป็น /webhook, /callback และลองกด Verify ดู แต่จะสังเกตุเห็นว่าพอกด Verify แล้ว จะขึ้นตัวอักษรสีแดง แสดงว่ายังไม่ผ่านการ Verify เนื่องจากเรายังไม่ได้ทำการ Deploy ตัว Bot ไปอยู่บน Heroku เพื่อทำการส่ง Response ให้กับ Request ที่จะถูกส่งมายัง URL นี้ ดังนั้นเราจะมาเขียน Bot ด้วยภาษา Ruby และ Deploy ลงบน Heroku เพื่อให้ Verify ผ่านกัน
ขั้นตอนการเขียน Code เพื่อสร้าง Bot
ในที่นี้โมเลือกใช้ Sinatra เพราะด้วยความที่ โครงสร้างของแอพที่เราต้องการจะสร้างนั้นไม่ซับซ้อนอะไรมาก แต่ถ้าไม่ชอบ ก็สามารถใช้ Rails (RubyonRaills) ซึ่งเป็น WebFramework ที่เขียนด้วยภาษา Ruby ได้เหมือนกัน
Setting Up A Sinatra App
เรามาเริ่มต้นกันด้วยการติดตั้ง Sinatra ซึ่ง มาใน Package ว่า Gem ลงไปที่เครื่องของเรา
gem install sinatra
พอติดตั้งเสร็จแล้ว จากนั้นสร้าง Folder โปรเจคเราขึ้นมา สร้างไฟล์ app.rb และ Config.ru ซึ่งตัว Config.ru จะเป็นไฟล์ที่ใช้ในการบอก Heroku ว่าเป็นคำสั่งที่จะถูกเรียกใช้หลัง Deploy เพื่อสั่งให้แอพเริ่มต้นทำงาน โดยใน Config.ru ให้ใส่ดังนี้
require "./app"
run App
จากนั้นเปิด File app.rb, ข้างบนสุดของ File ใส่ require 'sinatra'
เพื่อให้เราสารมาเรียกใช้ เจ้า sinatra gem
# app.rb
เรียกใช้ Sinatra ไว้ บนสุดของไฟล์
require 'sinatra'
ลองสร้าง Path ง่ายๆขึ้นมาอันนึง ให้ปริ้น “Hello World” ออกมาที่หน้าจอ
get '/' do
'Hello world!'
end
จากนั้นเปิด Terminal , เพื่อทดสอบว่าแอพทำงานได้หรือไม่ ให้พิมพ์ ruby app.rb
ไชโย!!! แอพขอเราก็จะปรากฤขึ้นใน Browser ที่ localhost:4567.
ขั้นตอนต่อไป เราจะมาทำการลง library ตัวอื่นๆ โดยสร้างไพล์ที่ชื่อว่า Gemfile ขึ้นมา เจ้า Gemfile เนี่ย ถ้าในฝั่ง Nodejs เปรียบเสมือน package.json เป็น file เอาไว้ลง library ตัวอื่นๆ ที่จะมาใช้กับในเฉพาะแอพของเรา (แบบ local)
nano Gemfile
พอสร้าง Gemfile ขึ้นมาแล้ว ให้ลง gem ดังต่อไปนี้
source 'https://rubygems.org' #บอกเอาไว้ว่าให้ไปอ้างอิง Gem จากเว็บนี้gem 'dotenv’ #เอาไว้ใช้ เรียก Environment Variable จากไพล์ .envgem 'line-bot-api' #เอาไว้ใช้ เรียก LINE Bot APIgem 'mqtt' #library ตัว MQTTgem 'sinatra' #ลง sinatra ไว้ตรงนี้เพื่อจะได้ เรียกในกรณีที่เครื่องที่เราจะไป Deploy ไม่มี sinatra ติดตั้งอยู่ในเครื่องมาก่อนruby '2.3.3' #ประกาศว่าเราใช้ Ruby version ไหน
จากนั้นเปิด Terminal , เพื่อติดตั้ง dependencies ที่เหลือให้พิมพ์ bundle install เพียงเท่านี้ สิง่ที่จะถูกสร้างเพิ่มขึ้นมาคือ Gemfile.lock เพียงเท่านี้เราก็พร้อมสำหรับการเขียน bot แล้ว
bundle install
พอลง dependecies เรียบร้อยให้เรากลับไปที่ app.rb เพื่อทำการเขียน Code
โดยจะเริ่มจาก ประกาศเรียกใช้ gem ที่เราพึ่งลงไป
ถัดมา ให้เพิ่ม Code ดังนี้
โดยเจ้า Code ชุดนี้ จะเป็นการประกาศเรียกใช้ LINE Bot API เพื่อสร้าง Client ขึ้นมา โดยให้นำ Channel Secret และ Token ที่ได้จากตอนสร้าง Channel มาใส่ใน File .env ประกาศเรียกใช้ตัวแปรดังรูป
ถัดมา ให้เพิ่ม Code ดังนี้ ต่อจาก get method ที่เราสร้างไว้ตอนแรก
โดยประกาศ Path ให้ตรงกับที่เราเขียนไว้ใน Developer Console ตรงในส่วนของ Webhook เพื่อจะได้ verify ผ่าน
จากนั้นเตรียม Deploy แอพเราลง Heroku ผ่าน Heroku CLI (Command line Interface) หรือจะ Deploy ผ่าน GitHub ก็ได้เช่นกัน แต่ในบทความนี้จะขอพูดถึงเฉพาะผ่าน Heroku CLI ครับ เพราะง่ายกว่าเยอะ อิๆ เขียนเสร็จก็ push ลูกเดียว อิๆ
เรามาลง Heroku CLI กันก่อน
brew install heroku/brew/heroku
เมื่อลงเรียบร้อยแล้วให้ Login และใส่ Email และ Password ที่ใช้ในการ Login เข้าบัญชี Heroku ของเรา
heroku login
สร้าง Git Repository และ Attach กับ Heroku App ที่ได้สร้างไว้
git init
heroku git:remote -a {app-name}
Push ขึ้น Heroku เพื่อทำการ Deploy
git add .
git commit -m "Initial Commit"
git push heroku master
ตรวจสอบในหน้า Dashboard ของ App เราใน Heroku ว่า Deploy สำเร็จหรือไม่ หากสำเร็จให้ใช้คำสั่งด้านล่างเพื่อทำให้แน่ใจว่ามีอย่างน้อย 1 instance ที่กำลังรันแอพของเรา
heroku ps:scale web=1
ถ้าเราอยากรู้ว่า เมื่อเรา Deploy เรียบร้อยแล้ว แล้วใช้งานได้หรือไม่ ให้เข้าไปที่ Channel ที่เราสร้างไว้ Add Friend แล้วทักแชทไปซักคำ เพียงแค่นี้เราก็ได้ Chat (Echo) Bot ง่ายๆ ขึ้นมาตัว //ตรบมือ
ทีนี้เรามาเพิ่มความสามารถให้เจ้า LINE Chatbot ที่เราสร้างขึ้นมาดีกว่า โดยโมจะเอาไปใช้ทำการควบคุม เปิด/ปิดหลอดไฟ เพียงพิมพ์คำสั่งให้เปิดหรือปิด ผ่านหน้า Chat LINE นี้
โดยแนวคิดคือเรามี MQTT Broker ที่โมได้นำทุกท่านสร้างเมื่อบทความที่แล้ว โดยจะให้เจ้า LINE ChatBot ของเราเนี่ยทำหน้าที่เป็น Publisher ส่งข้อความเข้าไปที่ Broker แล้วให้เจ้า IoT Device ที่จะสร้างขึ้นมาใน Part ต่อไป ให้ไปรอฟังคำสั่ง Subsciber แล้วเปิดปิดตามข้อความที่เราส่งเข้าไป
โดย Implement Code ดังนี้
เรียกใช้ gem mqtt และ uri ต่อจากที่เราประกาศอันอื่นๆ
ในส่วนนี้เป็นการเรียกใช้ MQTT โดยเราจะประกาศว่าจะเชื่อมต่อไปที่ server ไหน ด้วย Port อะไร username และ password อะไร
โดย ใช้ข้อมูลได้ตามนี้ จาก MQTT ฺฺBroker ที่เราสร้างไว้ครั้งที่แล้ว
Pattern ของ URI คือ
mqtt://{username}:{password}@{server}:{port}/{topic}
ส่วน Topic นั้น ให้ประกาศดังนี้ ข้อระวัง ควรประกาศ topic ให้ตรง มิฉะนั้นเราจะไม่ได้ข้อความที่ส่งไป
หลังที่เราได้นำค่าจาก MQTT Broker มาใส่แล้ว
มาถึงหัวใจหลักสำคัญ นั่นก็คือการให้ เจ้า chat Bot ของเราส่งข้อความที่เราพิมพ์เข้ามา ไปยัง MQTT Broker
โดยใช้คำสั่งดังนี้
และอย่าลืมส่ง conn_opts ที่เราประกาศไว้ก่อนหน้านี้เข้าไปด้วย
ต่อมาเนี่ย เราไม่อยากให้พิมพ์อะไรเข้าไปมั่วๆ งั้นก็ตั้ง Logic เอาไว้นิดนึง ให้รับคำสั่งเฉพาะ แล้ว Replay Message กลับไป เพื่อให้เรารู้ว่า Server ได้รับคำสั่งของเราเป็นที่เรียบร้อยแล้วนะ
จากนั้นก็ Deploy แอพเราไปที่ Heroku แล้วทดสอบกันได้
ไป เซ็คที่ MQTT Broker ของเราว่ามีข้อความวิ่งเข้ามาไหม
โอ้วโหวววววว!!!! แค่นี้เราก็ได้ Publisher ของข้อความที่สามารถคุยคิดต่อกับ MQTT Broker ได้แล้ว #simpleIoT #IoTiseasy
Code ทั้งหมด นะครับ
GitHub ขอตามมาทีหลังนะครับ
ถ้าท่านใดไม่ถนัดภาษา Ruby โมกำลังทำวิธี Implement LINE Bot บนภาษาอื่นๆ เช้า Go, Nodejs, Python จะพยายาม Published ภายในเร็วนี้นะครับ
ยังไม่จบเพียงเท่านี้นะค้าบ
ย้อนกลับไปดู Part 1 ผมนำพาทุกท่านมาสร้าง MQTT Broker
โปรดติดตาม Part 3 ผมจะนำพาทุกท่านมาสร้าง IoT Device
โปรดติดตามตอนต่อไป!!! つづく
References:
- LINE Messaging API
- API Reference
- Heroku Reference