简介
MQTT协议目前可能是物联网最为流行的传输协议,那么如何使用Python作为客户端,和MQTT服务器端进行交互?
本文将以paho.mqtt.python (https://github.com/eclipse/paho.mqtt.python)作为客户端,EMQ为MQTT Broker来介绍paho与EMQ之间交互。
安装MQTT Broker: EMQ
EMQ是目前开源社区最为流行的MQTT Broker,之前EMQ君的博客上已经对如何在不同的操作系统安装,本文不再赘述。
在Ubuntu上安装EMQ,请点击这里;在Windows上安装EMQ,请点击这里。
准备paho.mqtt.python
Python安装请参考这三篇文章:Linux系统python安装;Windows系统Python安装;Mac系统Python安装。
EMQ君建议Python版本为python3.6(paho建议版本为2.7+和3.2+)
解压paho.mqtt.python-master.zip
打开命令行窗口,切换到解压后paho目录,安装paho
python setup.py install
Windows安装完成后paho文件在Python\Lib\site-packages\paho_mqtt-1.3.1-py3.6.egg\paho\mqtt目录。
Ubuntu安装完成后paho文件在/usr/local/lib/python3.6/dist-packages/paho_mqtt-1.3.1-py3.6.egg/paho/mqtt/目录。
其中client.py文件中主要Client用法如下:
- 使用 connect() / connect_async() 连接Broker
- 调用 loop() 保持与Broker网络连接
- 使用 loop_start() 调用一个loop()进程
- 使用 loop_forever() 保持 loop()调用
- 使用 subscribe() 订阅主题并接收消息
- 使用 publish() 发布消息
- 使用 disconnect() 与Broker断开连接
使用回调函数使Broker返回数据可用,例子如下:
def on_connect(client, userdata, flags, rc):
print("Connection returned " + str(rc))
client.on_connect = on_connect
所有的回调都有一个“client”和一个“userdata”参数,“client”是调用回调的客户端实例,“userdata”是任何类型的用户数据,可以在创建新客户端实例时设置或者使用user_data_set(userdata)
on_connect(client, userdata, flags, rc)
当Broker响应我们请求时调用,“flags” 是一个包含Broker响应参数的字典:flags['session present'] –此标志仅对于干净会话设置为0,如果设置session=0,用于客户端重新连接到之前Broker是否仍然保存之前会话信息,如果设1,会话一直存在。“rc”值用于判断是否连接成功:
0: 连接成功
1: 连接失败-不正确的协议版本
2: 连接失败-无效的客户端标识符
3: 连接失败-服务器不可用
4: 连接失败-错误的用户名或密码
5: 连接失败-未授权
6-255: 未定义.
on_disconnect(client, userdata, rc)
当客户端与Broker断开时调用
on_message(client, userdata, message)
在客户端订阅的主题上接收到消息时调用,“message”变量是一个MQTT消息描述所有消息特征
on_publish(client, userdata, mid)
当使用publish()发送的消息已经完成传输到代理时调用。对于QoS级别为1和2的消息,这意味着适当的握手已经完成。对于QoS 0,这仅仅意味着消息已经离开客户端。“mid”变量是从相应的publish()调用返回的中间变量。这个回调很重要,因为即使publish()调用返回成功,也并不总是意味着消息已经被发送
on_subscribe(client, userdata, mid, granted_qos)
当Broker响应订阅请求时调用,“mid”变量是从相应的subscribe()调用返回的中间变量,“granted_qos”变量是每次发送不同订阅请求Qos级别的列表
on_unsubscribe(client, userdata, mid)
当Broker响应取消订阅请求时调用,“mid“变量是从相应的unsubscribe()调用返回的中间变量
on_log(client, userdata, level, buf)
当客户端有日志信息时调用,定义允许调试,“level“变量是消息级别包含MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG,消息本身是buf。
使用举例
paho连接并订阅主题
使用paho建立连接,并订阅及发布主题。连接前EMQ控制台显示信息如下所示。
Pub代码如下:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
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("127.0.0.1", 1883, 600)
client.publish('emqtt',payload='Hello,EMQ!',qos=0)
client.loop_start()
运行后显示如下图所示。
Sub代码如下,
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
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("127.0.0.1", 1883, 600)
client.subscribe('emqtt',qos=0)
client.loop_start()
运行后显示如下图所示。
执行代码后EMQ控制台显示信息
总结
paho客户端与MQTT交互的相关功能介绍到这里,如果读者还有继续了解更多的话,请关注EMQ君的博客。
网友评论