在 Python 中使用 MQTT 的方法

拾柒
拾柒
发布时间:2026-10-14 | 4人浏览过
原创

本文详细介绍如何在 Python 项目中利用 paho-mqtt 库连接 MQTT 服务器。通过配置 broker.emqx.io 公共服务器,演示了客户端 ID 生成、连接回调、消息发布及订阅的完整流程,并提供基于 Python 3.6 的发布与订阅代码示例及测试结果。

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 的连接地址、端口号以及订阅主题,同时利用 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 接收到消息时触发。在该函数中,我们将打印出所订阅的主题名称以及接收到的具体消息内容。


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 服务器的全过程,并成功测试了客户端与服务器之间的连接建立、消息发布及订阅功能。

与 C++ 或 Java 等高级语言相比,Python 更适合用于设备侧的业务逻辑实现。使用 Python 可以有效降低代码的逻辑复杂度,从而减少与硬件设备的交互成本。预计在未来物联网领域,Python 将获得更广泛的应用。

后续我们将陆续发布更多关于物联网开发及 Python 技术的相关文章,敬请持续关注。

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

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表