python 實現 MQTT通信(客戶端與服務器端)
Python paho-mqtt 模塊使用
庫的使用已經有人寫的比較詳細了,這裏就借用了下人家寫好的
https://blog.csdn.net/youshenmebutuo/article/details/79779387
服務器端搭建
下載apache-apollo-1.7.1-windows-distro
現在網上已經很找不到了,我給大家上存到了雲盤裏,供大家下載,裏面還有一些調試工具
鏈接:https://pan.baidu.com/s/1yez9rE-wEyZ4jT6bBq7XpA
提取碼:jm03
複製這段內容後打開百度網盤手機App,操作更方便哦
安裝apache-apollo-1.7.1-windows-distro
解壓到你對應的磁盤裏
例如我解壓在D:\mqtt裏
進入bin目錄
D:\mqtt\apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin
創建你的服務
apollo.cmd create mytest
mytest 爲你的服務名,創建好如圖所示,
啓動服務
創建好會在bin目錄下創建一個名爲mytest的文件夾,進入你文件夾的bin目錄的終端
D:\mqtt\apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin\mytest\bin
輸入 apollo-broker.cmd run啓動服務,啓動好如圖所示。
進入後臺管理
打開網頁,輸入ip + : 61680 進入後臺管理 ,默認用戶名admin 密碼 password
例如 127.0.0.1:61680
python 實現客戶端
建議再看訂閱和發佈的時候,把文章第一部分paho-matt庫的使用看一下,對你代碼的理解有很大的幫助
下載pip庫
pip install paho-mqtt
訂閱主題
import time
import paho.mqtt.client as mqtt
# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("連接成功")
print("Connected with result code " + str(rc))
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_message = on_message
client.connect(host="127.0.0.1", port = 61613, keepalive=60) # 訂閱頻道
time.sleep(1)
# client.subscribe("public")
client.subscribe([("public", 0), ("test", 2)])
client.loop_forever()
發佈主題
import paho.mqtt.client as mqtt
import time
import sys
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
def on_subscribe(client,userdata,mid,granted_qos):
print("消息發送成功")
client = mqtt.Client(protocol=3)
client.username_pw_set("admin", "password")
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.connect(host="127.0.0.1", port = 61613, keepalive=60) # 訂閱頻道
time.sleep(1)
i = 0
while True:
try:
# 發佈MQTT信息
sensor_data = "test" + str(i)
client.publish(topic="public", payload=sensor_data, qos=0)
time.sleep(5)
i += 1
except KeyboardInterrupt:
print("EXIT")
client.disconnect()
sys.exit(0)
運行結果
關於訂閱主題介紹
- /+/*
client.subscribe('public/+/#', qos=2)
可訂閱到以下主題
public/1
public/2
public/2/2
- /+
client.subscribe('public/+, qos=2)
可訂閱到以下主題
public/1
public/2
- /#
client.subscribe('public/#, qos=2)
可訂閱到以下主題
public/1
public/2
public/1/2/2
public/1/2
- /2/+
client.subscribe('public/2/+, qos=2)
可訂閱到以下主題
public/2/2
public/2/1
- /+/2
client.subscribe('public/+/2, qos=2)
可訂閱到以下主題
public/2/2
public/1/2