iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
1
自我挑戰組

從python入門到物聯網系列 第 27

Day27 - 使用 Python 進行 Publish & Subscribe

安裝套件

pip install paho-mqtt
或者
pip3 install paho-mqtt

Python Subscribe 程式碼

import paho.mqtt.client as mqtt

# 當地端程式連線伺服器得到回應時,要做的動作
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    # 將訂閱主題寫在on_connet中
    # 如果我們失去連線或重新連線時 
    # 地端程式將會重新訂閱
    client.subscribe("Try/MQTT")

# 當接收到從伺服器發送的訊息時要進行的動作
def on_message(client, userdata, msg):
    # 轉換編碼utf-8才看得懂中文
    print(msg.topic+" "+ msg.payload.decode('utf-8'))

# 連線設定
# 初始化地端程式
client = mqtt.Client()

# 設定連線的動作
client.on_connect = on_connect

# 設定接收訊息的動作
client.on_message = on_message

# 設定登入帳號密碼
client.username_pw_set("try","xxxx")

# 設定連線資訊(IP, Port, 連線時間)
client.connect("54.xxx.xxx.xxx", 1883, 60)

# 開始連線,執行設定的動作和處理重新連線問題
# 也可以手動使用其他loop函式來進行連接
client.loop_forever()

Python Publish 程式碼

Publish : 每隔5秒發布溫度的資訊(模擬一下溫度感測器,所以使用亂數),後面則是附上了系統目前的日期與時間。

import paho.mqtt.client as mqtt
import random
import json  
import datetime 
import time

# 設置日期時間的格式
ISOTIMEFORMAT = '%m/%d %H:%M:%S'

# 連線設定
# 初始化地端程式
client = mqtt.Client()

# 設定登入帳號密碼
client.username_pw_set("try","xxxx")

# 設定連線資訊(IP, Port, 連線時間)
client.connect("54.xxx.xxx.xxx", 1883, 60)

while True:
    t0 = random.randint(0,30)
    t = datetime.datetime.now().strftime(ISOTIMEFORMAT)
    payload = {'Temperature' : t0 , 'Time' : t}
    print (json.dumps(payload))
    #要發布的主題和內容
    client.publish("Try/MQTT", json.dumps(payload))
    time.sleep(5)

測試

Publish、Subscribe測試
開啟兩個終端機
一台為 Subscribe
一台為 Publish
也可以開啟MQTTlens 接收資料,或者和 python 互傳資料。

終端機-1 (Subscribe)

接收從 python Publish 出來的溫度資料(亂數出來的~)
還有從 MQTTlens Publish 出來的文字資訊

終端機-2 (Publish)

從 python Publish 溫度資料資料出去

MQTTlens

執行python後,MQTTlens收到的結果如下:
接收從 python Publish 出來的溫度資料(亂數出來的~)
還有從自己 Publish 出來的文字資訊

結論

從面的兩台終端機以及MQTTlens可以實際看出,python 與 MQTTlens 都訂閱了 Try/MQTT 這個主題,Broker 就會將資料轉發給兩者。

假使有2個以上的主題,user1 可以是 A 主題的發布者,以及 B 主題的訂閱者,user2 可以是 B 主題的發布者,以及 A 主題的訂閱者。
明天就是要來試試這個模式囉! /images/emoticon/emoticon08.gif

目前都是在同一個 Topic 收發訊息,而且也使用相同的帳號密碼,明天要來創立兩個不同的 Topic 和兩位使用者的帳號密碼,MQTTlens 模擬用戶端,而python 則是在收到 MQTTlens 的訊息之後經過運算後回傳訊息。

參考資料

paho python 官方文件


上一篇
Day26 - MQTTlens
下一篇
Day28 - 使用 Python 接收後轉發訊息
系列文
從python入門到物聯網30

尚未有邦友留言

立即登入留言