python mqtt的具体实现(可使用通配符订阅多个子主题)

注:复制来用即可【改动里面的HOST,PORT和主题名称】

#!/user/bin/python3
# -*- codeing:utf-8 -*-
# Time : 2019/8/8 16:44
# Author : LiuShiHua
# Desc :

import json
import paho.mqtt.client as mqtt
import time

#这里的HOST是错误的哈,需要写入你自己的HOST
#这里的HOST是错误的哈,需要写入你自己的HOST
#这里的HOST是错误的哈,需要写入你自己的HOST
HOST = '101.212.101.28'
PORT = 1883
# 同时订阅多个主题方式①使用#通配符
# '#'号是通配符,订阅匹配#平级及子级主题的所有主题
# 消息服务质量,0最多一次,1最少一次,2只一次
subscribe_topic_running = "them/running/#"
subscribe_topic_command = "them/gsensor/#"
#同时订阅多个主题方式②订阅主题数组
subscribe_topic_array = [("them/running/121", 0), ("them/command/121", 2)]
subscribe_them_all = "them/#"
publish_topic = "them/command/LNGNW8XLG9"
CLIENT_ID = "11"


def on_connect(client, userdata, flags, rc):
    """
    链接mqtt成功、失败都会回调此函数
    :param client:
    :param userdata:
    :param flags:
    :param rc:0.成功 1.错误的协议版本 2.无效的 client ID  3.服务器不可用  4.错误的用户名或密码  5.无法验证
    :return:
     client.subscribe(subscribe_topic_array )  # 订阅多个主题
    """
    print("Connected with result code " + str(rc))
    client.subscribe(subscribe_topic_running)  # 订阅消息


def on_message(client, userdata, msg):
    print("on_message 主题:" + msg.topic + " 消息:" + str(msg.payload.decode('utf-8')))


def on_running_message(client, userdata, msg):
    print("on_running_message 主题:" + msg.topic + " 消息:" + str(msg.payload.decode('utf-8')))


def on_command_message(client, userdata, msg):
    print("on_command_message 主题:" + msg.topic + " 消息:" + str(msg.payload.decode('utf-8')))


# 订阅回调
def on_subscribe(client, userdata, mid, granted_qos):
    print("On Subscribed: qos = %d" % granted_qos)


# 取消订阅回调
def on_unsubscribe(client, userdata, mid, granted_qos):
    print("On unSubscribed: qos = %d" % granted_qos)


# 发布消息回调
def on_publish(client, userdata, mid, granted_qos):
    print("On onPublish: qos = %d" % granted_qos)


# 断开链接回调
def on_disconnect(client, userdata, rc):
    print("Unexpected disconnection rc = " + rc)


data = {
    "type": 2,
    "timestamp": time.time(),
    "messageId": "9fcda359-89f5-4933-xxxx",
    "command": "xx/recommend",
    "data": {
        "openId": "xxxx",
        "appId": "XXX",
        "recommendType": "temRecommend"
    }
}
# 注意:不要将以下内容放入if __name__="__main__":中执行
# 注意:不要将以下内容放入if __name__="__main__":中执行
# 注意:不要将以下内容放入if __name__="__main__":中执行
param = json.dumps(data)
client = mqtt.Client(CLIENT_ID)
client.username_pw_set("root", "root")
client.on_connect = on_connect
client.on_message = on_message
"""
 如果要用通配符同时处理多个话题的消息,例如用 sensors/# 匹配 sensors/temperature 和 sensors/humidity 话题,
 可以用 message_callback_add() 设置回调函数:(如下)
 
 如果同时设置了 on_message() 和 message_callback_add() 回调函数,会首先寻找合适的 message_callback_add() 
 定义的话题过滤器,如果没有匹配,才会调用 on_message()
"""
client.message_callback_add(subscribe_topic_running, on_running_message)
client.message_callback_add(subscribe_topic_command, on_command_message)
client.on_subscribe = on_subscribe
client.on_unsubscribe = on_unsubscribe
client.on_publish = on_publish
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
client.publish(publish_topic, payload=param, qos=0)  # 发送消息
client.loop_forever()

执行效果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值