[Python] MQTT介绍与使用
[Python] MQTT介绍与使用
MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
特点
- 开放消息协议,简单易实现
- 发布订阅模式,一对多消息发布
- 基于TCP/IP网络连接,提供有序,无损,双向连接。
- 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
- 消息QoS支持,可靠传输保证
原理
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
MQTT代理
mosquitto是一款开源的MQTT消息代理(服务器)软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。
- 安装mosquitto
sudo apt-get install mosquitto -y
- 安装mosquitto命令行客户端
sudo apt-get install mosquitto-clients -y
使用
发布使用mosquitto_pub命令,订阅使用mosquitto_sub命令,常用参数如下
参数 | 描述 |
---|---|
-h | 服务器主机,默认localhost |
-t | 指定主题 |
-u | 用户名 |
-P | 密码 |
-i | 客户端id,唯一 |
-m | 发布的消息内容 |
发布
mosquitto_sub -h localhost -t "test/#" -u user2 -P 123456 -i "client1"
订阅
mosquitto_pub -h localhost -t "test/abc" -u user1 -P 123456 -i "client3" -m "How are you?"
MQTT使用
MQTT 客户端工具
MQTT 客户端工具常用于建立与 MQTT 服务器 的连接,进行主题订阅、消息收发等操作
MQTT X 是由 EMQ 开源的一款跨平台 MQTT 5.0 桌面测试客户端,支持 macOS,Linux,Windows
项目地址: MQTT X 官网
下载地址: MQTT X GitHub
mqtt-spy是 Eclipse Paho 和 Eclipse IoT 的一部分,它通过直接启动 JAR 文件在 Java 8 和 JavaFX 之上运行,mqtt-spy 有一种很好的交互方式来展现基本的 MQTT发布/订阅机制。
项目地址: GitHub mqtt-spy
下载地址: https://github.com/eclipse/paho.mqtt-spy/releases
MQTT Explorer 是一个全面且易于使用的 MQTT 客户端,是目前比较流行的 MQTT 桌面测试客户端之一,基于它提供有关 MQTT Topics 的结构化预览展示,并使其在对 MQTT Broker 上的设备/服务的使用变得非常简单。目前基于 CC BY-NC-ND 4.0 协议开源,用户可随意查看源码和使用。
项目地址: Github MQTT-Explorer
下载地址: https://mqtt-explorer.com/
Python
使用 paho-mqtt 库 ,实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能
- 使用connect()/connect_async() 连接MQTT代理
- 频繁的调用loop()来维持与MQTT代理之间的流量或者使用loop_start()来设置一个线程为你调用loop()或者在一个阻塞的函数中调用loop_forever()来为你调用loop()
- 使用subscribe()订阅一个主题(topic)并接受消息(messages)
- 使用publish()来发送消息
- 使用disconnect()来断开与MQTT代理的连接
详细见paho-mqtt项目描述
回调 Callbacks
- on_connect 当代理响应连接请求时调用
- on_disconnect 当与代理断开连接时调用
- on_message 当收到关于客户订阅的主题的消息时调用。
- on_publish 当使用publish()发送的消息已经传输到代理时被调用
- on_subscribe 当代理响应订阅请求时被调用。
- on_unsubscribe 当代理响应取消订阅请求时调用
- on_log 当客户端有日志信息时调用
Client
构造函数
Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport="tcp")
参数 含义 client_id 连接到代理时使用的唯一客户端ID字符串。 如果client_id长度为零或无,则会随机生成一个。 在这种情况下,clean_session参数必须为True。 clean_session 一个决定客户端类型的布尔值。 如果为True,那么代理将在其断开连接时删除有关此客户端的所有信息。 如果为False,则客户端是持久客户端,当客户端断开连接时,订阅信息和排队消息将被保留。 userdata 用户定义的任何类型的数据作为userdata参数传递给回调函数。 它可能会在稍后使用user_data_set()函数进行更新。 protocol 用于此客户端的MQTT协议的版本。 可以是MQTTv31或MQTTv311或MQTT v5.0。 transport 设置为“websockets”通过WebSockets发送MQTT。 保留默认的“tcp”使用原始TCP。 reinitialise
reinitialise(client_id="", clean_session=True, userdata=None)
reinitialise()函数将客户端重置为其开始状态,就像它刚刚创建一样。 它采用与Client()构造函数相同的参数。
connect
将客户端连接到代理。 这是一个阻塞函数。connect(host, port=1883, keepalive=60, bind_address="")
参数 含义 host 远程代理的主机名或IP地址 port 要连接的服务器主机的网络端口。 默认为1883 keepalive 与代理通信之间允许的最长时间段(以秒为单位)。 如果没有其他消息正在交换,则它将控制客户端向代理发送ping消息的速率 bind_address 假设存在多个接口,将绑定此客户端的本地网络接口的IP地址
Publish
从客户端发送消息给代理
publish(topic, payload=None, qos=0, retain=False)
消息将会发送给代理,并随后从代理发送到订阅匹配主题的任何客户端
参数 | 含义 |
---|---|
topic | 该消息发布的主题 |
payload | 要发送的实际消息。如果没有给出,或设置为无,则将使用零长度消息。 传递int或float将导致有效负载转换为表示该数字的字符串。 如果你想发送一个真正的int / float,使用struct.pack()来创建你需要的负载 |
qos | 服务的质量级别 |
retain | 如果设置为True,则该消息将被设置为该主题的“最后已知良好”/保留的消息 |
返回以下属性和方法的MQTTMessageInfo
rc:发布的结果
内容 | 含义 |
---|---|
MQTT_ERR_SUCCESS | 成功 |
MQTT_ERR_NO_CONN | 客户端当前未连接 |
MQTT_ERR_QUEUE_SIZE | 当使用max_queued_messages_set来指示消息既不排队也不发送。 |
mid:发布请求的消息ID。
如果mid已定义,则可以通过检查on_publish()回调中的mid来跟踪发布请求。
wait_for_publish():函数将阻塞,直到消息发布。 如果消息未排队(rc == MQTT_ERR_QUEUE_SIZE),它将引发ValueError。
is_published:如果消息已发布,is_published返回True。 如果消息未排队(rc == MQTT_ERR_QUEUE_SIZE),它将引发ValueError。
如果主题为无,长度为零或无效(包含通配符),qos不是0,1或2之一,或者有效负载长度大于268435455字节,则会引发ValueError。
Subscribe
订阅一个或多个主题
subscribe(topic, qos=0
参数 | 值 |
---|---|
topic | 一个字符串,指定要订阅的订阅主题 |
qos | 期望的服务质量等级。 默认为0。 |
Example
#!/usr/bin/env python3
# -*- coding: utf-8 -*-import paho.mqtt.client as mqtt
import jsonCONN_CONFIG = {'product': {'host': 'mqtt.broker.com','port': 1883,'username': 'username','password': 'password'},'dev': {'host': '127.0.0.1','port': 1883,'username': 'username','password': 'password'}
}class MQTTClient:def __init__(self, client_id, profile='dev', ):self.config = CONN_CONFIG[profile]self.client_id = client_idself.connect_flag = Falseself.client = self.__create_client(client_id)self.__connect()def __create_client(self, client_id):client = mqtt.Client(client_id=client_id)client.username_pw_set(self.config['username'], self.config['password'])client.on_connect = self.__on_connectclient.on_message = self.__on_messageclient.on_publish = self.__on_publishclient.on_disconnect = self.__on_disconnectreturn clientdef __connect(self):self.client.connect(self.config['host'], self.config['port'], 60)self.client.loop_start()def publish(self, msg):if not self.connect_flag:self.__connect()payload = dict(data=msg)self.client.publish(f'topic', payload=json.dumps(payload), qos=0)def __on_connect(self, client, userdata, flags, rc):self.connect_flag = Trueprint("connected with result code: " + str(rc))def __on_message(self, client, userdata, msg):print(msg.topic + " " + str(msg.payload))def __on_subscribe(self, client, userdata, mid, granted_qos):print('on subscribe: mid=' + str(mid))def __on_publish(self, client, userdata, mid):print("on publish: mid=" + str(mid))def __on_disconnect(self, client, userdata, rc):self.connect_flag = Falseprint('disconnecting reason ' + str(rc))def __del__(self):self.client.disconnect()
参考
MQTT 入门介绍
MQTT中文网
ubuntu下Mosquitto安装及配置
常见MQTT 客户端工具比较
Python paho-mqtt 模块使用和API分析
[Python] MQTT介绍与使用相关推荐
- python mqtt库_如何在 Python 中使用 MQTT
Python 是一种广泛使用的解释型.高级编程.通用型编程语言.Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词).Python 让开发者能 ...
- Blender中的Python脚本介绍学习教程
Blender中的Python脚本介绍学习教程 MP4 |视频:h264,1280×720 |音频:AAC,48000 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.63 ...
- python软件界面-python软件界面介绍(python软件介绍)
python软件界面介绍 1.接口初始化 当我们使用pycharm工具时,我们将遇到的第一个问题是,在进行各种配置后界面变得混乱时,我们该怎么办?我们应该还原,那么如何还原初始设置? 尽管此工具是从e ...
- python语言简介-Python语言介绍
原标题:Python语言介绍 Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其 ...
- python语言介绍-00-python语言介绍
以下为摘录的python的介绍 Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. Python是动态类型 ...
- python介绍和用途-Python基础介绍(一)
Python基础介绍(一) 1. python是什么编程语言 编译型与解释型 编译器吧源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以极其语言来运行此程序,速度很快 ...
- python介绍和用途-python应用领域介绍
python应用领域介绍Python作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于多种操作系统,目前在国际上非常流行,正在得到越来越多的应用. 下面就让我们一起来看看它的 ...
- python模块介绍-locustio:性能测试工具locustio
转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...
- Python 语言介绍
本节目录: 一.编程语言介绍 二.python解释器介绍 三.安装python解释器 四.运行python程序的两种方式 五.变量 六.后期补充内容 一.编程语言介绍 1.机器语言: 直接用二进制编程 ...
最新文章
- LeetCode-Partition List-分割链表-链表操作
- 时间排序python_算法导论 第八章 线性时间排序(python)
- Win32系统下安装Win64补充说明
- C# 向TIM或者QQ自动发送中文消息【微信也是可用的】 附测试GIF
- git maven 一键部署_Jenkins实现一键部署maven项目
- mysql改为sql_项目需求变更:Mysql改为SqlServer
- leetcode--5. 最长回文子串
- FTP连接时出现“227 Entering Passive Mode”的解决方法
- 58到家运维专家杨经营:业务上云后运维平台的演进之路
- python建立文件数据库_python学习-- Django根据现有数据库,自动生成models模型文件...
- css不继承上级样式_CSS基础知识(一)
- PHP实现简单的计算器
- Qt 中实现在控件中点击鼠标,就在鼠标点击处加载图片的方法
- [转帖]SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
- 视频怎么加水印?这里有你想要的答案
- php 采集qq空间,php批量抓取QQ空间相册链接
- swift 函数类型+高阶函数
- windows如何截屏
- 科学绘图软件 Prism 安装教程
- textarea在IE浏览器下只显示一行