Python网络通信(3)— MQTT通信
一、安装MQTT支持包
首先我们需要安装支持MQTT通信的python包,打开PyCharm里的【Settings】,找到【Project Interpreter】,然后点击右边的加号
搜索“paho-mqtt
”,找到后点击安装:
或者直接使用命令安装:
pip3 install paho-mqtt
如果提示“'pip3' 不是内部或外部命令,也不是可运行的程序或批处理文件。
”,参考解决win10执行pip3报外部命令问题解决。
如果继续报错,查看一下环境变量是否已经设置。
二、编写代码和MQTT服务器通信
首先,导入mqtt包
import paho.mqtt.client as mqtt
首先定义一些连接mqtt服务器需要的参数:
MQTTHOST = "39.96.35.207" #MQTT服务器的IP地址
MQTTPORT = 1883 #MQTT服务器的端口号
ClientId = "pycharm"+str(time.time()) #ClientId需要唯一
username = "pycharm" #用户名
password = "123456" #用户名对应的密码
然后,创建一个mqtt客户端对象,输入client_id参数
# 创建一个mqtt通信对象
mqtt_client = mqtt.Client(ClientId)
设置用户名和密码
mqtt_client.username_pw_set(username, password) # 设置用户名和一个可用的密码
然后设置MQTT连接时的回调函数:
mqtt_client.on_connect = mqtt_connected # 设置连接成功回调函数
mqtt_client.on_message = on_message # 设置收到订阅主题数据回调函数
mqtt_client.on_subscribe = on_subscribe # 设置订阅主题成功回调函数
mqtt_client.on_disconnect = on_disconnect # 设置失去连接回调函数
然后实现这些回调函数,在连接成功后,订阅一个主题,发布一个主题:
# 连接成功回调函数
# 参数分别为:调用回调函数的客户端实例,用户私有数据,包含代理回复的标志的字典,连接情况
def mqtt_connected(mqttClient, userdata, flags,rc):
print(flags)
if not rc:
print("MQTT connect success.")
mqttClient.publish("Python_publish", "I'm python.", qos=0) # 发送消息
mqttClient.subscribe("Python_subscribe", qos=0) # 订阅主题
else:
print("MQTT connect error:", rc)
然后实现另外的回调函数:
# 收到订阅主题数据回调函数
def on_message(client, userdata, msg):
print("主题:",msg.topic," 消息:")
print(str(msg.payload.decode('utf-8')))
# 订阅主题成功回调函数
def on_subscribe(client, userdata, mid, granted_qos):
print("Subscrib topic success,qos = %d" % granted_qos)
# 失去连接回调函数
def on_disconnect(client, userdata, rc):
if rc != 0:
print("Unexpected disconnection %s" % rc)
然后我们就可以开始连接了
# 客户端连接到代理服务端,60心跳时间
mqtt_client.connect(MQTTHOST, MQTTPORT, 60)
# 网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接
mqtt_client.loop_forever()
运行程序,打开EMQ的控制台(关于EMQ的使用:使用EMQ 平台搭建MQTT服务器),可以看到连接成功
我们打开MQTTfx,订阅主题Python_publish
,重新运行Python程序,可以看到,消息已经发送成功:
然后我们发布Python_subscribe
主题消息,可以收到:
三、代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: William
import time
import paho.mqtt.client as mqtt
MQTTHOST = "39.96.35.207" #MQTT服务器的IP地址
MQTTPORT = 1883 #MQTT服务器的端口号
ClientId = "pycharm"+str(time.time()) #ClientId需要唯一
username = "pycharm" #用户名
password = "123456" #用户名对应的密码
# 连接成功回调函数
# 参数分别为:调用回调函数的客户端实例,用户私有数据,包含代理回复的标志的字典,连接情况
def mqtt_connected(mqttClient, userdata, flags,rc):
if not rc:
print("MQTT connect success.")
mqttClient.publish("Python_publish", "I'm python.", qos=0) # 发送消息
mqttClient.subscribe("Python_subscribe", qos=0) # 订阅主题
else:
print("MQTT connect error:", rc)
# 收到订阅主题数据回调函数
def on_message(client, userdata, msg):
print("主题:",msg.topic," 消息:")
print(str(msg.payload.decode('utf-8')))
# 订阅主题成功回调函数
def on_subscribe(client, userdata, mid, granted_qos):
print("Subscrib topic success,qos = %d" % granted_qos)
# 失去连接回调函数
def on_disconnect(client, userdata, rc):
if rc != 0:
print("Unexpected disconnection %s" % rc)
def main():
# 创建一个mqtt通信对象
mqtt_client = mqtt.Client(ClientId)
mqtt_client.username_pw_set(username, password) # 设置用户名和一个可用的密码
mqtt_client.on_connect = mqtt_connected # 设置连接成功回调函数
mqtt_client.on_message = on_message # 设置收到订阅主题数据回调函数
mqtt_client.on_subscribe = on_subscribe # 设置订阅主题成功回调函数
mqtt_client.on_disconnect = on_disconnect # 设置失去连接回调函数
# 客户端连接到代理服务端,60心跳时间
mqtt_client.connect(MQTTHOST, MQTTPORT, 60)
# 网络循环的阻塞形式,直到客户端调用disconnect()时才会返回。它会自动处理重新连接
mqtt_client.loop_forever()
if __name__ == '__main__':
main()