在 Python 中使用 MQTT的方法

 更新时间:2020年08月18日 14:37:44   作者:EMQX  
这篇文章主要介绍了在 Python 中使用 MQTT的方法,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

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的资料请关注脚本之家其它相关文章!

相关文章

  • python中关于property的最详细使用方法

    python中关于property的最详细使用方法

    这篇文章主要介绍了python中关于property的最详细使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Python-openCV读RGB通道图实例

    Python-openCV读RGB通道图实例

    今天小编就为大家分享一篇Python-openCV读RGB通道图实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 安装不同版本的tensorflow与models方法实现

    安装不同版本的tensorflow与models方法实现

    这篇文章主要介绍了安装不同版本的tensorflow与models方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • python使用pil库实现图片合成实例代码

    python使用pil库实现图片合成实例代码

    这篇文章主要介绍了python PIL实现图片合成实例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python学习小技巧之列表项的拼接

    Python学习小技巧之列表项的拼接

    这篇文章主要给大家介绍了Python学习小技巧之列表项的拼接的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • PyTorch中grid_sample的使用及说明

    PyTorch中grid_sample的使用及说明

    这篇文章主要介绍了PyTorch中grid_sample的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python 删除大文件中的某一行(最有效率的方法)

    python 删除大文件中的某一行(最有效率的方法)

    下面小编就为大家带来一篇python 删除大文件中的某一行(最有效率的方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 详解python发送各类邮件的主要方法

    详解python发送各类邮件的主要方法

    python中email模块使得处理邮件变得比较简单,这篇文章主要介绍了详解python发送各类邮件的主要方法,有兴趣的可以了解一下。
    2016-12-12
  • Python 脚本的三种执行方式小结

    Python 脚本的三种执行方式小结

    今天小编就为大家分享一篇Python 脚本的三种执行方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python协程的实现方式小结

    Python协程的实现方式小结

    协程是Python中强大的并发编程工具,允许开发者编写异步代码以提高程序的性能和效率,在本文中,我们将深入探讨Python中协程的实现方式,包括生成器、asyncio库和async/await关键字,我们还会提供详细的示例代码,帮助您理解和应用协程,需要的朋友可以参考下
    2023-11-11

最新评论