MQTT Client paho.mqtt.python使用簡介

簡介

MQTT協議目前可能是物聯網最爲流行的傳輸協議,那麼如何使用Python作爲客戶端,和MQTT服務器端進行交互?

本文將以paho.mqtt.python (https://github.com/eclipse/paho.mqtt.python)作爲客戶端,EMQ爲MQTT Broker來介紹paho與EMQ之間交互。

安裝MQTT Broker: EMQ

EMQ是目前開源社區最爲流行的MQTT Broker,之前EMQ君的博客上已經對如何在不同的操作系統安裝,本文不再贅述。

在Ubuntu上安裝EMQ,請點擊這裏;在Windows上安裝EMQ,請點擊這裏

準備paho.mqtt.python

Python安裝請參考這三篇文章:Linux系統python安裝Windows系統Python安裝Mac系統Python安裝

EMQ君建議Python版本爲python3.6(paho建議版本爲2.7+和3.2+)

解壓paho.mqtt.python-master.zip

打開命令行窗口,切換到解壓後paho目錄,安裝paho

python setup.py install

Windows安裝完成後paho文件在Python\Lib\site-packages\paho_mqtt-1.3.1-py3.6.egg\paho\mqtt目錄。

 

Ubuntu安裝完成後paho文件在/usr/local/lib/python3.6/dist-packages/paho_mqtt-1.3.1-py3.6.egg/paho/mqtt/目錄。

 

其中client.py文件中主要Client用法如下:

  • 使用 connect() / connect_async() 連接Broker
  • 調用 loop() 保持與Broker網絡連接
  • 使用 loop_start() 調用一個loop()進程
  • 使用 loop_forever() 保持 loop()調用
  • 使用 subscribe() 訂閱主題並接收消息
  • 使用 publish() 發佈消息
  • 使用 disconnect() 與Broker斷開連接

使用回調函數使Broker返回數據可用,例子如下:

 

def on_connect(client, userdata, flags, rc):
  print("Connection returned " + str(rc))
client.on_connect = on_connect

所有的回調都有一個“client”和一個“userdata”參數,“client”是調用回調的客戶端實例,“userdata”是任何類型的用戶數據,可以在創建新客戶端實例時設置或者使用user_data_set(userdata)

on_connect(client, userdata, flags, rc)

當Broker響應我們請求時調用,“flags” 是一個包含Broker響應參數的字典:flags['session present'] –此標誌僅對於乾淨會話設置爲0,如果設置session=0,用於客戶端重新連接到之前Broker是否仍然保存之前會話信息,如果設1,會話一直存在。“rc”值用於判斷是否連接成功:

 

0: 連接成功
1: 連接失敗-不正確的協議版本
2: 連接失敗-無效的客戶端標識符
3: 連接失敗-服務器不可用
4: 連接失敗-錯誤的用戶名或密碼
5: 連接失敗-未授權
6-255: 未定義.

on_disconnect(client, userdata, rc)

當客戶端與Broker斷開時調用

on_message(client, userdata, message)

在客戶端訂閱的主題上接收到消息時調用,“message”變量是一個MQTT消息描述所有消息特徵

on_publish(client, userdata, mid)

當使用publish()發送的消息已經完成傳輸到代理時調用。對於QoS級別爲1和2的消息,這意味着適當的握手已經完成。對於QoS 0,這僅僅意味着消息已經離開客戶端。“mid”變量是從相應的publish()調用返回的中間變量。這個回調很重要,因爲即使publish()調用返回成功,也並不總是意味着消息已經被髮送

on_subscribe(client, userdata, mid, granted_qos)

當Broker響應訂閱請求時調用,“mid”變量是從相應的subscribe()調用返回的中間變量,“granted_qos”變量是每次發送不同訂閱請求Qos級別的列表

on_unsubscribe(client, userdata, mid)

當Broker響應取消訂閱請求時調用,“mid“變量是從相應的unsubscribe()調用返回的中間變量

on_log(client, userdata, level, buf)

當客戶端有日誌信息時調用,定義允許調試,“level“變量是消息級別包含MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG,消息本身是buf。

使用舉例

paho連接並訂閱主題

使用paho建立連接,並訂閱及發佈主題。連接前EMQ控制檯顯示信息如下所示。

 

Pub代碼如下:

 

import paho.mqtt.client as mqtt
 
def on_connect(client, userdata, flags, rc):
  print("Connected with result code "+str(rc))

def on_message(client, userdata, msg):
  print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.publish('emqtt',payload='Hello,EMQ!',qos=0)
client.loop_start()

運行後顯示如下圖所示。

 

Sub代碼如下,

 

import paho.mqtt.client as mqtt
 
def on_connect(client, userdata, flags, rc):
  print("Connected with result code "+str(rc))

def on_message(client, userdata, msg):
  print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.subscribe('emqtt',qos=0)
client.loop_start()

運行後顯示如下圖所示。

 

執行代碼後EMQ控制檯顯示信息

 

總結

paho客戶端與MQTT交互的相關功能介紹到這裏,如果讀者還有繼續瞭解更多的話,請關注EMQ君的博客。


更多信息請訪問我們的官網 emqx.io,或關注我們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔



作者:EMQ
鏈接:https://www.jianshu.com/p/b76dbc675141
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章