一、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的浅见,有什么不对的地方,还望大佬补足。