Python网络通信(3)— MQTT通信

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()
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 示例代码如下:# 导入MQTT库 import paho.mqtt.client as mqtt # 定义MQTT服务器的IP地址 mqtt_server = “127.0.0.1” # 创建MQTT客户端 client = mqtt.Client() # 连接MQTT服务器 client.connect(mqtt_server) # 订阅消息 client.subscribe(“topic/name”) # 发布消息 client.publish(“topic/name”, “message”) ### 回答2: 以下是一个使用Python编写的MQTT通信代码示例: ```python import paho.mqtt.client as mqtt # 定义回调函数,用于处理收到的消息 def on_message(client, userdata, msg): print("收到消息:Topic: ", msg.topic, " 消息: ", str(msg.payload.decode('utf-8'))) # 创建MQTT客户端 client = mqtt.Client() # 设置回调函数 client.on_message = on_message # 连接到MQTT代理服务器 client.connect("mqtt.eclipse.org", 1883, 60) # 订阅一个主题 client.subscribe("testtopic") # 开始循环,保持客户端与服务器的通信 client.loop_start() # 发布一条消息到指定主题 client.publish("testtopic", "Hello MQTT!") # 停止循环,断开与服务器的连接 client.loop_stop() client.disconnect() ``` 这段代码使用了`paho.mqtt.client`库来创建一个MQTT客户端。先定义了一个回调函数`on_message()`,用于处理收到的消息。然后创建了一个客户端实例,并设置回调函数。通过`connect()`方法连接到指定的MQTT代理服务器,使用`subscribe()`方法订阅一个主题。在循环中通过`publish()`方法发布一条消息到指定主题,然后调用`loop_stop()`方法停止循环并断开与服务器的连接。 这段代码使用的MQTT代理服务器是`mqtt.eclipse.org`,端口号是1883,你可以根据实际情况修改这些参数。 ### 回答3: 使用Python编写MQTT通信代码,可以使用paho-mqtt库来简化开发过程。以下是一个简单的示例代码: ```python import paho.mqtt.client as mqtt # 连接成功回调函数 def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) # 订阅主题 client.subscribe("test/topic") # 消息接收回调函数 def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) # 创建MQTT客户端 client = mqtt.Client() # 设置连接回调函数 client.on_connect = on_connect # 设置消息接收回调函数 client.on_message = on_message # 连接到MQTT服务器 client.connect("mqtt.eclipse.org", 1883, 60) # 开始循环处理网络流量,阻塞线程 client.loop_forever() ``` 在上面的代码中,我们首先导入了paho-mqtt库,并定义了`on_connect`和`on_message`回调函数分别用于处理连接成功和消息接收事件。然后通过`mqtt.Client()`创建一个MQTT客户端对象,设置好回调函数后,使用`connect`连接到指定的MQTT服务器和端口。最后,调用`loop_forever()`方法开始循环处理网络流量,以接收消息和发送心跳。 以上是一个简单的MQTT通信代码示例,可以根据具体需求进行进一步定制和扩展。注意,在运行代码之前,需要先在设备上安装paho-mqtt库,可以使用`pip install paho-mqtt`命令进行安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值