paho-mqtt介绍及安装
我们主要从pypi.org网站上进行学习,网址为https://pypi.org/project/paho-mqtt/。先把paho-mqtt安装起来。
pip3 install paho-mqtt -i https://pypi.douban.com/simple/
可以看到我们安装的是1.6.1版本。
paho-mqtt-1.6.1是Eclipse Paho MQTT Python client library,MQTT Python 客户端软件库,实现了MQTT protocol协议版本包括5.0, 3.1.1, 和 3.1。支持Python 2.7.9+ or 3.6+。提供了客服端的类,让客户端应用连接到MQTT broker,我们有时叫MQTT代理,有时叫服务器,用来发布消息,订阅主题和接收消息。Paho是 Eclipse Foundation 的一个开源项目。
对于python软件包的安装除了采用pip软件包管理器安装之外,也可以下载源代码进行安装,这里罗列一下:
首先下载,可以从github上下载,也可以从pypi网站上找到源代码,下载。例如:
git clone https://github.com/eclipse/paho.mqtt.python cd paho.mqtt.python python setup.py install
使用及API
我们看一下官网的例子,我们适当做些修改,修改了主题和MQTT服务器主机:
import paho.mqtt.client as mqtt # The callback for when the client receives a CONNACK response from the server. def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # Subscribing in on_connect() means that if we lose the connection and # reconnect then subscriptions will be renewed. client.subscribe(topic="sensor1") # The callback for when a PUBLISH message is received from the server. def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("localhost", 1883, 60) # Blocking call that processes network traffic, dispatches callbacks and # handles reconnecting. # Other loop*() functions are available that give a threaded interface and a # manual interface. client.loop_forever()
在这段程序里,on_connect是一个回调函数,当client连接到MQTT服务器到时候执行on_connect回调函数,这个函数调用了订阅函数,订阅主题为"sensor1"的消息。on_message也是一个回调函数,当发布的消息被接收到的时候执行该函数。我们先运行体验一下。
运行程序:
我们开了两个terminal,一个运行程序,一个采用mqtt命令发布消息,如上图所示。
Client
Client是实现MQTT 协议版本 3.1/3.1.1/5.0 的客户端类,是一个主要的与MQTT服务器(broker)的类。总体的用法如下:
使用 connect()/connect_async() 函数连接MQTT服务器(broker);
调用loop()函数来保持与MQTT服务器(broker)的网络通信;或者使用loop_start() 来设置一个loop()开始的运行线程;或者使用loop_forever() 处理loop()作为一个固定的函数;
用subscribe()来订阅主题并接收信息;
用publish()来发布消息给中间人;
用disconnect()来断开与MQTT服务器(broker)的连接;
初始化实例:
import paho.mqtt.client as mqtt
mqttc = mqtt.Client()
CLIENT()
Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport="tcp")
参数说明:
client_id : 唯一的client id 字符串,当连接MQTT服务器(broker)时使用。如果client_id 长度为0,则会自动随机产生一个client_id。这种情况下 clean_session 参数必须为 True。
clean_session : 决定client 类型的bool 类型参数。如果为True,当client 失去连接时中间人将删除所有关于这个client 的信息。如果为 False,则说明这是一个持久的client,当失去连接时发布信息和队列中的消息将会被保持。注意,当失去连接时client 永远不会抛弃自己需要发出的信息,当调用connect()/reconnect() 后将会重新发送这些信息。 调用 reinitialise() 重置client到它初始化时的状态。
userdata:用户定义的任何类型的数据将被传输为userdata 参数到回调函数。后面可以使用user_data_set()函数来更新这个参数。
protocol:client使用的mqtt 版本。可以是 MQTTv31 或 MQTTv311。
transport:设置通信机制,"websockets" 或者"tcp",一个是WebSockets传输,一个是原始的TCP包。
reinitialise()
reinitialise(client_id="", clean_session=True, userdata=None)
如果client 已经被创建了,reinitialise() 函数重置 client 到它起始的状态. 它与Client()构造函数有相同的参数。
Connect / reconnect / disconnect
CONNECT()
connect(host, port=1883, keepalive=60, bind_address="")
connect()`函数使得client 连接到服务器broker。这是一个阻塞的函数,它有以下参数:
host:远程中间人的主机名或IP
port:服务端的端口。 默认是 1883。
keepalive:与中间人交流允许的最大时间段。如果没有信息交流,这控制client发送ping 消息到中间人的频率。
bind_address:本地网络IP
Callback
当client 从broker接收到CONNACK信息,将触发on_connect()回调函数。
Publishing/Subscribe / Unsubscribe
PUBLISH()
publish(topic, payload=None, qos=0, retain=False)
回调函数on_publish()
SUBSCRIBE()
subscribe(topic, qos=0)
on_subscribe()
UNSUBSCRIBE()
unsubscribe(topic)
回调函数
ON_CONNECT()
on_connect(client, userdata, flags, rc)