TB boy 2024-04-11 13:51 采纳率: 0%
浏览 36

多客户端mqtt协议连接Thingsboard

在使用paho.mqtt.client库连接thingsboard平台的设备时,单个客户端连接订阅设备的属性,没有任何问题,现考虑同时多个客户端进行订阅操作,启动两个python窗口,代码如下,进行连接,控制端就一直不停地显示Connected with result code Success,对于其Qos的等级问题也进行了区别,client_id也进行了不同的设置,还是不清楚问题出在哪,是Thingsboard平台的问题还是客户端代码的问题

def on_connect(client, userdata, flags, reason_code, properties):
    print('Connected with result code ' + str(reason_code))
    # 订阅设备的属性主题
    client.subscribe('v1/devices/me/attributes',qos=0)

# 消息接收回调
def on_message(client, userdata, msg):
    print('Topic: ' + msg.topic + '\nMessage: ' + str(msg.payload))

def on_subscribe(client, userdata, mid, reason_code_list, properties):
    # Since we subscribed only for a single channel, reason_code_list contains
    # a single entry
    if reason_code_list[0].is_failure:
        print(f"Broker rejected you subscription: {reason_code_list[0]}")
    else:
        print(f"Broker granted the following QoS: {reason_code_list[0].value}")


# 创建 MQTT 客户端实例
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,client_id="client2")

# 设置连接回调
client.on_connect = on_connect
# 设置消息接收回调
client.on_message = on_message
#订阅信息QoS的等级
client.on_subscribe=on_subscribe
# 使用设备访问令牌进行身份验证
client.username_pw_set(ACCESS_TOKEN)

# 连接到 ThingsBoard MQTT 服务器
client.connect(THINGSBOARD_HOST, MQTT_PORT,60)

# 阻塞调用,客户端将自动处理重连操作
client.loop_forever()

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 13:51
    关注

    引自免费微信小程序:皆我百晓生

    看起来您正在尝试使用Paho MQTT Python客户端连接到ThingsBoard,并且遇到一些问题。首先,让我们检查一下代码并提供一些可能的解决方案。

    1. 确保ACCESS_TOKENTHINGSBOARD_HOSTMQTT_PORT变量已经正确设置。
    2. 检查您的ThingsBoard服务器配置是否允许多个客户端订阅同一个主题。默认情况下,ThingsBoard支持多个客户端订阅同一主题,但如果您启用了某些特定的安全策略,可能会限制此行为。您可以查看ThingsBoard的官方文档或与管理员确认这一点。
    3. 考虑使用不同的主题前缀,这样可以确保每个客户端订阅的主题不同,例如:
      topic_prefix = "client{}/v1/devices/me/attributes".format(client_id)
      client.subscribe(topic_prefix, qos=0)
      
    4. 如果问题仍然存在,可能是由于网络延迟或其他通信问题导致的。在这种情况下,可以尝试增加重试次数和超时时间,以及调整重连策略。下面是一个修改后的版本,增加了重试次数和超时时间:
    import time
    
    RETRY_TIMES = 5
    RETRY_DELAY_SECONDS = 5
    
    def on_disconnect(client, userdata, rc):
        retries = 0
        while retries < RETRY_TIMES and rc != 0:
            print("Disconnected, retrying in {} seconds... (rc={})".format(RETRY_DELAY_SECONDS, rc))
            time.sleep(RETRY_DELAY_SECONDS)
            rc = client.reconnect()
            retries += 1
    
        if rc == 0:
            print("Reconnected.")
        else:
            print("Failed to reconnect after {} tries.".format(RETRY_TIMES))
    
    client.on_disconnect = on_disconnect
    
    # ...其他代码保持不变...
    
    # 连接到 ThingsBoard MQTT 服务器
    while True:
        try:
            client.connect(THINGSBOARD_HOST, MQTT_PORT, 60)
            break
        except Exception as e:
            print("Connection failed, retrying in {} seconds... ({})".format(RETRY_DELAY_SECONDS, e))
            time.sleep(RETRY_DELAY_SECONDS)
    
    # 阻塞调用,客户端将自动处理重连操作
    client.loop_forever()
    

    根据以上建议,尝试修改代码并重新运行。如果问题依然存在,请提供更多关于错误日志或连接状态的信息,以便进一步诊断。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