python实现mqtt客户端进行topic订阅及发布
python连接mqtt进行消息收发,网上相关教程比较多,之前研究ESP32对接阿里云物联网时接触过一点mqtt的内容,见这篇文章《阿里云物联网MQTT用户名密码生成链接参数(MQTT客户端发布订阅)》
如果要用python处理mqtt相关消息收发,需要用到paho-mqtt这个库,网上教程一般都是发布与订阅分别在不同的python里面实现,一个python程序负责发布,另一个负责一直循环监听订阅消息,如果想运行python程序中可以随时根据输入的指令进行消息发布,以及显示订阅结果,可以尝试做个while循环实现。
下面贴上根据网络改编的mqtt代码,注意里面的参数是我这边某个阿里云物联网设备的参数,所以参数的“长相”可能跟普通mqtt连接参数不一样。
#listen.py 监听订阅消息 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 = 'hml6ZQ2pjM/R0hLiQSZ2GlVsWlx2eo7/user/subDeviceConfig' # 主题 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): message = msg.payload.decode() #这里是接收所有订阅消息的入口函数,如果要处理一些逻辑,可以根据订阅到的消息的topic来判断并处理 #比如收到“开灯”消息时,可以在这里再发布一个“开灯成功”的topic给服务端,相当于模拟了一个执行开灯的交互过程 print(message) def server_conenet(client): client.on_connect = on_connect # 启用订阅模式 client.on_message = on_message # 接收消息 client.connect("hml6ZQ2pjM.iot-as-mqtt.cn-shanghai.aliyuncs.com", 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 = "python|securemode=3,signmethod=hmacsha1,timestamp=20230630|" # 这里的client_id我是根据阿里物联网规则生成的 client = mqtt.Client(client_id, transport='tcp') client.username_pw_set("R0hLiQSZ2GlVsWlx2eo7&hml6ZQ2pjM", "7D04F5C2DE8F93060F0F7F2F2183A31BCD2AF69EDS")#如果没有账号密码,这行可以不要,我是根据阿里物联网规则生成的 server_conenet(client) if __name__ == '__main__': # 启动监听 server_main()
#pub.py 这是发布消息,如果只是有少量的发布需求,可以用单独的py写。如果比较多的话还是跟订阅逻辑一起写 在永远为真的while循环里面 import paho.mqtt.client as mqtt import json import time client = mqtt.Client() data = { "pubType":2, "status":0, "playTimes":1, "serialNumber":2087924519996 } param = json.dumps(data) client_id = "python|securemode=3,signmethod=hmacsha1,timestamp=20230630|" client = mqtt.Client(client_id, transport='tcp') client.username_pw_set("R0hLiQSZ2GlVsWlx2eo7&hml6ZQ2pjM", "7D04F5C2DE8F93060F0F7F2F2183A31BCD2AF69EDS") client.connect("hml6ZQ2pjM.iot-as-mqtt.cn-shanghai.aliyuncs.com", 1883, 60) # 连接服务器,端口为1883,维持心跳为60秒 client.publish("hml6ZQ2pjM/R0hLiQSZ2GlVsWlx2eo7/user/pubCommandResult", payload=param, qos=0) # 发送消息
注意上面2个python是独立的抢占性的,就是说如果你打开了监听了python程序,他会一直监听订阅消息,你每用另一个程序发布一条消息,那么监听的那个程序mqtt会被挤下线一次然后重连的。如果有较为频繁的发布逻辑,那么建议把订阅及发布全部做到一个python程序中。
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/python-mqtt-client-topic/
赞赏
微信赞赏支付宝赞赏
发表评论