乐趣区

关于物联网:如何在-Python-中使用-MQTT

Python 是一种宽泛应用的解释型、高级编程、通用型编程语言。Python 的设计哲学强调代码的可读性和简洁的语法(尤其是应用空格缩进划分代码块,而非应用大括号或者关键词)。Python 让开发者可能用更少的代码表白想法,不论是小型还是大型程序,该语言都试图让程序的构造清晰明了。1

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

音讯订阅

运行 MQTT 音讯订阅代码,咱们将看到客户端连贯胜利,并且胜利接管到公布的音讯。

python3 sub.py

总结

至此,咱们实现了应用 paho-mqtt 客户端连贯到 公共 MQTT 服务器,并实现了测试客户端与 MQTT 服务器的连贯、音讯公布和订阅。

与 C ++ 或 Java 之类的高级语言不同,Python 比拟适宜设施侧的业务逻辑实现,应用 Python 您能够缩小代码上的逻辑复杂度,升高与设施的交互老本。咱们置信在物联网畛域 Python 将会有更宽泛的利用。

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

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.io/cn/blog/h…


  1. https://zh.wikipedia.org/wiki… ↩
退出移动版