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

标签 python-3.x linux ubuntu mqtt payload

我在 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/

相关文章:

python - 计算字符串列表中的数字并将它们作为整数列表返回

Python 静态变量

Python:查找列表列表中任意长度组合最常出现的次数

ruby-on-rails - 在 Ubuntu 12.04 上使用 RVM 来使用 Rails。当前未安装程序 'rails'

python - K-Means:将集群分配给新的数据点

linux - 可执行文件关闭后在 bash 中执行一些命令?

php - 如何在 Linux 上找到我的 PHP 作业的 pid?

c++ - 将编译器更改为Clang

ubuntu - 安装CUDA 8.0后在Ubuntu 17.04中没有声音

c - 为什么在 ubuntu 2.6.38-generic 或 3.0.0-lowlatency 内核上的一个线程会阻止另一个线程使用 mmap_sem?