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/

赞赏

微信赞赏支付宝赞赏

mysql-help-topic
p20161101
springboot-web-mapping-error