在 Python 中使用 MQTT的方法
Python 是一種廣泛使用的解釋型、高級(jí)編程、通用型編程語(yǔ)言。Python 的設(shè)計(jì)哲學(xué)強(qiáng)調(diào)代碼的可讀性和簡(jiǎn)潔的語(yǔ)法(尤其是使用空格縮進(jìn)劃分代碼塊,而非使用大括號(hào)或者關(guān)鍵詞)。Python 讓開(kāi)發(fā)者能夠用更少的代碼表達(dá)想法,不管是小型還是大型程序,該語(yǔ)言都試圖讓程序的結(jié)構(gòu)清晰明了。
MQTT 是一種基于發(fā)布/訂閱模式的 輕量級(jí)物聯(lián)網(wǎng)消息傳輸協(xié)議 ,可以用極少的代碼和帶寬為聯(lián)網(wǎng)設(shè)備提供實(shí)時(shí)可靠的消息服務(wù),它廣泛應(yīng)用于物聯(lián)網(wǎng)、移動(dòng)互聯(lián)網(wǎng)、智能硬件、車(chē)聯(lián)網(wǎng)、電力能源等行業(yè)。
本文主要介紹如何在 Python 項(xiàng)目中使用 paho-mqtt 客戶(hù)端庫(kù) ,實(shí)現(xiàn)客戶(hù)端與 MQTT 服務(wù)器的連接、訂閱、取消訂閱、收發(fā)消息等功能。
項(xiàng)目初始化本項(xiàng)目使用 Python 3.6 進(jìn)行開(kāi)發(fā)測(cè)試,讀者可用如下命令確認(rèn) Python 的版本。
➜ ~ python3 --version Python 3.6.7選擇 MQTT 客戶(hù)端庫(kù)
paho-mqtt 是目前 Python 中使用較多的 MQTT 客戶(hù)端庫(kù),它在 Python 2.7 或 3.x 上為客戶(hù)端類(lèi)提供了對(duì) MQTT v3.1 和 v3.1.1 的支持。它還提供了一些幫助程序功能,使將消息發(fā)布到 MQTT 服務(wù)器變得非常簡(jiǎn)單。
Pip 安裝 Paho MQTT 客戶(hù)端Pip 是 Python 包管理工具,該工具提供了對(duì) Python 包的查找、下載、安裝、卸載的功能。
pip3 install -i https://pypi.doubanio.com/simple paho-mqttPython MQTT 使用連接 MQTT 服務(wù)器
本文將使用 EMQ X 提供的 免費(fèi)公共 MQTT 服務(wù)器 ,該服務(wù)基于 EMQ X 的 MQTT 物聯(lián)網(wǎng)云平臺(tái) 創(chuàng)建。服務(wù)器接入信息如下:
Broker: broker.emqx.io TCP Port: 1883 Websocket Port: 8083 導(dǎo)入 Paho MQTT客戶(hù)端from paho.mqtt import client as mqtt_client設(shè)置 MQTT Broker 連接參數(shù)
設(shè)置 MQTT Broker 連接地址,端口以及 topic,同時(shí)我們調(diào)用 Python random.randint 函數(shù)隨機(jī)生成 MQTT 客戶(hù)端 id。
broker = ’broker.emqx.io’port = 1883topic = '/python/mqtt'client_id = f’python-mqtt-{random.randint(0, 1000)}’編寫(xiě) MQTT 連接函數(shù)
編寫(xiě)連接回調(diào)函數(shù) on_connect ,該函數(shù)將在客戶(hù)端連接后被調(diào)用,在該函數(shù)中可以依據(jù) rc 來(lái)判斷客戶(hù)端是否連接成功。通常同時(shí)我們將創(chuàng)建一個(gè) MQTT 客戶(hù)端,該客戶(hù)端將連接到 broker.emqx.io 。
def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print('Connected to MQTT Broker!') else: print('Failed to connect, return code %dn', rc) # Set Connecting Client ID client = mqtt_client.Client(client_id) client.on_connect = on_connect client.connect(broker, port) return client發(fā)布消息
首先定義一個(gè) while 循環(huán)語(yǔ)句,在循環(huán)中我們將設(shè)置每秒調(diào)用 MQTT 客戶(hù)端 publish 函數(shù)向 /python/mqtt 主題發(fā)送消息。
def publish(client): msg_count = 0 while True: time.sleep(1) msg = f'messages: {msg_count}' result = client.publish(topic, msg) # result: [0, 1] status = result[0] if status == 0: print(f'Send `{msg}` to topic `{topic}`') else: print(f'Failed to send message to topic {topic}') msg_count += 1訂閱消息
編寫(xiě)消息回調(diào)函數(shù) on_message ,該函數(shù)將在客戶(hù)端從 MQTT Broker 收到消息后被調(diào)用,在該函數(shù)中我們將打印出訂閱的 topic 名稱(chēng)以及接收到的消息內(nèi)容。
def subscribe(client: mqtt_client): def on_message(client, userdata, msg): print(f'Received `{msg.payload.decode()}` from `{msg.topic}` topic') client.subscribe(topic) client.on_message = on_message完整代碼消息發(fā)布代碼
# python 3.6import randomimport timefrom paho.mqtt import client as mqtt_clientbroker = ’broker.emqx.io’port = 1883topic = '/python/mqtt'# generate client ID with pub prefix randomlyclient_id = f’python-mqtt-{random.randint(0, 1000)}’def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print('Connected to MQTT Broker!') else: print('Failed to connect, return code %dn', rc) client = mqtt_client.Client(client_id) client.on_connect = on_connect client.connect(broker, port) return clientdef publish(client): msg_count = 0 while True: time.sleep(1) msg = f'messages: {msg_count}' result = client.publish(topic, msg) # result: [0, 1] status = result[0] if status == 0: print(f'Send `{msg}` to topic `{topic}`') else: print(f'Failed to send message to topic {topic}') msg_count += 1def run(): client = connect_mqtt() client.loop_start() publish(client)if __name__ == ’__main__’: run()消息訂閱代碼
# python 3.6import randomimport timefrom paho.mqtt import client as mqtt_clientbroker = ’broker.emqx.io’port = 1883topic = '/python/mqtt'# generate client ID with pub prefix randomlyclient_id = f’python-mqtt-{random.randint(0, 1000)}’def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print('Connected to MQTT Broker!') else: print('Failed to connect, return code %dn', rc) client = mqtt_client.Client(client_id) client.on_connect = on_connect client.connect(broker, port) return clientdef publish(client): msg_count = 0 while True: time.sleep(1) msg = f'messages: {msg_count}' result = client.publish(topic, msg) # result: [0, 1] status = result[0] if status == 0: print(f'Send `{msg}` to topic `{topic}`') else: print(f'Failed to send message to topic {topic}') msg_count += 1def run(): client = connect_mqtt() client.loop_start() publish(client)if __name__ == ’__main__’: run()消息訂閱代碼# python3.6import randomfrom paho.mqtt import client as mqtt_clientbroker = ’broker.emqx.io’port = 1883topic = '/python/mqtt'# generate client ID with pub prefix randomlyclient_id = f’python-mqtt-{random.randint(0, 100)}’def connect_mqtt() -> mqtt_client: def on_connect(client, userdata, flags, rc): if rc == 0: print('Connected to MQTT Broker!') else: print('Failed to connect, return code %dn', rc) client = mqtt_client.Client(client_id) client.on_connect = on_connect client.connect(broker, port) return clientdef subscribe(client: mqtt_client): def on_message(client, userdata, msg): print(f'Received `{msg.payload.decode()}` from `{msg.topic}` topic') client.subscribe(topic) client.on_message = on_messagedef run(): client = connect_mqtt() subscribe(client) client.loop_forever()if __name__ == ’__main__’: run()測(cè)試消息發(fā)布
運(yùn)行 MQTT 消息發(fā)布代碼,我們將看到客戶(hù)端連接成功,并且成功將消息發(fā)布。
python3 pub.py

