基於MQTT(EMQ)的消息發布訂閱-python實現


參考路徑:https://www.cnblogs.com/taozihua/articles/11197607.html

python代碼實現 

安裝:pip install paho-mqtt

實現Publish-發送消息:

#!/usr/bin/env python
# encoding: utf-8
"""
@version: v1.0
@author: W_H_J
@license: Apache Licence
@contact: 415900617@qq.com
@software: PyCharm
@file: clicentMqttTest.py
@time: 2019/2/22 14:19
@describe: mqtt客戶端
"""
import json
import sys
import os
import paho.mqtt.client as mqtt
import time

sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
sys.path.append("..")

TASK_TOPIC = 'test' # 客戶端發布消息主題

client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
"""
client_id是連接到代理。如果client_id的長度為零或為零,則行為為由使用的協議版本定義。如果使用MQTT v3.1.1,
那么一個零長度的客戶機id將被發送到代理,代理將被發送為客戶端生成一個隨機變量。如果使用MQTT v3.1,那么id將是
隨機生成的。在這兩種情況下,clean_session都必須為True。如果這在這種情況下不會產生ValueError。
注意:一般情況下如果客戶端服務端啟用兩個監聽那么客戶端client_id 不能與服務器相同,如這里用時間"20190222142358"作為它的id,
如果與服務器id相同,則無法接收到消息
"""
client = mqtt.Client(client_id, transport='tcp')

client.connect("127.0.0.1", 1883, 60) # 此處端口默認為1883,通信端口期keepalive默認60
client.loop_start()


def clicent_main(message: str):
"""
客戶端發布消息
:param message: 消息主體
:return:
"""
time_now = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time()))
payload = {"msg": "%s" % message, "data": "%s" % time_now}
# publish(主題:Topic; 消息內容)
client.publish(TASK_TOPIC, json.dumps(payload, ensure_ascii=False))
print("Successful send message!")
return True


if __name__ == '__main__':
msg = "我是一條測試數據!"
clicent_main(msg)


復制代碼
 1 #!/usr/bin/env python  
 2 # encoding: utf-8  
 3 """ 
 4 @version: v1.0 
 5 @author: W_H_J 
 6 @license: Apache Licence  
 7 @contact: 415900617@qq.com 
 8 @software: PyCharm 
 9 @file: clicentMqttTest.py 
10 @time: 2019/2/22 14:19 
11 @describe: mqtt客戶端
12 """
13 import json
14 import sys
15 import os
16 import paho.mqtt.client as mqtt
17 import time
18  
19 sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
20 sys.path.append("..")
21  
22 TASK_TOPIC = 'test'  # 客戶端發布消息主題
23  
24 client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
25 """
26 client_id是連接到代理。如果client_id的長度為零或為零,則行為為由使用的協議版本定義。如果使用MQTT v3.1.1,
27 那么一個零長度的客戶機id將被發送到代理,代理將被發送為客戶端生成一個隨機變量。如果使用MQTT v3.1,那么id將是
28 隨機生成的。在這兩種情況下,clean_session都必須為True。如果這在這種情況下不會產生ValueError。
29 注意:一般情況下如果客戶端服務端啟用兩個監聽那么客戶端client_id 不能與服務器相同,如這里用時間"20190222142358"作為它的id,
30 如果與服務器id相同,則無法接收到消息
31 """
32 client = mqtt.Client(client_id, transport='tcp')
33  
34 client.connect("127.0.0.1", 1883, 60)  # 此處端口默認為1883,通信端口期keepalive默認60
35 client.loop_start()
36  
37  
38 def clicent_main(message: str):
39     """
40     客戶端發布消息
41     :param message: 消息主體
42     :return:
43     """
44     time_now = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time()))
45     payload = {"msg": "%s" % message, "data": "%s" % time_now}
46     # publish(主題:Topic; 消息內容)
47     client.publish(TASK_TOPIC, json.dumps(payload, ensure_ascii=False))
48     print("Successful send message!")
49     return True
50  
51  
52 if __name__ == '__main__':
53     msg = "我是一條測試數據!"
54     clicent_main(msg)
復制代碼

實現Subscribe-訂閱

#!/usr/bin/env python
# encoding: utf-8
"""
@version: v1.0
@author: W_H_J
@license: Apache Licence
@contact: 415900617@qq.com
@software: PyCharm
@file: serverMqttTest.py
@time: 2019/2/22 14:35
@describe: mqtt 服務端
"""
import json
import sys
import os
import time
import paho.mqtt.client as mqtt
sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
sys.path.append("..")

REPORT_TOPIC = 'test' # 主題


def on_connect(client, userdata, flags, rc):
print('connected to mqtt with resurt code ', rc)
client.subscribe(REPORT_TOPIC) # 訂閱主題


def on_message(client, userdata, msg):
"""
接收客戶端發送的消息
:param client: 連接信息
:param userdata:
:param msg: 客戶端返回的消息
:return:
"""
print("Start server!")
payload = json.loads(msg.payload.decode('utf-8'))
print(payload)


def server_conenet(client):
client.on_connect = on_connect # 啟用訂閱模式
client.on_message = on_message # 接收消息
client.connect("127.0.0.1", 1883, 60) # 鏈接
# client.loop_start() # 以start方式運行,需要啟動一個守護線程,讓服務端運行,否則會隨主線程死亡
client.loop_forever() # 以forever方式阻塞運行。


def server_stop(client):
client.loop_stop() # 停止服務端
sys.exit(0)


def server_main():
client_id = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
client = mqtt.Client(client_id, transport='tcp')
server_conenet(client)


if __name__ == '__main__':
# 啟動監聽
server_main()

此方案需要搭建本地MQTT服務器:

我們使用搭建EMQX,下載地址為:https://www.emqx.io/cn/downloads  ,解壓后cd到bin目錄,執行 emqx console

執行成功會彈出下面窗口,不成功就關掉cmd重新試下

打開瀏覽器輸入
http://127.0.0.1:18083
默認用戶名 admin
默認密碼 public


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM