日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Python 是一種廣泛使用的解釋型、高級(jí)編程、通用型編程語言。Python 的設(shè)計(jì)哲學(xué)強(qiáng)調(diào)代碼的可讀性和簡潔的語法(尤其是使用空格縮進(jìn)劃分代碼塊,而非使用大括號(hào)或者關(guān)鍵詞)。Python 讓開發(fā)者能夠用更少的代碼表達(dá)想法,不管是小型還是大型程序,該語言都試圖讓程序的結(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)、智能硬件、車聯(lián)網(wǎng)、電力能源等行業(yè)。

本文主要介紹如何在 Python 項(xiàng)目中使用 paho-mqtt 客戶端庫 ,實(shí)現(xiàn)客戶端與 MQTT 服務(wù)器的連接、訂閱、取消訂閱、收發(fā)消息等功能。

項(xiàng)目初始化

本項(xiàng)目使用 Python 3.6 進(jìn)行開發(fā)測試,讀者可用如下命令確認(rèn) Python 的版本。

?  ~ python3 --version             
Python 3.6.7

選擇 MQTT 客戶端庫

paho-mqtt 是目前 Python 中使用較多的 MQTT 客戶端庫,它在 Python 2.7 或 3.x 上為客戶端類提供了對(duì) MQTT v3.1 和 v3.1.1 的支持。它還提供了一些幫助程序功能,使將消息發(fā)布到 MQTT 服務(wù)器變得非常簡單。

Pip 安裝 Paho MQTT 客戶端

Pip 是 Python 包管理工具,該工具提供了對(duì) Python 包的查找、下載、安裝、卸載的功能。

pip3 install -i https://pypi.doubanio.com/simple paho-mqtt

Python 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客戶端

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 客戶端 id。

broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'

編寫 MQTT 連接函數(shù)

編寫連接回調(diào)函數(shù) on_connect ,該函數(shù)將在客戶端連接后被調(diào)用,在該函數(shù)中可以依據(jù) rc 來判斷客戶端是否連接成功。通常同時(shí)我們將創(chuàng)建一個(gè) MQTT 客戶端,該客戶端將連接到 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)語句,在循環(huán)中我們將設(shè)置每秒調(diào)用 MQTT 客戶端 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

訂閱消息

編寫消息回調(diào)函數(shù) on_message ,該函數(shù)將在客戶端從 MQTT Broker 收到消息后被調(diào)用,在該函數(shù)中我們將打印出訂閱的 topic 名稱以及接收到的消息內(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.6

import random
import time

from paho.mqtt import client as mqtt_client


broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_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 client


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


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

消息訂閱代碼

# python3.6

import random

from paho.mqtt import client as mqtt_client


broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
# generate client ID with pub prefix randomly
client_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 client


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


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

測試

消息發(fā)布

運(yùn)行 MQTT 消息發(fā)布代碼,我們將看到客戶端連接成功,并且成功將消息發(fā)布。

python3 pub.py
如何在 Python 中使用 MQTT

 

消息訂閱

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

python3 sub.py
如何在 Python 中使用 MQTT

 

總結(jié)

至此,我們完成了使用 paho-mqtt 客戶端連接到 公共 MQTT 服務(wù)器 ,并實(shí)現(xiàn)了測試客戶端與 MQTT 服務(wù)器的連接、消息發(fā)布和訂閱。

與 C ++ 或 JAVA 之類的高級(jí)語言不同,Python 比較適合設(shè)備側(cè)的業(yè)務(wù)邏輯實(shí)現(xiàn),使用 Python 您可以減少代碼上的邏輯復(fù)雜度,降低與設(shè)備的交互成本。我們相信在物聯(lián)網(wǎng)領(lǐng)域 Python 將會(huì)有更廣泛的應(yīng)用。

原文作者:EMQ

原文鏈接:https://www.emqx.io/cn/blog/how-to-use-mqtt-in-python

分享到:
標(biāo)簽:MQTT
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評(píng)定2018-06-03

通用課目體育訓(xùn)練成績評(píng)定