假使有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
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
在 message 發布主題“HeightWeight”,內容使用 json 格式發布資料,接著訂閱“BMI”主題。
接著就看 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()
subscribe 收到身高和體重
MQTTlens 收到python 計算的BMI>
當然MQTTlens這個角色也可以用python Publish 達到相同作用。