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()

消息订阅代码

# 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

pub.png

消息订阅

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

python3 sub.py

sub.png

总结

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

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

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

python mqtt库_如何在 Python 中使用 MQTT相关推荐

  1. python链表库_[转]为什么python标准库没有实现链表

    实际上刚开始学习一些高级语言的时候我也有同样的疑问,而且即使有链表对应物的语言,链表常常也很少被实际使用. 如果是在国外听数据结构的课,老师一般会警告你这只是一个理论概念,实际应用应该实际考察,在通常 ...

  2. python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型

    python 线性回归模型 Linear regression and logistic regression are two of the most popular machine learning ...

  3. unbantu上python安装步骤_如何在Ubuntu中安装Python 3.6?

    Python是增长最快的主要通用编程语言.原因有很多,比如它的可读性和灵活性,易于学习和使用,可靠和高效. 有两个主要的Python版本被使用- 2和3 (Python的现在和未来);前者将看不到新的 ...

  4. python进程暂停_如何在Python中暂停多进程?

    我希望用户能够在怎么开始的实现它?在 我的代码是:# -*- coding: utf-8 -*- from PySide import QtCore, QtGui from Ui_MainWindow ...

  5. python 拟合正态分布_如何在Python中拟合双高斯分布?

    我试图使用Python获得数据(link)的双高斯分布.原始数据的格式为: 对于给定的数据,我想获得图中所示峰值的两个高斯分布.我用以下代码(source)进行了尝试:from sklearn imp ...

  6. python 概率分布函数_如何在Python中实现这五类强大的概率分布

    匿名用户 1级 2016-04-25 回答 首页 所有文章 观点与动态 基础知识 系列教程 实践项目 工具与框架应用 工具资源 伯乐在线 > Python - 伯乐在线 > 所有文章 &g ...

  7. python pulp 整数规划_如何在PuLP中使用整数规划指定多变量约束?

    我试图用Python-PuLP中的整数规划公式来解决装箱问题.问题模型如下: 我使用PuLP库编写了以下Python代码from pulp import * #knapsack problem def ...

  8. python 获取当前目录_如何在Python中获取当前的工作目录?

    python 获取当前目录 To get the current working directory in Python, there is a library function getcwd() i ...

  9. eclipse配置python开发环境_如何在Eclipse中配置python开发环境

    展开全部 步骤1: 下载用于在2113Eclipse中开发Python的插件PyDev. 步骤2: 解压5261python.将解压后的features和plugins文件4102夹中的1653内容拷 ...

最新文章

  1. Linux内核网络数据包发送(三)——IP协议层分析
  2. C++中什么时候用new[]申请,可以用delete释放
  3. sklearn.decomposition.FastICA实现FastICA算法
  4. strlensizeof
  5. WP百度搜索推送管理插件
  6. 去除Windows-XP系统下的关机功能
  7. php mysql memcache_php的memcache和memcached扩展区别
  8. 关于CVE-2017-8890的一点细节
  9. AI圣经!《深度学习》中文版隆重上市!美国亚马逊AI领域排名第一畅销书!
  10. 用FSL进行VBM统计分析
  11. WPF 启动屏幕键盘
  12. 氚云SaaS介绍文档
  13. 只知道努力工作的人,失去了赚钱的机会,过去是适者生存,现在是强者生存,沉思你将来会怎样?
  14. Keystore was tampered with, or password was incorrect
  15. chrome浏览器安全检查_为您的Chrome浏览器检查皮肤
  16. 将时间转换成16进制Unix时间戳
  17. 拥抱520,感性去爱,理性成长
  18. spring整合hibernate步骤及配置文件
  19. Bash Shell中16进制数字和ASCII字符相互转换
  20. 【不忘初心,砥砺前行】2021年中创算力新春年会暨周年庆典

热门文章

  1. arduino灯带随音乐_Arduino—超简单音乐制作
  2. 交换机获取MAC地址
  3. 计算机网络基础知识 - 应用层
  4. 判断两个整数是否互质
  5. linux模拟手机号码,虚拟手机号码接收短信
  6. Javascript函数小案例--《找质数》
  7. leetcode-Database-577|员工奖金
  8. 有一个棋盘,有64个方格,在第一个方格里面放1粒芝麻重量是0.00001kg,第二个里面放2粒,第三个里面放4,棋盘上放的所有芝麻的重量
  9. 数据结构 浙江大学 2019春期末考试
  10. 安卓逆向——dy急速版设备抓包分析