MQTT 是一种信息交换系统,由信息交换软件和客户端构成,采用了发布/定阅的通信方法,在物联网和远程遥控遥测中应用广泛。
本博文介绍如何使用Python 编写MQTT 客户端软件,以及在工业领域的应用。
有许多MQTT Broker 的实现。这里采用Eclips mosquitto。它是一个轻量级开源的MQTT Broker。
下载:
https://mosquitto.org/download/
这里选择windows
mosquitto-2.0.15-install-windows-x64.exe (64-bit build, Windows Vista and up, built with Visual Studio Community 2019)
下载完成后 运行解压到某一个目录中
运行
在该目录直接 输入 mosquitto 运行
测试
在安装目录中自带两个应用程序
mosquitto_sub
mosquitto_pub
打开一个windows Power Shell,运行mosquitto_sub
输入
PS E:\yao2023\mosquitto> ./mosquitto_sub -t 'test/topic'
打开另一个Windows Power Shell 运行另一个 mosquitto_pub
PS E:\yao2023\mosquitto> ./mosquitto_pub -t 'test/topic' -m hello
这是在运行mosquitto_sub 的窗口输出一个hello
Python MQTT 客户端
安装paho-mqtt 模块。
pip install paho-mqtt
发布
import paho.mqtt.client as mqtt
import time
HOST = "localhost"
PORT = 1883
if __name__ == '__main__':
client = mqtt.Client()
client.loop_start()
client.connect(HOST, PORT, 60)
while True:
client.publish("test/topic","hello liefyuan",2)
time.sleep(2)
订阅/发布
这是一个echo 程序
import paho.mqtt.client as mqtt
import time
HOST = "localhost"
PORT = 1883
def on_message(client,userdata,msg):
#print("Message")
print(msg.topic+" "+msg.payload.decode())
if __name__ == '__main__':
client = mqtt.Client()
client.connect(HOST, PORT, 60)
client.subscribe("test/topic",0)
client.on_message=on_message
client.loop_start()
while True:
client.publish("test/topic","hello topic",2)
time.sleep(2)
注意:client.loop_start()一定要放置所有设置完成,While True 之前。
MQTT 最大的优点是简单。相比工业领域的协议而言,它的缺点是仅仅是一种通信协议,没有语义模型。所有,同样采用MQTT 协议,两个设备并不一定互联互通。因此要进一步对Topic和payload 指定规范。
这里我们以IEC61499 功能块的连接为例,讨论MQTT 协议的应用
以路径Path 作为topic,例如:
Device_Name/FB_Name/InputEvents/inputEvent_Name
Device_Name/FB_Name/OutputEvents/OutputEvent_Name
可以设置为JSON格式,例如
{Method:“Read”,Value=12.5}
功能块的输入事件采取订阅方式
Client.subscribe("inputEvents/#")
所有的OutputEvents采取publish 方式。
上述方式同样适用于单功能块应用。
在OPCUA 规范中,提出了pub/sub 的方式。它实现了两个Server 之间通过pub/sub协议实现信息交换。
2018年初,OPC UA标准的第14部分(又名“发布-订阅”或“PubSub”)发布,有助于鼓励OPC UA与MQTT等通信协议之间的进一步交互。根据OPC基金会的说法,“PubSub通过利用MQTT(消息队列遥测传输)和AMQP(高级消息队列协议)等流行的数据传输,可以直接通过互联网使用OPC UA,同时保留其关键的OPC UA端到端安全性和标准化数据建模优势”。
但是令人遗憾的是,python-opcua 并不支持sub/pub 机制,open62541 是支持基于MQTT sub/pub 机制的。在具体的应用中,我们也可以自己编写MQTT sub/pub 交换OPCUA 信息模型的数据。