ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于python实现MQTT发布订阅过程原理解析

基于python实现MQTT发布订阅过程原理解析 基于实现MQTT发布订阅过程原理解析更换时间为, 二零二零年, 七月二十七日, 零九点零三分, 三十秒, 作者是小青年て。它把这篇文章着重讲的是, 基于达成MQTT发布订阅流程的原理剖析, 在文中借助示例代码讲解得极为细致。它对于大家的学习或者工作有着一定的可供参考学习的价值, 有需求的朋友能够参考一下。MQTT简介MQTT, 其全称为消息队列遥测传输, 它是一种消息协议, 是基于发布/订阅范式的, 还是“轻量级”的构建于TCP/IP协议之上。MQTT协议具备轻量特点, 它有着简单性质, 呈现开放性态, 还易于实现, 这些特性让其适用范围格外宽泛, 于多种情形下都行得通, 涵盖受限环境, 诸如机器与机器通信领域, 还有物联网范畴。它存在于, 借助卫星链路来通信的传感器当中, 通过偶尔进行拨号操作的医疗设备里面, 应用于智能家居范畴以及一些呈现小型化特点的设备之内, 这些场景中已被广泛运用。MQTT特点1、运用发布/订阅消息模式, 去给出一对多的消息发布行为, 以此解除应用程序之间的耦合, 该协议是需要客户端以及服务端的, 并且协议里主要存在三种身份, 分别是发布者、还有被称之代理且其和服务器相关、以及订阅者, 其中, 消息的发布者和订阅者均为客户端, 消息代理乃是服务器, 而且消息发布者能够做到同时又身为订阅者, 达成了生产者与消费者的脱耦。2、对负载内容屏蔽的消息传输3、使用 TCP/IP 提供网络连接4、有三种消息发布服务质量5、实现小型传输, 其开销极小, 其中固定长度的头部为 2 字节, 协议交换被最小化, 如此来降低网络流量。6、借由使用Last Will, 运用特性通知有关各方, 存在客户端异常中断的机制。原理MQTT协议存三种身份, 分别是发布者, 代理, 订阅者, 发布者与订阅者皆为客户端, 代理乃服务器, 并且消息的发布者亦能够是订阅者, 出于节约内存以及流量, 发布者同订阅者通常会定义于一处。MQTT所传输的, 被划分成两部分的消息, 一部分是主题, 也就是Topic, 它能够被理解成消息的类型, 当订阅者进行订阅之后, 便会收到属于该主题的消息内容, 另一部分则是负载, 负载可以被理解为消息的内容。1.MQTT协议实现方式MQTT 协议的实现, 需要通过客户端与服务器端进行通讯来达成, 在该通讯进程里, MQTT 协议存在三种身份, 分别是发布者、代理也就是服务器、订阅者, 当中, 消息的发布者以及订阅者均为客户端, 消息代理则是服务器, 消息发布者能够同时身为订阅者。经由MQTT进行传输的消息, 被划分成: 主题Topic, 以及负载这两个不同的部分:1话题, 能够被理解成消息的类别, 订阅者在对其进行订阅之后, 便会接收到有着该主题的消息详细内容。2可以理解为消息的内容是指订阅者具体要使用的内容。2.网络传输与应用消息MQTT会构建底层网络传输, 它会建立客户端到服务器的连接, 它会提供两者之间的一个有序的双向传输, 它会提供两者之间的一个无损的双向传输, 它会提供两者之间的一个基于字节流的双向传输。在应用数据借助MQTT网络进行发送这个时候, MQTT会将与之存在关联的服务质量也就是QoS, 和主题名也就是Topic相互联系起来。3.MQTT客户端存有一个应用程序, 或者一个设备, 其使用MQTT协议, 它始终会去建立通往服务器的网络连接, 客户端能够:1发布其他客户端可能会订阅的信息2订阅其它客户端发布的消息3退订或删除应用程序的消息4断开与服务器连接。4.MQTT服务端被称作“消息代理”的MQTT服务器, 它能够是一个应用程序, 也能够是一台设备, 它处于消息发布者与订阅者之间, 它具备这样的能力:1接受来自客户的网络连接2接受客户发布的应用信息3处理来自客户端的订阅和退订请求4向订阅的客户转发应用程序消息。5.MQTT协议中的订阅、主题、会话一、订阅包含主题筛选器Topic, 加入最大服务质量QoS的内容被订阅, 订阅会和一个会话产生关联, 一个会话能涵盖多个订阅项, 每一个会话里的每个订阅都存在别样的主题筛选器。二、会话每个客户端, 在与服务器建立连接之后, 便成为一个会话, 客户端跟服务器之间, 存在着状态交互, 会话, 存在于一个网络之间, 而且, 也有可能在客户端以及服务器之间, 跨越多个连续的网络连接。三、主题名Topic Name存在一个标签, 它和应用程序消息相连接, 此标签能与服务器的订阅达成匹配, 服务器会把消息发送给客户端, 这些客户端是订阅所匹配标签的每一个。四、主题筛选器Topic 具有用于主题名的通配符筛选功能的一种工具, 于订阅表达式里进行运用, 以此来达成订阅那些通过匹配所得的多个主题的操作。五、负载消息订阅者所具体接收的内容。6.MQTT协议中的方法MQTT协议里规定了一些办法, 这些办法也称作动作, 用以表明针对确定资源开展的操作, 这个资源能够代表预先就有的数据, 或者是动态生成的数据, 而这要视服务器的实现情况而定, 一般来讲, 资源指的是服务器上的文件或者输出, 主要方法有:1。等待与服务器建立连接。2持续等待, 让MQTT客户端去完成它所开展的工作, 之后与服务器断开TCP/IP会话。3。等待完成订阅。4。等待服务器取消客户端的一个或多个订阅。5MQTT客户端发出消息请求, 在发送完毕之后, 回馈至应用程序线程。7.应用场景一来它传输消息有着异步性, 呈现发布订阅模式, 二来该协议自身具备轻量特性, 所以能够应用于轻量级应用。能够当作物联网的通信部件来运用, 比如说在树莓派之上绝对可以构建起一个mqtt服务器, 等到将来智能家居全面推广的时候。家居里头的消息通讯, 皆能够借由这个达成, 像智能冰箱温度的检测、房间温度的探测这类信息, 均可经由mqtt予以达成, 遥感数据。汽车检测数据、智能家居、智慧城市、医疗医护都具有应用场景。客户端#!/usr/bin/env python # encoding: utf-8 version: v1.0 author: W_H_J license: Apache Licence contact: 415900617qq.com software: PyCharm file: clicentMqttTest.py time: 2019/2/22 14:19 describe: mqtt客户端 import json import sys import os import paho.mqtt.client as mqtt import time sys.path.append(os.path.abspath(os.path.dirname(__file__) / ..)) sys.path.append(..) TASK_TOPIC test # 客户端发布消息主题 client_id time.strftime(%Y%m%d%H%M%S, time.localtime(time.time())) client_id是连接到代理。如果client_id的长度为零或为零则行为为由使用的协议版本定义。如果使用MQTT v3.1.1 那么一个零长度的客户机id将被发送到代理代理将被发送为客户端生成一个随机变量。如果使用MQTT v3.1那么id将是 随机生成的。在这两种情况下clean_session都必须为True。如果这在这种情况下不会产生ValueError。 注意一般情况下如果客户端服务端启用两个监听那么客户端client_id 不能与服务器相同如这里用时间20190222142358作为它的id 如果与服务器id相同则无法接收到消息 client mqtt.Client(client_id, transporttcp) client.connect(127.0.0.1, 1883, 60) # 此处端口默认为1883通信端口期keepalive默认60 client.loop_start() def clicent_main(message: str): 客户端发布消息 :param message: 消息主体 :return: time_now time.strftime(%Y-%m-%d %H-%M-%S, time.localtime(time.time())) payload {msg: %s % message, data: %s % time_now} # publish(主题Topic; 消息内容) client.publish(TASK_TOPIC, json.dumps(payload, ensure_asciiFalse)) print(Successful send message!) return True if __name__ __main__: msg 我是一条测试数据 clicent_main(msg) client服务端#!/usr/bin/env python # encoding: utf-8 version: v1.0 author: W_H_J license: Apache Licence contact: 415900617qq.com software: PyCharm file: serverMqttTest.py time: 2019/2/22 14:35 describe: mqtt 服务端 import json 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 test # 主题 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): 接收客户端发送的消息 :param client: 连接信息 :param userdata: :param msg: 客户端返回的消息 :return: print(Start server!) payload json.loads(msg.payload.decode(utf-8)) print(payload) def server_conenet(client): client.on_connect on_connect # 启用订阅模式 client.on_message on_message # 接收消息 client.connect(127.0.0.1, 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 time.strftime(%Y%m%d%H%M%S, time.localtime(time.time())) client mqtt.Client(client_id, transporttcp) server_conenet(client) if __name__ __main__: # 启动监听 server_main() server上述这些便是这篇文章的所有内容了, 期望能给大家在学习方面带来一定的助力, 同时也期望大家能够给予脚本之家诸多的支持。
返回列表