在Python中使⽤MQTT的⽅法
⽬录
项⽬初始化
选择 MQTT 客户端库
Pip 安装 Paho MQTT 客户端
Python MQTT 使⽤
连接 MQTT 服务器
导⼊ Paho MQTT客户端
设置 MQTT Broker 连接参数
编写 MQTT 连接函数
发布消息
订阅消息
完整代码
消息发布代码
消息订阅代码
测试
消息发布
消息订阅
总结
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 pypi.doubanio/simple paho-mqtt
Python MQTT 使⽤
连接 MQTT 服务器
本⽂将使⽤ EMQ X 提供的免费公共 MQTT 服务器,该服务基于 EMQ X 的 MQTT 物联⽹云平台创建。服务器接⼊信息如下:
Broker: qx.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 = 'qx.io'
port = 1883
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'
编写 MQTT 连接函数
编写连接回调函数 on_connect ,该函数将在客户端连接后被调⽤,在该函数中可以依据 rc 来判断客户端是否连接成功。通常同时我们将创建⼀个 MQTT 客户端,该客户端将连接到 qx.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)
<_connect = on_connect
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 `{pic}` topic")
client.subscribe(topic)
<_message = on_message
完整代码
消息发布代码
# python 3.6
import random
import time
from paho.mqtt import client as mqtt_client
broker = 'qx.io'
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)
<_connect = on_connect
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}`")
while语句怎么用在python中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 = 'qx.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)
<_connect = on_connect
return client
def publish(client):
msg_count = 0
while True:
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 = 'qx.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)
<_connect = on_connect
return client
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{pic}` topic")
client.subscribe(topic)
<_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的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论