python连接mqtt进行消息收发,网上相关教程比较多,之前研究ESP32对接阿里云物联网时接触过一点mqtt的内容,见这篇文章《阿里云物联网MQTT用户名密码生成链接参数(MQTT客户端发布订阅)》
如果要用python处理mqtt相关消息收发,需要用到paho-mqtt这个库,网上教程一般都是发布与订阅分别在不同的python里面实现,一个python程序负责发布,另一个负责一直循环监听订阅消息,如果想运行python程序中可以随时根据输入的指令进行消息发布,以及显示订阅结果,可以尝试做个while循环实现。
下面贴上根据网络改编的mqtt代码,注意里面的参数是我这边某个阿里云物联网设备的参数,所以参数的“长相”可能跟普通mqtt连接参数不一样。
#listen.py 监听订阅消息import sysimport osimport timeimport paho.mqtt.client as mqttsys.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 mqttimport jsonimport timeclient = 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程序中。
发表评论