在 Python 中使用 MQTT的方法

2023-11-03

更多编程教程请到:菜鸟教程 https://www.piaodoo.com/

友情链接:

高州阳光论坛https://www.hnthzk.com/

Python 是一种广泛使用的解释型、高级编程、通用型编程语言。Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。Python 让开发者能够用更少的代码表达想法,不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

本文主要介绍如何在 Python 项目中使用 paho-mqtt 客户端库 ,实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。

项目初始化

本项目使用 Python 3.6 进行开发测试,读者可用如下命令确认 Python 的版本。

➜ ~ python3 --version  
Python 3.6.7

选择 MQTT 客户端库

paho-mqtt 是目前 Python 中使用较多的 MQTT 客户端库,它在 Python 2.7 或 3.x 上为客户端类提供了对 MQTT v3.1 和 v3.1.1 的支持。它还提供了一些帮助程序功能,使将消息发布到 MQTT 服务器变得非常简单。

Pip 安装 Paho MQTT 客户端

Pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

pip3 install -i https://pypi.doubanio.com/simple paho-mqtt

Python MQTT 使用

连接 MQTT 服务器

本文将使用 EMQ X 提供的 免费公共 MQTT 服务器 ,该服务基于 EMQ X 的 MQTT 物联网云平台 创建。服务器接入信息如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • Websocket Port: 8083

导入 Paho MQTT客户端

from paho.mqtt import client as mqtt_client

设置 MQTT Broker 连接参数

设置 MQTT Broker 连接地址,端口以及 topic,同时我们调用 Python random.randint 函数随机生成 MQTT 客户端 id。

broker = 'broker.emqx.io'
port = 1883
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'

编写 MQTT 连接函数

编写连接回调函数 on_connect ,该函数将在客户端连接后被调用,在该函数中可以依据 rc 来判断客户端是否连接成功。通常同时我们将创建一个 MQTT 客户端,该客户端将连接到 broker.emqx.io 。

def connect_mqtt():
 def on_connect(client, userdata, flags, rc):
 if rc == 0:
  print("Connected to MQTT Broker!")
 else:
  print("Failed to connect, return code %d\n", rc)
 # Set Connecting Client ID
 client = mqtt_client.Client(client_id)
 client.on_connect = on_connect
 client.connect(broker, port)
 return client

发布消息

首先定义一个 while 循环语句,在循环中我们将设置每秒调用 MQTT 客户端 publish 函数向 /python/mqtt 主题发送消息。

def publish(client):
 msg_count = 0
 while True:
  time.sleep(1)
  msg = f"messages: {msg_count}"
  result = client.publish(topic, msg)
  # result: [0, 1]
  status = result[0]
  if status == 0:
  print(f"Send `{msg}` to topic `{topic}`")
  else:
  print(f"Failed to send message to topic {topic}")
  msg_count += 1

订阅消息

编写消息回调函数 on_message ,该函数将在客户端从 MQTT Broker 收到消息后被调用,在该函数中我们将打印出订阅的 topic 名称以及接收到的消息内容。

def subscribe(client: mqtt_client):
 def on_message(client, userdata, msg):
 print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

client.subscribe(topic)
client.on_message = on_message

完整代码

消息发布代码

# python 3.6

import random
import time

from paho.mqtt import client as mqtt_client

broker = ‘broker.emqx.io’
port = 1883
topic = “/python/mqtt”

generate client ID with pub prefix randomly

client_id = f’python-mqtt-{random.randint(0, 1000)}’

def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print(“Connected to MQTT Broker!”)
else:
print(“Failed to connect, return code %d\n”, rc)

client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client

def publish(client):
msg_count = 0
while True:
time.sleep(1)
msg = f"messages: {msg_count}"
result = client.publish(topic, msg)

result: [0, 1]

