在 Python 中使用 MQTT的方法


Posted in Python onAugust 18, 2020

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

在 Python 中使用 MQTT的方法

消息订阅

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

python3 sub.py

在 Python 中使用 MQTT的方法

总结

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

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

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

以上就是在 Python 中使用 MQTT的方法的详细内容,更多关于Python 中使用 MQTT的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中返回字典键的值的values()方法使用
May 22 Python
python开发之thread线程基础实例入门
Nov 11 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
python3转换code128条形码的方法
Apr 17 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Django 框架模型操作入门教程
Nov 05 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
pytorch 6 batch_train 批训练操作
May 28 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 #Python
Python 处理日期时间的Arrow库使用
Aug 18 #Python
python七种方法判断字符串是否包含子串
Aug 18 #Python
Python使用socket模块实现简单tcp通信
Aug 18 #Python
python 浮点数四舍五入需要注意的地方
Aug 18 #Python
Python filter过滤器原理及实例应用
Aug 18 #Python
Python lambda表达式原理及用法解析
Aug 18 #Python
You might like
php获得文件扩展名三法
2006/11/25 PHP
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
浅谈php://filter的妙用
2019/03/05 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
Python通过命令开启http.server服务器的方法
2017/11/04 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
2020/04/20 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
单身旅行者的单身假期:Just You
2018/04/08 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
美食节策划方案
2014/05/26 职场文书
食堂标语大全
2014/06/11 职场文书
小学生清明节演讲稿
2014/09/05 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js