【MQTT学习笔记七】Python实现MQTT客户端

Python实现MQTT客户端

    • paho-mqtt安装
    • 客户端
    • 发布
    • 订阅
    • callback和loop

下面写的内容主要是参考了官方文档和其他一些文章的总结,包括Python实现的MQTT客户端代码和一些关键方法的解释。官方文档看 这里。完整的Python mqtt API也可以去参考 这篇文章。

paho-mqtt安装

会python的同学都知道怎么安装,Windows上pip install paho-mqtt 即可。

客户端

一般客户端的使用流程如下:

  1. 创建一个客户端实例;
  2. 使用connect方法连接broker;
  3. 调用loop方法(注:loop包含loop,loop_forever,loop_start);
  4. 使用subscribe方法订阅某个主题;
  5. 使用publish方法向某个主题发布消息到broker;
  6. 使用disconnect方法断开和broker的链接
    还有一个重要的概念就是callback,程序可能在某些事件触发时需要做一些操作,这些操作就可以放入回调方法中。
    下面的代码示例中会展示怎么创建一个客户端。 MQTT的broker用的 iot.eclipse.org,端口默认1883,如果是自己或者所测项目部署了broker,替换成对应的IP和端口即可。

发布

以下代码可以非常简单的去发布消息到某个(single)主题中。该方法还包含client idqostransportwill等参数,在实际应用中,一般需要按照规则指定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'

callback和loop

这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
【MQTT学习笔记七】Python实现MQTT客户端_第1张图片
之前对loop几个方法一直很疑惑,所以这里多说点。Paho python client中提供了3个方法:

  • loop_forever() --会阻塞程序,其实是周期调用loop()方法,如果程序需要一直处于订阅中的话,可以用这个方法,它也会对客户端进行重连。
  • loop_start() --会新起一个thread,这个thread会调用loop_forever(),所以也会周期调用loop(),并且会保证客户端自动re-connect
  • loop() --这个方法只会loop指定的时间(默认1s),只会就结束,不会继续去读取缓存区,所以如果在程序中使用的话,需要自己写个周期调用,并且还要自己处理re-connect
    上面2个loop方法都可以通过loop.stop()方法来停止。

你可能感兴趣的:(MQTT)