前言
上篇文章我们介绍了 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()
测试
总结
至此,我们的小型物联网系统的基石就算搭好了,接下来的网站服务端,设备侧客户端都将以此为基础,进一步拓展。下一篇文章我们将介绍物联网系统的规划设计,制定好整个大框架,方便后续开发实践。
版权声明
本文系作者原创文章,未经允许不得转载,否则保留追究法律责任的权利。https://www.scott-sloan.cn/archives/217/