mqtt簡介
一種數(shù)據(jù)傳輸協(xié)議候醒,不怎么耗資源假颇,適合物聯(lián)網(wǎng)遠(yuǎn)程傳數(shù)據(jù)歹啼。比如一個(gè)傳感器要發(fā)數(shù)據(jù)給電腦蛾狗,那么需要開一個(gè)mqtt服務(wù)器(Broker)晋涣,然后傳感器作為客戶端(client)通過mqtt服務(wù)器發(fā)布(publish)某個(gè)主題(topic)的消息(message),電腦也作為客戶端沉桌,連接(connect)到mqtt服務(wù)器谢鹊,且訂閱(subscribe)該主題,就能收到消息留凭。
搭建一個(gè)mqtt服務(wù)器
推薦EMQX佃扼,直接選擇合適的版本下載壓縮包,這里選擇了emqx-windows7-v3.2.2.zip
蔼夜,解壓后兼耀,進(jìn)入bin
目錄,啟動(dòng)服務(wù)器:
D:>\emqx\bin>emqx.cmd start
如果要關(guān)閉服務(wù)器,只需如此:
D:>\emqx\bin>emqx.cmd stop
啟動(dòng)服務(wù)器后瘤运,瀏覽器打開http://127.0.0.1:18083
窍霞,使用默認(rèn)管理賬號admin/public
即可登錄查看,在設(shè)置里還能改成中文界面拯坟,很方便但金。
編寫Python例子
首先安裝mqtt
模塊:
pip install paho-mqtt
寫一個(gè)發(fā)布客戶端pub.py
:
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) # 600為keepalive的時(shí)間間隔
client.publish('fifa', payload='amazing', qos=0)
再寫一個(gè)接受客戶端sub.py
:
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) # 600為keepalive的時(shí)間間隔
client.subscribe('fifa', qos=0)
client.loop_forever() # 保持連接
可以先運(yùn)行sub.py
,然后就開始持續(xù)監(jiān)聽郁季,別關(guān)冷溃。另開一個(gè)窗口運(yùn)行pub.py
,然后之前的客戶端就能接收到消息了梦裂,發(fā)一次收一次似枕。
保持連接
這里我的理解也不夠深,不過大體能用塞琼。
-
loop()
感覺是一個(gè)心跳函數(shù)菠净,用來保持客戶端與服務(wù)器的連接。比如keepalive
參數(shù)為60秒彪杉,那么60秒內(nèi)必須loop()
一下或者發(fā)布一下消息毅往,不然連接會斷,就無法繼續(xù)發(fā)布或者接受消息派近。 -
loop_start()
是啟用一個(gè)進(jìn)程保持loop()
的重復(fù)調(diào)用攀唯,就不需要定期心跳了,對應(yīng)的有loop_stop()
渴丸。 -
loop_forever()
用來保持無窮阻塞調(diào)用loop()
侯嘀,原文如下:
"""This function call loop() for you in an infinite blocking loop.
It is useful for the case where you only want to run the MQTT client loop in your program."""
舉例來說明幾種用法,對于發(fā)布客戶端谱轨,第一種保持連接的方式是在keeplive
的間隔內(nèi)戒幔,發(fā)布消息或者調(diào)用loop()
。
client.connect('127.0.0.1', 1883, 5) # keeplive僅為5秒
for i in range(100):
client.publish('fifa', payload=f'amazing{i}', qos=0)
# client.loop() # 或者loop()
time.sleep(4) # 不能超過5秒
第二種方式是使用loop_start()
:
client.connect('127.0.0.1', 1883, 5)
client.loop_start()
for i in range(100):
client.publish('fifa', payload=f'amazing{i}', qos=0)
time.sleep(6) # 可以超過5秒了
對于訂閱客戶端土童,一種方法是使用loop_start()
保持連接诗茎,然后寫個(gè)死循環(huán)阻塞程序,保持監(jiān)聽献汗。
client.connect('127.0.0.1', 1883, 5)
client.subscribe('fifa', qos=0)
client.loop_start()
while True:
pass
第二種方法直接使用loop_forever()
敢订,也能阻塞運(yùn)行:
client.connect('127.0.0.1', 1883, 5)
client.subscribe('fifa', qos=0)
client.loop_forever()
都能持續(xù)接受消息。