会python的同学都知道怎么安装,Windows上pip install paho-mqtt
即可。
一般客户端的使用流程如下:
connect
方法连接broker;loop
方法(注:loop包含loop
,loop_forever
,loop_start
);subscribe
方法订阅某个主题;publish
方法向某个主题发布消息到broker;disconnect
方法断开和broker的链接callback
,程序可能在某些事件触发时需要做一些操作,这些操作就可以放入回调方法中。iot.eclipse.org
,端口默认1883
,如果是自己或者所测项目部署了broker,替换成对应的IP和端口即可。以下代码可以非常简单的去发布消息到某个(single
)主题中。该方法还包含client id
,qos
,transport
,will
等参数,在实际应用中,一般需要按照规则指定client id
,设置相应的qos
等级,如果采用的是MQTT over WebSockets的话,transport
应使用websockets
。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.publish as publish
publish.single("paho/test/single", "boo", hostname="iot.eclipse.org")
下面代码是一个订阅客端户,订阅了某个topic之后,一直处于loop状态。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
# 一旦连接成功,回调此方法
def on_connect(mqttc, obj, flags, rc):
print("rc: " + str(rc))
# 一旦订阅到消息,回调此方法
def on_message(mqttc, obj, msg):
print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))
# 一旦订阅成功,回调此方法
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: " + str(mid) + " " + str(granted_qos))
# 一旦有log,回调此方法
def on_log(mqttc, obj, level, string):
print(string)
# 新建mqtt客户端,默认没有clientid,clean_session=True, transport="tcp"
mqttc = mqtt.Client()
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_subscribe = on_subscribe
mqttc.on_log = on_log
# 连接broker,心跳时间为60s
mqttc.connect("iot.eclipse.org", 1883, 60)
# 订阅该主题,QoS=0
mqttc.subscribe("paho/test/single", 0)
mqttc.loop_forever()
先运行订阅客户端,连接成功之后(rc:0
),再运行上面的发布客户端,在订阅客户端这里就可以收到该主题下的消息。输出结果如下,最后一行输出就是就是收到的消息:
C:\python36\python.exe D:/localGit/mqttDemo/mqtt_sub.py
Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k60) client_id=b''
Sending SUBSCRIBE (d0) [(b'paho/test/single', 0)]
Received CONNACK (0, 0)
rc: 0
Received SUBACK
Subscribed: 1 (0,)
Received PUBLISH (d0, q0, r0, m0), 'paho/test/single', ... (3 bytes)
paho/test/single 0 b'boo'
这2个定义可以参考这里。
callback
即回调方法,是在事件之后触发的。举个例子,上面代码中,自定义了on_connect方法(注:这个方法可以随便起名字,不是必须命名为on_connect),内容是输出rc
。然后把on_connect方法分配给了connect的callback,即client.on_connect
,这就表示当connect
成功(即:收到connack
消息),会触发自定义的on_connect,把rc输出出来。Paho MQTT中client的callback如下:
Event | Callback |
---|---|
connection ack | on_connect |
disconnection ack | on_disconnect |
connection ack | on_subscribe |
Subscription ack | on_connect |
Un-subscription ack | on_unsubscribe |
Publish ack | on_publish |
Message receive | on_message |
Log information available | on_log |
loop()
方法在MQTT客户端中也非常重要,它主要是用来去查询消息缓存区。当有新的消息到达时,这些消息会存储在接收缓存区,等待有客户端程序去读取。loop()
方法就是一个内置的读取接收和发送缓存区,并分发消息的方法。简单说就是,如果不loop
,也不自己去主动读取接收缓存区,就触发不了回调函数,所以要记着写上loop
。
之前对loop
几个方法一直很疑惑,所以这里多说点。Paho python client中提供了3个方法:
loop_forever
() --会阻塞程序,其实是周期调用loop()方法,如果程序需要一直处于订阅中的话,可以用这个方法,它也会对客户端进行重连。loop_start
() --会新起一个thread,这个thread会调用loop_forever(),所以也会周期调用loop(),并且会保证客户端自动re-connectloop
() --这个方法只会loop指定的时间(默认1s),只会就结束,不会继续去读取缓存区,所以如果在程序中使用的话,需要自己写个周期调用,并且还要自己处理re-connect