Mqtt的个人理解和python应用

 一、Mqtt的个人理解

mqtt的核心有三个,分别是发布者、代理服务器、订阅者(消息接收者),这三者mqtt的重要组成部分。在mqtt传输中连接这三者的关键是主题,发布者要在mqtt代理服务器上设定主题,才能发布消息;订阅者要订阅mqtt代理服务器上的主题,才能接收到消息。

二、python应用

下面着重讲解,我之前理解不了的地方。

主题创建

# 发布的主题
publish_topic = 'test/My_dev'

# 接收的主题
message_topic = 'test/server'

发布消息的主题按照上面的格式自行设定,接收消息的主题是mqtt代理服务器上发布者设定好的主题,比如mqtt代理服务器上有 'test/美女' , 'test/帅哥‘,你想接收美女的消息,写前一个主题,想帅哥就后一个主题,如果你设定了一个服务器上没有的主题,那订阅了以后,你将接收不到任何消息

回调函数

回调函数顾名思义,完成某个步骤就会回来调用的函数。

我主要使用的是连接回调函数on_connect和消息回调函数on_message

on_connect

连接回调函数on_connect,是在连接代理服务器后(也就是执行了mqtt的connect函数),无论成功还是失败都会调用的函数,当然前提是你设定的代理服务器ip存在的情况下,如果错误的话会在connect函数这里中断程序。

on_message

消息回调函数on_message,是你订阅的主题,发送消息给你,这个时候机会调用这个函数

其他回调函数也都是这个意思,用不用取决于你什么情况要做什么。

实例

import paho.mqtt.client as mqtt
from paho.mqtt.packettypes import PacketTypes

Class My_mqtt():
    def __init__(self, client_id, address, port):
        self.topic = 'test/my_topic' + client_id
        self.server_topic = 'test/server' + client_id
        self.address = address
        self.port = port
        self.keep_alive = 60

        # 实例化
        self.client = mqtt.Client(client_id=client_id, protocol=mqtt.MQTTv5)
        self.properties = mqtt.Properties(PacketTypes.CONNECT)
        self.properties.SessionExpiryInterval = 7200
        self.client.username_pw_set(username="账号", password="密码")

        self.client.on_connect = self.on_connect
        self.client.on_message = self.on_message
        self.client.on_subscribe = self.on_subscribe
        self.client.on_publish = self.on_publish
        self.client.on_disconnect = self.on_disconnect
        self.client.on_connect_fail = self.on_connect_fail
        self.client.on_unsubscribe = self.on_unsubscribe
        
        # 服务器连接函数
        def connect(self):
            self.client.loop_start()
            self.client.connect(self.address, self.port, self.keep_alive, clean_start=False, properties=self.properties)
        
        def on_connect(self, client, userdata, flags, rc, properties):
            # 主题订阅
            self.client.subscribe(self.server_topic, 2)
        
        def on_message(self, client, userdata, msg):
            print("Message: " + msg.topic+" "+str(msg.payload))
        
        def on_subscribe(client, userdata, mid, granted_qos):
            pass
        
        def on_publish(client, userdata, mid):
            pass
            
        def on_disconnect(client, userdata, rc):
            pass

        def on_connect_fail(client, userdata, rc):
            pass
        
        def on_unsubscribe(client, userdata, mid):
            pass
        
        def publish_msg(self, data):
            if self.client.is_connected():
                self.client.publish(self.topic, payload=data, qos=2)
                print("消息发送成功")
            else:
                print("客户端连接服务器失败")

if __name__ == "__main__":
    mq = My_mqtt('设备id', '服务器ip', '端口号')
    mq.connect()
    message = '123454354'
    mq.publish_msg(message)

注意

1.实例设定Mqtt5进行数据传输,如果不设定mqtt5,mqtt库会默认使用mqtt3

2.qos是消息发送等级,0是只发送一次(会有消息丢失),1是多次发送(会有消息重复),2是保证消息能接收到一次(消息既不重复也不丢失)

3.client_id是设备id,自己设置的也可以不用设置,主要是加在主题上的,’test/my_topic/设备id‘

4.服务器自己搭建

三、总结

以上是为了方便我记忆的mqtt通信python应用,以及一些我对mqtt的浅见,有什么不对的地方,还望大佬补足。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值