รู้จัก MQTT
MQTT (http://mqtt.org/) ย่อมาจาก Message Queue Telemetry Transport เป็น protocol การสื่อสารแบบหนึ่ง ที่ออกแบบมาเพื่อใช้งานกับอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก เช่น Arduino Raspberry PI เป็นต้น ใช้หลักการแบบ publisher / subscriber (pub/sub paradigm) ดังภาพคล้าย กับหลักการที่ใช้ใน Web Service ที่ต้องใช้ Web Server เป็นตัวกลางระหว่างคอมพิวเตอร์ของผู้ใช้ แต่ MQTT จะใช้ตัวกลางที่เรียกว่า Broker เพื่อทำหน้าที่ จัดการคิว รับ - ส่ง ข้อมูลระหว่างอุปกรณ์ และทั้งในส่วนที่เป็น Publisher และ Subscriber
ข้อมูลใน MQTT จะใช้ Topic (น่าจะเรียกว่าหัวข้อ นะ) เป็นตัวอ้างอิงหลัก ดังนั้นข้อมูลที่ Publisher จะส่งออกไปยัง Broker ต้องมี Topic กำกับไว้เสมอ ทางฝ่าย Subscriber ก็จะอ้างถึง Topic เพื่อให้ได้ข้อมูลที่ต้องการ
ว่าไปแล้วระบบจะเหมือนกับเรา ไปสมัครเป็นสมาชิก (subscribe) นิตยสารฉบับหนึ่ง ชื่อของนิตยสารก็เปรียบได้กับ topic และผู้ผลิตนิตยสารก็เปรียบได้กับ publisher เมื่อถึงเวลาที่นิตยสารเสร็จ ผู้ผลิตก็ให้ตัวกลาง (broker) นำนิตยสารมาส่งให้เราที่บ้าน
รู้จักกับ MOSQUITTO
MQTT เป็นเพียง Protocol สื่อสาร ในการใช้งานจริง จำเป็นต้องมี Software และ Hardware มารองรับ MOSQUITTO (http://mosquitto.org/) เป็น Open source Message Broker ที่สนับสนุน MQTT การติดตั้ง MOSQUITTO ไม่ใช่เรื่องยาก แต่ในบทความนี้จะใช้ Broker ที่ทาง MOSQUITTO เตรียมไว้ให้เพื่อในการเรียนรู้และทดสอบโดยไม่เสียค่าใช้จ่ายซึ่งมี URL คือ test.mosquitto.org (ศึกษาข้อมูลการให้บริการเพิ่มเติมได้ที่ URL ดังกล่าว)MQTT Application ด้วย Python
Paho project (http://www.eclipse.org/paho/) เป็นโครงการพัฒนา MQTT Library ซึ่งมีให้ใช้งานในหลายภาษารวมทั้ง Python มีชื่อเรียกว่า paho-mqttติดตั้ง paho-mqtt บน Raspberry PI (หรือ Linux )
ทำได้สองวิธี1. ในกรณีที่ติดตั้ง python setuptools (https://pypi.python.org/pypi/setuptools) ไว้แล้ว ใช้การติดตั้งผ่านคำสั่ง pip
$ sudo pip install paho-mqtt
2. ติดตั้งจาก source code (https://www.eclipse.org/paho/clients/python/)
git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git cd org.eclipse.paho.mqtt.python.git sudo python setup.py install
เริ่มสร้างโปรแกรมอย่างง่าย
เพื่อ ให้เข้าใจหลักการทำงานเบื้องต้น ผมจะใช้ Raspberry PI ทำหน้าที่เป็นทั้ง อุปกรณ์ฝั่ง Publisher และ Subscriber บนเครื่องเดียวกัน และใช้ test.mosquitto.org เป็น Broker ก็จะมีระบบครบตามสถาปัตยกรรมที่กล่าวถึงก่อนหน้า
ตัวอย่าง Code
import paho.mqtt.client as mqtt import time BROKER_PORT = 1883 BROKER_HOST = "test.mosquitto.org" # Test host from mosquitto.org KEEPALIVE = 60 #maximum period in seconds allowed between communication TOPIC='tk/demo' def on_connect(client,userdata,results): print "Connected with result "+str(results) client.subscribe(TOPIC,0) # subscribe to broker with topic def on_publish(client,userdata,mid): print "Message has been published with id = "+str(mid) def on_message(client,userdata,msg): print "Incomming message is "+msg.topic +":"+msg.payload client = mqtt.Client() # Be generated when client receives CONNACK message from broker. client.on_connect = on_connect # Be generated after client has published message to broker. client.on_publish = on_publish # Be generated after message from broker arrived. client.on_message = on_message client.connect(BROKER_HOST,BROKER_PORT,KEEPALIVE) client.loop_start() while True: try : time.sleep(5) #option, do not need client.publish(TOPIC,"Hello") except KeyboardInterrupt : client.unsubscribe(TOPIC) client.disconnect() break
Fork on Github |
คำอธิบาย
1. เริ่มต้นด้วยการนำเอา mqtt library เข้ามาในโปรแกรม
import paho.mqtt.client as mqtt
2. กำหนดค่าตัวแปรที่สำคัญ
BROKER_PORT = 1883 #standard MQTT broker port BROKER_HOST = "test.mosquitto.org" # Test host from mosquitto.org KEEPALIVE = 60 #maximum period in seconds allowed between communication TOPIC='tk/demo' #any String could be used.
3. สร้างตัวแปรที่เป็นตัวแทนของอุปกรณ์ของเราเพื่อใช้สื่อสารกับ Broker ในโปรแกรม
client = mqtt.Client()
4. สร้าง Call back functions ซึ่งเป็นส่วนของโปรแกรมที่จะทำงานเมืื่อมี 3 เหตุการณ์เกิดขึ้น ได้แก่
4.1 client.on_connect จะเกิดขึ้นหลังจาก client หรืออุปกรณ์ของเราได้ติดต่อกับ Broker สำเร็จ
4.2 client.on_publish จะเกิดขึ้นหลังจาก client หรืออุปกรณ์ของเราได้ทำการส่งข้อมูล (publish) ไปยัง Broker
4.3 client.on_message จะเกิดขึ้นหลังจากclient หรืออุปกรณ์ของเราได้รับข้อมูล (notify) จาก Broker
5. สร้างการเชื่อมโยงไปยัง Broker
client.connect(BROKER_HOST,BROKER_PORT,KEEPALIVE)
6. ทำการส่งข้อมูลไปยัง Broker
client.loop_start() while True: try : time.sleep(5) #option, do not need. client.publish(TOPIC,"Hello") #send message "Hello" to broker except KeyboardInterrupt : client.unsubscribe(TOPIC) client.disconnect() break
กำหนดให้อุปกรณ์ทำงานวนลูปไปเรื่อย ๆ
ผลการเรียกใช้งานบน Raspberry PI แสดงดังภาพข้างล่างนี้
อะไรที่ทำให้ MQTT น่าสนใจ
ใน สังคมมนุษย์เราต้องการการสื่อสารตลอดเวลา เริ่มจากระหว่างมนุษย์ด้วยกัน มนุษย์กับอุปกรณ์อิเล็กทรอนิกส์ และในยุคนี้กำลังจะมีการสื่อสารระหว่างอุปกรณ์กับอุปกรณ์ (Machine to Machine) ซึ่ง MQTT เป็นส่วนหนึ่งที่ทำให้เกิดขึ้น
จุด หลักที่ MQTT ต่างจาก Web Service ถึงแม้จะใช้ TCP/IP เหมือนกัน คือ MQTT สามารถนำมาใช้กับอุปกรณ์ขนาดเล็กหรือ embeded system ได้เพราะใช้ทรัพยากรและพลังงานน้อยกว่า สามารถใช้งานได้กับระบบโทรมาตร (telesensing) หรือระบบที่ไม่ต้องการคนดูแล (unattended) เช่น ระบบการแพทย์ฉุกเฉินที่ทีมแพทย์สามารถรับรู้ข้อมูลผู้ป่วยในขณะที่ผู้ป่วย ยังอยู่ระหว่างการเดินทาง ระบบการดูแลผู้ป่วยทางไกลหรือผู้สูงอายุที่ไม่มีคนดูแลตลอดเวลา ระบบการจัดส่งสินค้าที่ผู้รับสามารถรับรู้การเดินทางของสินค้าที่สั่งซิ้อ ได้ ระบบจัดการคลังสินค้าที่เรารู้ว่าสินค้าเข้า-ออก inventory อย่างไร ระบบการป้องกันภัยพิบัตรที่ประชาชนทราบข้อมูลจริงจากการวัดจริงไม่ใช่จาก ข่าวลือ ฯลฯ
Raspberry PI เป็นอุปกรณ์คอมพิวเตอร์ที่ได้รับการพัฒนามาจนมีศักยภาพทดแทนการใช้งาน คอมพิวเตอร์ตั้งโต๊ะได้แล้วในบางเรื่อง การนำเอา Raspberry PI มาสร้างเป็นตัวกลางหรือศูนย์กลางการควบคุมอุปกรณ์ย่อย ๆ จึงเป็นเรื่องที่เป็นไปได้และใช้ต้นทุนต่ำ บทความนี้มีวัตถุประสงค์เพื่อจะชื้ประเด็นตรงนี้ครับ
Sign up here with your email
ConversionConversion EmoticonEmoticon