您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python快速实现MQTT双向订阅发布

5b51 2022/1/14 8:17:40 python 字数 12806 阅读 392 来源 www.jb51.cc/python

提要:本人在物联网开发中,需要使用MQTT技术,以此记录,也可让新手系统快速的入门应用。本文应用为双向订阅发布通信。一、MQTT基础知识MQTT简介、基础、认识有很多相关文章,本文不再赘述,但对于没有方向的同学,可以参考我的学习路线,推荐MQTT官网了解相关原理知识–MQTT官网,再看**官

概述

提要:本人在物联网开发中,需要使用MQTT技术,以此记录,也可让新手系统快速的入门应用。本文应用为双向订阅发布通信。

MQTT简介、基础、认识有很多相关文章,本文不再赘述,但对于没有方向的同学,可以参考我的学习路线,推荐MQTT官网了解相关原理知识–MQTT官网,再看**官网推荐相关系列文章即可使任何人都可以快速掌握MQTT,而无需阅读整个MQTT规范。它解释了MQTT概念的核心,其功能和其他基本信息。**
个人总结:

1. MQTT通过Broker存储数据,转发数据,所以要启动一个Broker软件,本人使用[EMQ X Broker官网]

(https://www.emqx.cn/downloads#broker),
1.1 找到对应系统,下载对应版本。比如Windows,以下以此为例

在这里插入图片描述

Ubuntu对应步骤

cd进入emqx\bin

启动成功

2.使用Python语言进行开发,需要安装依赖包pip install paho-mqtt

在这里插入图片描述

代码双向通信,即一端即为发布者又为订阅者,根据主题不同来区分。如果不需要双向通信,可以不写对应回调函数,以及对应推送或者订阅方法
根据个人需求更改发布者数据:topic主题订阅订阅主题,即可接到发布者发布的数据;sensor_data即为发送的数据,可以为任意格式,根据个人需求更改

 # 发布MQTT信息
        sensor_data = "ni hao ......from topic-demo"
        client.publish(topic="demo", payload=sensor_data, qos=2)

根据个人需求更改订阅数据:topic主题,此为test主题订阅订阅主题,即可接到发布者发布的数据;

# 订阅主题 实现双向通信中接收功能,qs质量等级为2
client.subscribe(("test", 2))
import paho.mqtt.client as mqtt
import time


# 当代理响应订阅请求时被调用。
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("连接成功")
    print("Connected with result code " + str(rc))


# 当代理响应订阅请求时被调用
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))


# 当使用使用publish()发送的消息已经传输到代理时被调用。
def on_publish(client, obj, mid):
    print("OnPublish, mid: " + str(mid))


# 当收到关于客户订阅主题的消息时调用。 message是一个描述所有消息参数的MQTTMessage。
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))


# 当客户端有日志信息时调用
def on_log(client, obj, level, string):
    print("Log:" + string)


# 实例化
client = mqtt.Client()
# client.username_pw_set("admin", "password")
# 回调函数
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.on_message = on_message
client.on_log = on_log
# host为启动的broker地址 举例本机启动的ip 端口认1883
client.connect(host="127.0.0.1", port=1883, keepalive=6000)  # 订阅频道
time.sleep(1)

# 多个主题采用此方式
# client.subscribe([("demo", 0), ("test", 2)])

# 订阅主题 实现双向通信中接收功能,qs质量等级为2
client.subscribe(("test", 2))
client.loop_start()

i = 0
while True:
    try:
        # 发布MQTT信息
        sensor_data = "ni hao ......from topic-demo"
        # 消息将会发送给代理,并随后从代理发送到订阅匹配主题的任何客户端。
        # publish(topic, payload=None, qos=0, retain=False)
        # topic:该消息发布的主题
        # payload:要发送的实际消息。如果没有给出,或设置为无,则将使用零长度消息。 传递int或float将导致有效负载转换为表示该数字的字符串。 如果你想发送一个真正的int / float,使用struct.pack()来创建你需要的负载
        # qos:服务的质量级别 对于Qos级别为1和2的消息,这意味着已经完成了与代理的握手。 对于Qos级别为0的消息,这只意味着消息离开了客户端。
        # retain:如果设置为True,则该消息将被设置为该主题的“最后已知良好” / 保留的消息
        client.publish(topic="demo", payload=sensor_data, qos=2)
        time.sleep(5)
        # i += 1
    except KeyboardInterrupt:
        print("EXIT")
        # 这是网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接。
        client.disconnect()

import paho.mqtt.client as mqtt
import time


# 当代理响应订阅请求时被调用。
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("连接成功")
    print("Connected with result code " + str(rc))


# 当代理响应订阅请求时被调用
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))


# 当使用使用publish()发送的消息已经传输到代理时被调用。
def on_publish(client, obj, mid):
    print("OnPublish, mid: " + str(mid))


# 当收到关于客户订阅主题的消息时调用。 message是一个描述所有消息参数的MQTTMessage。
def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))


# 当客户端有日志信息时调用
def on_log(client, obj, level, string):
    print("Log:" + string)


# 实例化
client = mqtt.Client()
# client.username_pw_set("admin", "password")
# 回调函数
client.on_connect = on_connect
client.on_subscribe = on_subscribe
client.on_message = on_message
client.on_log = on_log
# host为启动的broker地址 举例本机启动的ip 端口认1883
client.connect(host="127.0.0.1", port=1883, keepalive=6000)  # 订阅频道
time.sleep(1)

# 多个主题采用此方式
# client.subscribe([("demo", 0), ("test", 2)])

# 订阅主题 实现双向通信中接收功能,qs质量等级为2
client.subscribe(("demo", 2))
client.loop_start()

i = 0
while True:
    try:
        # 发布MQTT信息
        sensor_data = "hello word......from topic-test"
        # 消息将会发送给代理,并随后从代理发送到订阅匹配主题的任何客户端。
        # publish(topic, payload=None, qos=0, retain=False)
        # topic:该消息发布的主题
        # payload:要发送的实际消息。如果没有给出,或设置为无,则将使用零长度消息。 传递int或float将导致有效负载转换为表示该数字的字符串。 如果你想发送一个真正的int / float,使用struct.pack()来创建你需要的负载
        # qos:服务的质量级别 对于Qos级别为1和2的消息,这意味着已经完成了与代理的握手。 对于Qos级别为0的消息,这只意味着消息离开了客户端。
        # retain:如果设置为True,则该消息将被设置为该主题的“最后已知良好” / 保留的消息
        client.publish(topic="test", payload=sensor_data, qos=2)
        time.sleep(5)
        # i += 1
    except KeyboardInterrupt:
        print("EXIT")
        # 这是网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接。
        client.disconnect()

欢迎各位交流,如有错误,欢迎指正,figting!

总结

以上是编程之家为你收集整理的Python快速实现MQTT双向订阅发布全部内容,希望文章能够帮你解决Python快速实现MQTT双向订阅发布所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