gpt4 book ai didi

python-3.x - 与外部 MQTT 代理连接时出现问题

转载 作者:行者123 更新时间:2023-12-04 19:07:25 25 4
gpt4 key购买 nike

我在 Pine A64+ 1Gb 上使用 Ubuntu mate,我已经用 python3 安装了 paho mqtt 库,我通过创建本地蚊子服务器测试了库,它工作正常。现在我需要连接到具有用户名和密码的外部代理,我尝试使用以下代码,但它对我不起作用。有了这个,我什至无法连接到经纪人。

import paho.mqtt.client as mqtt
import time
broker_address = "121.242.232.175.xip.io"
port = 1883

def on_connect(client, userdata, flags, rc):
if rc==0:
client.connected_flag = True
print("connected OK Returned code=",rc)
else:
print("Bad connection Returned code=",rc)

mqtt.Client.connected_flag = False

client = mqtt.Client("SWAHVACAHU00000600")
client.username_pw_set(username="#####",password="#####")
client.on_connect = on_connect
client.loop_start()
client.connect(broker_address, port)
#while not client.connected_flag:
# print("inthe while")
# time.sleep(1)

client.loop_stop()
client.publish("pine", "Hello from Pinr A64",0)
client.disconnect()
我正在使用 websocket 客户端检查 hivemqtt 并订阅相同的主题。

最佳答案

再检查一下loop_start()做:

These functions implement a threaded interface to the network loop. Calling loop_start() once, before or after connect*(), runs a thread in the background to call loop() automatically. This frees up the main thread for other work that may be blocking. This call also handles reconnecting to the broker. Call loop_stop() to stop the background thread


paho-mqtt
这意味着您启动一个线程,该线程经常处理您的所有网络操作(也发送您的连接尝试)。在您的代码中,您立即通过调用 loop_stop() 再次停止该线程。 - 所以很有可能您的连接尝试甚至没有发送出去。
此外,您的主程序在 client.disconnect() 之后立即终止。没有任何延迟 - 所以网络线程(如果正在运行)绝对没有时间处理任何事情
我建议重组您的代码,以便您的操作正确计时并在所有工作完成后关闭连接:
def on_connect(client, userdata, flags, rc):
if rc==0:
print("Connected.")
client.publish("mytopic/example", "")
else:
print("Connection refused, rc=",rc)

def on_disconnect(client, userdata, rc):
print ("Disconnected")
if rc != 0:
# otherwise loop_forever won't return
client.disconnect()

def on_publish(client, userdataq, mid):
print ("Message delivered - closing down connection")
client.disconnect()


print ("Program started")

client = mqtt.Client("MyClient")
client.username_pw_set(username=user,password=pw)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_publish = on_publish

client.connect(broker_address, port)

client.loop_forever()

print("Program finished")
阻塞循环 loop_forever()如果 disconnect() 则自动返回叫做。使用 loop_start() 时/ loop_stop()您需要自己的循环以防止程序终止,并且您还必须处理何时中断循环以及何时关闭网络线程。
也可以考虑把 client.connect()try...except 内堵塞

关于python-3.x - 与外部 MQTT 代理连接时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65628431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com