網上找了很多關于Mqtt 客戶端變成的文章,基本是翻譯官方文檔為主,從小白角度來看,這些文檔還不足以讓一個小白能夠快速上手并完成簡單客戶端的開發。
于是自己總結了一些內容,用于練習并熟練記憶。
第一步:安裝mqtt庫
pip install paho-mqtt
第二步:創建mqtt客戶端腳本
創建一個test_mqtt_client.py文件
第三步:在文件中編寫腳本
1、簡單的客戶端腳本-Mqtt服務器需要做任何校驗
import paho.mqtt.client as mqtt
MQTTHOST = "101.200.46.138"
MQTTPORT = 1883
mqttClient = mqtt.Client()
# 連接MQTT服務器
def on_mqtt_connect():
mqttClient.connect(MQTTHOST, MQTTPORT, 60)
mqttClient.loop_start()
# publish 消息
def on_publish(topic, payload, qos):
mqttClient.publish(topic, payload, qos)
# 消息處理函數
def on_message_come(lient, userdata, msg):
print(msg.topic + " " + ":" + str(msg.payload))
# subscribe 消息
def on_subscribe():
mqttClient.subscribe("/server", 1)
mqttClient.on_message = on_message_come # 消息到來處理函數
def main():
on_mqtt_connect()
on_publish("/test/server", "Hello Python!", 1)
on_subscribe()
while True:
pass
if __name__ == '__main__':
main()
2、一般項目中使用的Mqtt服務都需要認證,以下是認證客戶端腳本
# -*- coding:utf-8 -*-
# /usr/bin/env python
__author__ = 'Five'
import json
import time
import paho.mqtt.client as mqtt
from models.model_wx_pc import PCShow
pc = PCShow()
# 鑒權服務獲取秘鑰
def getuserTicker(uid):
content = pc.userTicker(uid)
return content["data"]["ext"], content["data"]["ticker"]
def on_connect(mqttc, obj, flags, rc):
print("Connected with result code " + str(rc) + ' '+str(flags) + obj)
def on_message(mqttc, obj, msg):
print("message: "+ msg)
def on_subscribe(mqttc, obj, mid, granted_qos):
print(obj + "訂閱Subscribed: " + str(mid) + " " + str(granted_qos))
def on_log(mqttc, obj, level, string):
print(obj +level+ u'日志' + string)
def on_publish(mqttc, obj, mid):
print(obj + u"發送消息" + str(mid))
def client(host='101.200.46.138', uid="1"):
ext, ticker = getuserTicker(uid)
topic = 'default'
port = 1883
payload = {
'cmd':'inroom',
'msgid':1
}
# 初始化mqtt實例時需要根據mqtt服務端具體協議版本指定protocol
# MQTTv31 = 3,MQTTv311 = 4,MQTTv5 = 5一定要匹配,不然無法連接服務器,其他參數詳解看源碼即可
mqttc = mqtt.Client(client_id="1", clean_session=True, protocol=3)
# 設置mqtt實例的認證信息
mqttc.username_pw_set(ticker, ticker)
# 設置mqtt實例中自定義的消息內容
mqttc.user_data_set(u'無敵是多么寂寞')
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_publish = on_publish
mqttc.on_log=on_log
mqttc.connect(host, port, 60)
# 發布
mqttc.publish(topic, payload, 0)
# 訂閱
mqttc.subscribe(topic, 0)
# loop_forever調用會阻塞主線程,將永遠不會終止
mqttc.loop_forever()
if __name__ == '__main__':
client()
3、第2種方式用使用了loop_forever,導致主線程一直阻塞無法完成其他的事情,優化腳本使用loop_start()(Loop_start在另一個線程中啟動一個循環,如果您需要在主線程中執行其他操作,則讓主線程繼續運行其他內容。),并在主線中打印消息
# -*- coding:utf-8 -*-
# /usr/bin/env python
__author__ = 'Five'
import json
import time
import paho.mqtt.client as mqtt
from models.model_wx_pc import PCShow
from queue import Queue
q = Queue()
msgs = []
pc = PCShow(1083722)
def getuserTicker(uid=607538990):
content = PCShow().userTicker(uid)
return content["data"]["ext"], content["data"]["ticker"]
def on_connect(mqttc, obj, flags, rc):
print("Connected with result code " + str(rc) + ' '+str(flags) + obj)
def on_message(mqttc, obj, msg):
# if json.loads(msg.payload.decode('utf-8'))["cmd"] == "onpwsysgiftbox":
# print(json.loads(msg.payload.decode('utf-8'))['activity_ret']['data'])
m = "message received ", str(msg.payload.decode("utf-8"))
msgs.append(m)
q.put(m)
def on_subscribe(mqttc, obj, mid, granted_qos):
print(obj + "訂閱Subscribed: " + str(mid) + " " + str(granted_qos))
def on_log(mqttc, obj, level, string):
print(obj +level+ u'日志' + string)
def on_publish(mqttc, obj, mid):
print(obj + u"發送消息" + str(mid))
def client(host='101.200.46.138', uid="1"):
ext, ticker = getuserTicker(uid)
topic = 'default'
port = 1883
payload = {
"Cmd": "inroom",
"Platform": "Android",
"MsgId": 99,
}
mqttc = mqtt.Client(client_id="1", clean_session=True, protocol=3)
mqttc.username_pw_set(ticker, ticker)
mqttc.user_data_set(u'無敵是多么寂寞')
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_publish = on_publish
mqttc.on_log=on_log
mqttc.connect(host, port, 60)
mqttc.publish(topic, payload, 0)
mqttc.subscribe(topic, 0)
mqttc.loop_start()
while True:
while len(msgs) > 0:
print("message: ",msgs.pop(0))
while not q.empty():
message = q.get()
print("queue: ", message)
if message == 'quit':
break
mqttc.loop_stop()
if __name__ == '__main__': client()
輸出結果如下:

新線程中獲得消息并存儲,主線程中進行打印。實現新線程和主線程之間的通信。
你還可以在主線程中做一些其他可以做的事情。
mqtt其他相關資料參考:
http://www.steves-internet-guide.com/into-mqtt-python-client/
https://blog.csdn.net/youshenmebutuo/article/details/79779387
浙公網安備 33010602011771號