在 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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
django允许外部访问的实例讲解
May 14 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
python 解决微分方程的操作(数值解法)
May 26 Python
python可视化大屏库big_screen示例详解
Nov 23 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
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
php下检测字符串是否是utf8编码的代码
2008/06/28 PHP
php ci框架验证码实例分析
2013/06/26 PHP
php上传图片到指定位置路径保存到数据库的具体实现
2013/12/30 PHP
php中 $$str 中 "$$" 的详解
2015/07/06 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
Python判断直线和矩形是否相交的方法
2015/07/14 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
python实现爬山算法的思路详解
2019/04/09 Python
Python实现最常见加密方式详解
2019/07/13 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
局火灾防控工作方案
2014/05/25 职场文书
疾病防治方案
2014/05/31 职场文书
文明好少年事迹材料
2014/08/19 职场文书
庆六一活动总结
2014/08/29 职场文书
党的群众路线剖析材料
2014/10/09 职场文书
结婚纪念日感言
2015/08/01 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书