status = result[0]
if status == 0:
print(f"Send {msg} to topic {topic}“)
else:
print(f"Failed to send message to topic {topic}”)
msg_count += 1

def run():
client = connect_mqtt()
client.loop_start()
publish(client)

if name == ‘main’:
run()

消息订阅代码

# python 3.6

import random
import time

from paho.mqtt import client as mqtt_client

broker = ‘broker.emqx.io’
port = 1883
topic = “/python/mqtt”

generate client ID with pub prefix randomly

client_id = f’python-mqtt-{random.randint(0, 1000)}’

def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print(“Connected to MQTT Broker!”)
else:
print(“Failed to connect, return code %d\n”, rc)

client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client

def publish(client):
msg_count = 0
while True:
time.sleep(1)
msg = f"messages: {msg_count}"
result = client.publish(topic, msg)

result: [0, 1]

status = result[0]
if status == 0:
print(f"Send {msg} to topic {topic}“)
else:
print(f"Failed to send message to topic {topic}”)
msg_count += 1

def run():
client = connect_mqtt()
client.loop_start()
publish(client)

if name == ‘main’:
run()
消息订阅代码

python3.6

import random

from paho.mqtt import client as mqtt_client

broker = ‘broker.emqx.io’
port = 1883
topic = “/python/mqtt”

generate client ID with pub prefix randomly

client_id = f’python-mqtt-{random.randint(0, 100)}’

def connect_mqtt() -> mqtt_client:
def on_connect(client, userdata, flags, rc):
if rc == 0:
print(“Connected to MQTT Broker!”)
else:
print(“Failed to connect, return code %d\n”, rc)

client = mqtt_client.Client(client_id)
client.on_connect = on_connect
client.connect(broker, port)
return client

def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received {msg.payload.decode()} from {msg.topic} topic")

client.subscribe(topic)
client.on_message = on_message

def run():
client = connect_mqtt()
subscribe(client)
client.loop_forever()

if name == ‘main’:
run()

测试

消息发布

运行 MQTT 消息发布代码,我们将看到客户端连接成功,并且成功将消息发布。

python3 pub.py

消息订阅

运行 MQTT 消息订阅代码,我们将看到客户端连接成功,并且成功接收到发布的消息。

python3 sub.py

总结

至此,我们完成了使用 paho-mqtt 客户端连接到 公共 MQTT 服务器 ,并实现了测试客户端与 MQTT 服务器的连接、消息发布和订阅。

与 C ++ 或 Java 之类的高级语言不同,Python 比较适合设备侧的业务逻辑实现,使用 Python 您可以减少代码上的逻辑复杂度,降低与设备的交互成本。我们相信在物联网领域 Python 将会有更广泛的应用。

接下来我们将会陆续发布更多关于物联网开发及 Python 的相关文章,敬请关注。

以上就是在 Python 中使用 MQTT的方法的详细内容,更多关于Python 中使用 MQTT的资料请关注菜鸟教程www.piaodoo.com其它相关文章!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中使用 MQTT的方法 的相关文章

  • Mac 软件汉化教程(一)

    本篇教程旨在提供入门级汉化教程 意思就是最简单的 软件汉化也不是什么很神秘和高大上的事情 任何人都可以做汉化 主要工作就是找到软件需要汉化的英文字符串 再将其翻译成中文 当然 Mac 软件的汉化难易程度大不相同 大致可以分成三种 1 简单好
  • 解决OBS在Linux下无法录屏

    Linux下OBS无法录屏问题解决 因为OBS依赖Pipewire服务 所以就需要安装额外的依赖 sudo apt install pipewire pipewire pulse wireplumber
  • Pikachu (xss跨站脚本攻击)

    目录 xss概念 一 反射型 xss get 二 反射型 post 三 存储型 四 DOM型 五 xss盲注 六 xss之过滤 七 xss之htmlspecialchars 1 htmlspecialchars作用 flags 八 xss之
  • 基于openswan klips的IPsec实现分析(五)应用层和内核通信(2)

    基于openswan klips的IPsec实现分析 五 应用层和内核通信 内核操作 转载请注明出处 http blog csdn net rosetta 在数据发送一节讲过 加载模块时会执行pfkey init 初始化与用户层通信的PF
  • C++ stack容器详解

    C stack容器 stack容器的基本概念 stack的常用接口 1 构造函数 2 赋值操作 3 数据存取 4 大小操作 测试 stack容器的基本概念 stack是一种先进先出的数据结构 被称为栈 它只有一端可以出入 栈中进入数据称为
  • IO读写实例

    基本类型的读写 import java io public class TestDataStream public static void main String args throws IOException OutputStream o
  • SSE2的一些常用指令集介绍

    开门见山 前段时间学习OpenCV的FAST算法 中间有很多SSE2的指令集 深受其惑 下面我把学习过程中学到的一些指令集介绍给大家 希望能对大家有所帮助 m128i被称为128bits的整数 对其进行赋值时 可以调用 m128i mm s
  • MMKV原理详解

    性能对比 我们将 MMKV 和 SharedPreferences SQLite 进行对比 重复读写操作 1k 次 相关测试代码在Android MMKV mmkvdemo 结果如下图表 单进程性能 可见 MMKV 在写入性能上远远超越 S
  • 三、nginx两种压缩配置[gzip]

    一 nginx压缩 解释 通过配置参数 让nginx压缩指定后缀格式文件 然后发送给用户 但是这样这些压缩文件无法使用sendfile的高效传送 使用其能使得文件传输不经过程序 加载到缓存直接发送 相反off的话 需要在硬盘 缓存 程序 发
  • [Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇文章详细讲解了如何评价神经网络 绘制训练过程中的loss曲线 并结合图像分类案例讲解精确率 召回率和F值的计算过程 本篇文章将分享循环神经网络LSTM R
  • java文件的上传和下载_java文件上传和下载

    在web项目中上传文件夹现在已经成为了一个主流的需求 在OA 或者企业ERP系统中都有类似的需求 上传文件夹并且保留层级结构能够对用户行成很好的引导 用户使用起来也更方便 能够提供更高级的应用支撑 文件夹数据表结构 CREATETABLEI
  • 注解-宋红康

    目录 一 注解 Annotation 概述 二 常见的注解实例 三 如何自定义注解 四 JDK中的四个元注解 五 Java8注解的新特性 1 可重复注解 2 类型注解 一 注解 Annotation 概述 二 常见的注解实例 三 如何自定义
  • Android开发入门组件(十)——WebView

    今天主要写一下WebView 主要是在安卓应用的页面来加载或者写入网页 是比较常见的一种操作 加载网页 1 加载url 网络或者本地assets文件下的html文件 1 加载网络url webview loadUrl 相应的网址 直接在ac
  • 从外包辞职了,600小时后,我入职了字节跳动

    前言 没有绝对的天才 只有持续不断的付出 对于我们每一个平凡人来说 改变命运只能依靠努力 幸运 但如果你不够幸运 那就只能拉高努力的占比 2022年7月 我有幸成为了字节跳动的一名Java后端开发 相信同行都清楚 从外包进大厂有多难 运气之
  • c# --- 泛型解决输入和输出类型不确定问题

    一 背景 有这样一个需求 一个方法 他的返回值类型不确定 方法参数的类型不做要求 二 思考 返回值类型不确定 从继承的角度 所以类都是object的子类 返回object即可 但是这种方法是类型不安全的 需要进行类型转换 我们可以使用泛型解
  • HTML <small> 标签

    定义和用法
  • CUBLAS矩阵乘法

    include
  • Winsock属性 方法介绍

    本文章已收录于 Winsock是Mcrosoft windows提供的网络编程接口 它供了基于TCP IP协议接口实现方法 通过网络进行的数据通信 需要用地址来表示网络中的主机 TCP IP协议使用IP地址来作为主机的标识 实现的连接方式是
  • 关于connect: network is unreachable 问题的解决

    由于发现原创文章 在未署名作者及出处的情况下被转载 在以后所有的原创文章开头我都会写明作者和出处 希望朋友们以后在转载本博客原创博文时注意标明文章作者及出处 作者 liukun321 咕唧咕唧 原文出处 http blog csdn net
  • 牛客面试题库(9)

    请你说说索引怎么实现的B 树 为什么选这个数据结构 说到B 树 一般和B树做对比 都是多叉树 B 数组叶子结点存储数据 其他节点存储索引 而B树每个节点都存储数据 B 树叶子结点内通过单向链表连接 节点和节点之间通过双向链表连接 从磁盘IO

随机推荐

  • 匿名内部类的定义格式

    匿名内部类 1 使用条件 如果接口的实现类 或者父类的子类只需要使用唯一的一次 那么就可以省略该类的定义 改用匿名内部类 2 定义格式 接口名称 对象名 new 接口名称 覆盖重写所有抽象方法 分号不要忘 3 对匿名内部类的格式 new 接
  • springboot + mybatis启动时执行sql脚本

    目录 1 创建数据版本表 结构如下 2 创建HdVersion对象 3 创建执行sql的dao 4 创建dao对应的xml 5 创建sql执行器 实现ApplicationRunner 6 结语 背景 项目开发或发布阶段修改表结构 项目更新
  • 大数据平台测试-白盒测试静态方法解析(我奶奶都能看懂)

    软件测试从某种维度上分为黑盒测试和白盒测试 黑盒测试更多的是增啥改查 也就是功能测试 关于功能测试参考这里 增删改查测试场景 菜市场的大妈都能看懂 关于白盒测试的资料参考这里 白盒测试案例设计 我爷爷都能看懂 注意并不是说白盒测试一定就是要
  • 还不会python 实现常用的数据编码和对称加密?看这篇文章就够啦~

    前 言 相信很多使用 python 的小伙伴在工作中都遇到过 对数据进行相关编码或加密的需求 今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式 如何使用 python 去实现 话不多说 接下来直接进入主题 1 base64
  • Unity—关节、布料、角色控制器、视频播放

    开学啦 接下来学习Unity的寻路系统和射线 结尾有彩蛋呦 每日一句 少年特有的放浪不羁是青春的定义 目录 关节 布料 视频播放 Character Controller组件 关节 铰链关节 Hinge Joint 将两个刚体 Rigidb
  • jenkins fastlane淌坑记录

    目录 前言 管理证书 使用证书 构建命令 关于app托管 iOS的版本自增 testflight上传 fastlane下苹果的账号验证问题 iOS缓存问题 iOS打包会开启8081服务 fastlane获取最新代码 Fastlane完整代码
  • CSRF漏洞详解

    目录 一 CSRF漏洞原理 1 基本原理 2 流程图 3 条件 二 分类 1 GET型 2 POST型 三 危害 四 检测与防御 1 检测 2 防御 一 CSRF漏洞原理 1 基本原理 CSRF Cross site Request For
  • linux用c++获取mac地址,网卡地址,网口地址,网卡序号ip地址,不使用 ioctl(sock, SIOCGIFCONF, &ifc)获取网络接口名称,这个接口有时会返回-1获取不到,换方法获取

    linux用c 获取mac地址 不使用 ioctl sock SIOCGIFCONF ifc 获取网络接口名称 这个接口有时会返回 1获取不到 换方法获取 1 弃用 SIOCGIFCONF 获取网络接口名称列表 获取所有网络接口列表 ifc
  • # Python推荐系统学习笔记(3)------基于协同过滤的个性化推荐算法实战---隐语义模型

    Python推荐系统学习笔记 3 基于协同过滤的个性化推荐算法实战 隐语义模型 一 概念性理解 传统的推荐方法 UserCF 首先需要找到和他们看了同样书的其他用户 然后给他们推荐那些用户喜欢的其他书 ItemCF 需要给他们推荐和他们已经
  • SpringCloud-Hystrix服务降级与熔断简介与简单配置

    1 前言 作者最近在学习springcloud 本篇文章仅作为学习笔记 如有错误 敬请指正 2 Hystrix是什么 Hystrix是一个用于处理分布式系统的延迟和容错的开源库 在分布式系统里 许多依赖不可避免的会调用失败 比如 超时 异常
  • 8.常用统计分析方法——生存分析

    目录 生存分析基本概念 生存率估计 1 乘积极限法 2 寿命表法 3 生存曲线 生存曲线比较 COX比例风险回归模型 1 建立COX回归模型 2 比例风险假定的检验 3 生存预测 生存分析基本概念 logistic回归中因变量是终点事件发生
  • cocos creator碰撞和碰撞回调不生效

    1 碰撞不生效 一定要记得 在使用物理的时候 一定要先开启物理 cc director getPhysicsManager enabled true 只有在onLoad 中 开启 才有效 在onEnable 或者start 都无效 2 碰撞
  • Rational Rose 7.0安装教程

    关注公众号 免费获取资料 简介 Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具 用于可视化建模和公司级水平软件应用的组件构造 就像一个戏剧导演设计一个剧本一样 一个软件设计师使用Ration
  • 性能测试之性能监控和性能优化

    目录 一 概述 二 jconsole和jvisualvm 三 jconsole 四 visualvm 1 输入命令提示 jvisualvm不是内部或外部命令 也不是可运行的程序或批处理文件 2 打开jvisualvm里面不包含GC监控 五
  • 基于低代码平台实现的免费CRM系统

    编者按 企业生存的根本是客户资源 因此客户关系的管理对于企业来说至关重要 目前我国中小企业对于客户的管理方法不够重视 以致于客户外流 客户转化率不高 而CRM客户关系管理系统有助于企业培养和增强客户关系 下面就让我们一起来了解一下企业该如何
  • 使用Java编写的简单行为树

    引言 试着用java把以前用c 写的行为树复现了出来 代码 import java util Random 假设有一士兵 初始生命为100 弹药为200发 每个弹匣40发 会逃跑 会巡逻 会攻击 会换弹 会补给 会发现敌人 class So
  • MyBatis基础语法

    1 namespace用于指定dao Mapper 层文件的路径 2 property传入的值与po SysUser的属性对应 3 column传入的值与数据库的字段对应 4 javaType传入的值 路径 是java这边的数据类型 5 j
  • C语言写九九乘法表(五种方法)

    当我们学习编程语言时 通常需要掌握一些基本的语法和功能 在C语言中 输出九九乘法表是一个很好的练习 因为它既简单又有趣 本文将介绍如何用C语言编写代码来输出九九乘法表 在开始之前 请确保您已经安装了C语言的开发环境 比如VS2019 首先
  • el-input 怎么添加鼠标悬浮内容展示

    您可以通过使用el tooltip组件的content属性将提示框附加到el input中 然后 您可以添加一个文本框和图标 当鼠标悬停在这些元素上时 提示框就会显示 以下是示例代码
  • 在 Python 中使用 MQTT的方法

    更多编程教程请到 菜鸟教程 https www piaodoo com 友情链接 高州阳光论坛https www hnthzk com Python 是一种广泛使用的解释型 高级编程 通用型编程语言 Python 的设计哲学强调代码的可读性