python使用MQTT協議發布、訂閱訊息
1、MQTT簡介
MQTT是一個基于客戶端-服務器的訊息發布/訂閱傳輸協議,
一種資料傳輸協議,不怎么耗資源,適合物聯網遠程傳資料,MQTT作業在 TCP/IP 協議族上,是為硬體性能低下的遠程設備以及網路狀況糟糕的情況下而設計的發布/訂閱型訊息協議,為此,它需要一個訊息中間件 (服務器),
比如一個傳感器要發資料給電腦,那么需要開一個mqtt服務器(Broker),然后傳感器作為客戶端(client)通過mqtt服務器發布(publish)某個主題(topic)的訊息(message),電腦也作為客戶端,連接(connect)到mqtt服務器,且訂閱(subscribe)該主題,就能收到訊息,

2、下載MQTT服務器
官網下載
windows下安裝:
-
下載 emqx-windows-4.3.8.zip ,解壓
-
命令列下進入解壓路徑,啟動 emqx
常用命令:
進入bin目錄,啟動服務器 emqx.cmd start 進入bin目錄,關閉服務器 emqx.cmd stop
linux下Ubuntu安裝:
- 下載 emqx-ubuntu18.04-4.3.8-amd64.zip
wget https://www.emqx.com/zh/downloads/broker/4.3.8/emqx-ubuntu18.04-4.3.8-amd64.zip
- 安裝
unzip emqx-ubuntu18.04-4.3.8-amd64.zip
- 運行
./bin/emqx start
常用命令:
啟動命令:./bin/emqttd start
關閉命令:./bin/emqttd stop
控制臺除錯模式啟動,檢查 EMQ 是否可正常啟動
./bin/emqttd console
后臺管理
瀏覽器打開http://127.0.0.1:18083
賬號 admin
密碼 public
3、python使用例子
發布訊息
pub.py
import random
import time
from paho.mqtt import client as mqtt_client
topic = 'python_mqtt' # 發布的主題,訂閱時需要使用這個主題才能訂閱此訊息
# 隨機生成一個客戶端id
client_id = 'python-mqtt-{}'.format(random.randint(0, 1000))
def connect_mqtt():
#連接mqtt服務器
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
# broker = 'broker.emqx.io'
# port = 1883
# client.connect(broker, port)
client.connect(host='127.0.0.1', port=1883)
return client
def publish(client):
# 發布訊息
msg_count = 0
while True:
time.sleep(1)
msg = '這是客戶端發送的第{}條訊息'.format(msg_count)
result = client.publish(topic, msg)
status = result[0]
if status == 0:
print('第{}條訊息發送成功'.format(msg_count))
else:
print('第{}條訊息發送失敗'.format(msg_count))
msg_count += 1
def run():
client = connect_mqtt()
client.loop_start()
publish(client)
if __name__ == '__main__':
run()
訂閱訊息
sub.py
import random
from paho.mqtt import client as mqtt_client
topic = "python_mqtt"
client_id = 'python-mqtt-{}'.format(random.randint(0, 100))
def connect_mqtt() -> mqtt_client:
# 連接MQTT服務器
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.on_connect = on_connect
# broker = 'broker.emqx.io'
# port = 1883
# client.connect(broker, port)
client.connect(host='127.0.0.1', port=1883)
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
data = msg.payload.decode()
print('訂閱【{}】的訊息為:{}'.format(msg.topic, data))
client.subscribe(topic)
client.on_message = on_message
def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()
if __name__ == '__main__':
run()
可以啟動多個訂閱客戶端,都能接收到同樣的發布訊息

后記
【后記】為了讓大家能夠輕松學編程,我創建了一個公眾號【輕松學編程】,里面有讓你快速學會編程的文章,當然也有一些干貨提高你的編程水平,也有一些編程專案適合做一些課程設計等課題,
也可加我微信【1257309054】,拉你進群,大家一起交流學習,
如果文章對您有幫助,請我喝杯咖啡吧!
公眾號

關注我,我們一起成長~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299154.html
標籤:其他
上一篇:linux相關命令及怎么發布檔案
