简单搭建属于自己的物联网系统(二):基于 Python 实现基本的 MQTT 通讯

物联网 · 2023-11-07 · 309 人浏览

前言

上篇文章我们介绍了 mosquitto 服务的部署,整个过程比较简单,且 mosquitto 服务内存占用低(不到5MB),非常适合在服务器内存资源比较紧张的情况下搭建。这篇文章将继续介绍基于 Python 实现基本的 MQTT 通讯,作为我们物联网搭建的根基。

安装 paho-mqtt 库

paho-mqtt 是目前 Python 中使用较多的 MQTT 客户端库,它在 Python 2.7 或 3.x 上为客户端类提供了对 MQTT v3.1 和 v3.1.1 的支持(现在还支持 MQTT v5.0)。它还提供了一些帮助程序功能,使将消息发布到 MQTT 服务器变得非常简单。

使用 pip 安装 paho-mqtt 库。

pip install paho-mqtt

paho-mqtt 库的使用

导入 Paho MQTT 客户端

import paho.mqtt.client as mqtt

设置 MQTT 服务器连接参数

设置 MQTT Broker 的地址、端口以及 topic,同时生成随机的 client_id。
这里用的我服务器上部署的 mosquitto,请根据实际情况修改 broker 地址。

import time
import uuid

broker = "116.63.172.112"
port = 1883
topic = "test"
client_id = str(uuid.uuid4())

连接 MQTT 服务器

def connect_mqtt():
    client = mqtt.Client(client_id, transport = "tcp")
    client.connect(broker, port, 60)
    
    return client

发布消息

定义 while 循环语句,在循环体中循环等待用户输入消息后发出。

def send_message(client):
    while True:
        msg = input("输入消息:")
        
        client.publish(topic, msg)

        time.sleep(0.1)

注意此处的 time.sleep(0.1) 的延时效果十分重要,如果发出消息后直接退出,服务端将无法收到消息。

订阅消息

def subscribe(client):
    def on_message(client, userdata, msg):
        print(msg.decode("utf-8"))

    client.subscribe(topic)
    client.on_message = on_message

循环函数

以非阻塞的方式创建后台线程,这意味着你可以创建多个连接而不阻塞程序。

client.loop_start()

若要停止,则使用

client.stop()

还有一种 loop_forever() 的方法,与 loop_start() 不同,它是阻塞式的,如果期望程序无限期地执行下去,请使用此方法。

完整代码

客户端,消息发布代码

import uuid
import time
import paho.mqtt.client as mqtt

broker = "116.63.172.112"
port = 1883
topic = "test"
client_id = str(uuid.uuid4())

def connect_mqtt():
    client = mqtt.Client(client_id, transport = "tcp")
    client.connect(broker, port, 60)
    
    return client

def send_message(client):
    while True:
        msg = input("输入消息:")
        
        client.publish(topic, msg)

        time.sleep(0.1)

def run():
    client = connect_mqtt()
    client.loop_start()
    send_message(client)

if __name__ == "__main__":
    run()

服务端,消息订阅代码

import uuid
import paho.mqtt.client as mqtt

broker = "116.63.172.112"
port = 1883
topic = "test"
client_id = str(uuid.uuid4())

def connect_mqtt():
    client = mqtt.Client(client_id, transport = "tcp")
    client.connect(broker, port, 60)
    
    return client

def subscribe(client):
    def on_message(client, userdata, msg):
        print("收到消息", msg.payload.decode("utf-8"))

    client.subscribe(topic)
    client.on_message = on_message

def run():
    client = connect_mqtt()
    subscribe(client)

    client.loop_forever()

if __name__ == "__main__":
    run()

测试

运行客户端,输入消息后发送。
pi1QxIK.png

运行服务端,成功收到消息。
pi1lpGD.png

总结

至此,我们的小型物联网系统的基石就算搭好了,接下来的网站服务端,设备侧客户端都将以此为基础,进一步拓展。下一篇文章我们将介绍物联网系统的规划设计,制定好整个大框架,方便后续开发实践。

版权声明

本文系作者原创文章,未经允许不得转载,否则保留追究法律责任的权利。https://www.scott-sloan.cn/archives/217/

物联网
Theme Jasmine by Kent Liao