摘要:本文介绍如何用python编写一个mqtt客户端向EMQX服务器发送数据,实现一个简易的本地物联网服务器。
上一篇文章讲到使用mqtt.fx软件来发布消息。
但是它有一个缺点,就是暂时没有定时发送的功能,只能手动发送。在输入框中写入一个什么信息,就发送一个信息。如果想发送一些自动生成的信息,就有点困难了。
操作的步骤参考CSDN博主qilei2010的文章
核心内容就是使用python编写一个paho客户端。这是一种通用的客户端,还可以用在安卓系统编程,让手机成为一个MQTT客户端。
编程之前,需要首先下载库。使用Windows下的客户端,或者使用vscode客户端输入下面这个指令,就可以完成安装。
pip3 install -i https://pypi.doubanio.com/simple paho-mqtt
下图是vscode软件安装paho的界面,安装速度很快。
安装完paho之后,就可以编写python程序了,本文使用的软件是vscode,默认大家都已经配置完成python所需的扩展。
源代码如下:
-
- import random
- import time
-
- from paho.mqtt import client as mqtt_client
-
-
- broker = '192.168.1.3'
- port = 1883
- topic = "testtopic/1"
- # 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):
- while True:
- time.sleep(1)
- # 发送1-50之间的随机数
- msg = random.randint(1,50)
- 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}")
-
-
- def run():
- client = connect_mqtt()
- client.loop_start()
- publish(client)
-
-
- if __name__ == '__main__':
- run()
使用vscode右键“在交互式窗口中运行当地文件”。
观察运行效果,首先提示已经连接到MQTT服务器了。如果连接不成功,那么就提示"Failed to connect, return code"。接着就提示发送的数据是什么,发送到哪个主题。下图显示的是发送1-50之间的随机数。
现在回到EMQX管理端,通过websocket客户端观察到发送过来的数据。至此实验成功。
从此实验可以看出,MQTT的客户端有很多种,从常见的MQTT.FX,到python客户端,从无代码,到寥寥数十句,都能实现。
核心的原理都是通过客户端订阅和发布消息。如果一个消息被多个客户端订阅,那么无论哪个客户端将该主题做出更改,所有订阅到该主题的客户端将全部接到这个指令。如下图所示,当MQTT.FX也订阅了该主题之后,如果python客户端向服务器发送指令,那么mqtt.fx客户端也同时显示这些数据。这就是MQTT通信的乐趣和优势。