Raspberry PI กับ MQTT ตอน 1

รู้จัก 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 มาสร้างเป็นตัวกลางหรือศูนย์กลางการควบคุมอุปกรณ์ย่อย ๆ จึงเป็นเรื่องที่เป็นไปได้และใช้ต้นทุนต่ำ บทความนี้มีวัตถุประสงค์เพื่อจะชื้ประเด็นตรงนี้ครับ

ความคิดเห็น