iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0
自我挑戰組

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

Day28 - 使用 Python 接收後轉發訊息

  • 分享至 

  • xImage
  •  

前言

假使有2個以上的主題,user1 可以是 A 主題的發布者,以及 B 主題的訂閱者,user2 可以是 B 主題的發布者,以及 A 主題的訂閱者。

今天就是要來試試這個模式囉!

首先要來創立兩個不同的 Topic 和兩位使用者的帳號密碼,MQTTlens 模擬用戶端,而python 則是在收到 MQTTlens 的訊息之後經過運算後回傳訊息。

MQTTlens 當作偵測的sensor
將身高與體重資料發布出去
帳號 sensor
權限 寫入 HeightWeight 、 讀取 BMI
{"Height" : 180 , "Weight" : 80}

Python 當作運算的device
將收到的身高與體重運算成BMI後發布
帳號 python
權限 寫入 BMI 、 讀取 HeightWeight

帳號

  • 新增帳號密碼
    利用 mosquitto_passwd 設立密碼,還有密碼檔案。
sudo mosquitto_passwd /etc/mosquitto/passwd <帳號名稱>
Password: xxxx
Reenter password: xxxx

權限

進入 ACL(Access Control List)檔案

sudo vi /etc/mosquitto/acl

編輯權限

user sensor
topic write HeightWeight
topic read BMI

user python
topic read HeightWeight
topic write BMI

因為剛剛修改了mosquitto.conf設定檔案
所以要重新開啟 mosquitto service

sudo service mosquitto stop
sudo service mosquitto start

MQTTlens Publish 資料

在 message 發布主題“HeightWeight”,內容使用 json 格式發布資料,接著訂閱“BMI”主題。

接著就看 python 如何撰寫接收後轉發其他主題吧!

Python 接收後運算再轉發其他主題

將要轉發publish的動作寫在on_message => 設定接收訊息的動作的function裡。

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

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

subscribe 收到身高和體重後,接著來計算 BMI ,算完後再轉發到BMI主題,將BMI傳送給有訂閱BMI的MQTTlens吧。

import paho.mqtt.client as mqtt
import json

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

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

# 當接收到從伺服器發送的訊息時要進行的動作
def on_message(client, userdata, msg):
    # 轉換編碼utf-8才看得懂中文
    print(msg.topic+" " + msg.payload.decode('utf-8'))
    bmi = BMI(msg.payload.decode('utf-8'))
    
    # 發布BMI主題資料
    client.publish("BMI", "計算後的BMI為 : " + str(bmi))

def BMI(data):
    data = json.loads(data)
    height = data["Height"]
    weight = data["Weight"]

    bmi = weight / ((height/100)**2)
    return bmi

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

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

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

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

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

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

結果

python

subscribe 收到身高和體重

MQTTlens

MQTTlens 收到python 計算的BMI>

當然MQTTlens這個角色也可以用python Publish 達到相同作用。

參考資料

paho python 官方文件


上一篇
Day27 - 使用 Python 進行 Publish & Subscribe
下一篇
Day29 - python 連接 InfluxDB
系列文
從python入門到物聯網30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言