運(yùn)行 MQTT 消息訂閱代碼,我們將看到客戶(hù)端連接成功,并且成功接收到發(fā)布的消息。
python3 sub.py

至此,我們完成了使用 paho-mqtt 客戶(hù)端連接到 公共 MQTT 服務(wù)器 ,并實(shí)現(xiàn)了測(cè)試客戶(hù)端與 MQTT 服務(wù)器的連接、消息發(fā)布和訂閱。
與 C ++ 或 Java 之類(lèi)的高級(jí)語(yǔ)言不同,Python 比較適合設(shè)備側(cè)的業(yè)務(wù)邏輯實(shí)現(xiàn),使用 Python 您可以減少代碼上的邏輯復(fù)雜度,降低與設(shè)備的交互成本。我們相信在物聯(lián)網(wǎng)領(lǐng)域 Python 將會(huì)有更廣泛的應(yīng)用。
接下來(lái)我們將會(huì)陸續(xù)發(fā)布更多關(guān)于物聯(lián)網(wǎng)開(kāi)發(fā)及 Python 的相關(guān)文章,敬請(qǐng)關(guān)注。
以上就是在 Python 中使用 MQTT的方法的詳細(xì)內(nèi)容,更多關(guān)于Python 中使用 MQTT的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Java commons-httpclient如果實(shí)現(xiàn)get及post請(qǐng)求2. 一文帶你徹底理解Java序列化和反序列化3. JS中6個(gè)對(duì)象數(shù)組去重的方法4. Python基于requests庫(kù)爬取網(wǎng)站信息5. vscode運(yùn)行php報(bào)錯(cuò)php?not?found解決辦法6. python中文本字符處理的簡(jiǎn)單方法記錄7. PHP laravel實(shí)現(xiàn)導(dǎo)出PDF功能8. Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)9. PHP利用curl發(fā)送HTTP請(qǐng)求的實(shí)例代碼10. 資深程序員:給Python軟件開(kāi)發(fā)測(cè)試的25個(gè)忠告!

網(wǎng)公網(wǎng)安備