簡介
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
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。