ConnectionRefusedError:[WinError 10061] - MQTT 和 Python-paho

问题描述 投票:0回答:1

我对这个协议、python 和 paho-mqtt 完全陌生。 我想要两个发布者以最简单的方式发布到一个主题。我还希望订阅者能够收听这些消息。以前,我不知道是否是因为我在Python中进行了更改,但是当我运行订阅者然后运行第一个发布者时,没有问题。但是,当我运行第二个时,我收到此错误:

Traceback (most recent call last):
  File "C:\...\MQTT\DigitalTwin2.py", line 14, in <module>
    dt_client.connect("test.mosquitto.org", 1883, 60)
  File "C:\...\Python\Python39\lib\site-packages\paho\mqtt\client.py", line 914, in connect
    return self.reconnect()
  File "C:\...\Python\Python39\lib\site-packages\paho\mqtt\client.py", line 1044, in reconnect
    sock = self._create_socket_connection()
  File "C:\...\Python\Python39\lib\site-packages\paho\mqtt\client.py", line 3685, in _create_socket_connection
    return socket.create_connection(addr, timeout=self._connect_timeout, source_address=source)
  File "C:\...\Python\Python39\lib\socket.py", line 843, in create_connection
    raise err
  File "C:\...\Python\Python39\lib\socket.py", line 831, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

Python代码如下:(发布者代码相同,只是客户端名称不同)

发行商 #1 和 2:

import paho.mqtt.client as mqtt
from random import uniform
import time

def on_dt_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to Digital Twin-1 with result code 0")
    else:
        print("Connection to Digital Twin-1 failed with result code " + str(rc))

dt_client = mqtt.Client("Digital Twin-1")
dt_client.on_connect = on_dt_connect

dt_client.connect("test.mosquitto.org", 1883, 60)

while True:
    randNumber = uniform(3.0, 4.0)
    randNumber = round(randNumber, 4)
    dt_client.publish("topic", "Digital Twin-1: " + str(randNumber))
    print("..." + str(randNumber) + "...")
    time.sleep(1)

订阅者:

import paho.mqtt.client as mqtt
import time

def on_sd_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to Smart Device with result code 0")
    else:
        print("Connection to Smart Device failed with result code " + str(rc))

def on_sd_message(client, userdata, message):
    print("...", str(message.payload.decode("utf-8")))

device_client = mqtt.Client("Smart Device")
device_client.on_connect = on_sd_connect

device_client.connect("test.mosquitto.org", 1883, 60)

device_client.loop_start()
device_client.subscribe("topic")
device_client.on_message = on_sd_message

time.sleep(30)

device_client.loop_stop()

我已经查看了之前的问题,但似乎没有人尝试连接三个客户端。另外,我之前做过的事情是:

  • 我使用 Windows Defender 中的“新规则”添加了一条新规则。

  • 在使用MQTT Explorer时,我添加了密码。当我无法使用密码连接时,我关闭了 MQTT Explorer。我删除了从 mosquitto 文件夹中创建的密码文件。

我尝试通过观看 YouTube 视频来遵循这些步骤。

python windows mqtt mosquitto paho
1个回答
0
投票

完全复制并粘贴了您的发布者和订阅者代码,没有任何修改:

publisher1.py

import paho.mqtt.client as mqtt
from random import uniform
import time

def on_dt_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to Digital Twin-1 with result code 0")
    else:
        print("Connection to Digital Twin-1 failed with result code " + str(rc))

dt_client = mqtt.Client("Digital Twin-1")
dt_client.on_connect = on_dt_connect

dt_client.connect("test.mosquitto.org", 1883, 60)

while True:
    randNumber = uniform(3.0, 4.0)
    randNumber = round(randNumber, 4)
    dt_client.publish("topic", "Digital Twin-1: " + str(randNumber))
    print("..." + str(randNumber) + "...")
    time.sleep(1)

subscriber.py

import paho.mqtt.client as mqtt
import time

def on_sd_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connected to Smart Device with result code 0")
    else:
        print("Connection to Smart Device failed with result code " + str(rc))

def on_sd_message(client, userdata, message):
    print("...", str(message.payload.decode("utf-8")))

device_client = mqtt.Client("Smart Device")
device_client.on_connect = on_sd_connect

device_client.connect("test.mosquitto.org", 1883, 60)

device_client.loop_start()
device_client.subscribe("topic")
device_client.on_message = on_sd_message

time.sleep(30)

device_client.loop_stop()

我可以在本地计算机上运行它们,没有任何问题。

如果复制发布者代码并更改客户端 ID(例如,将

Digital Twin-1
更改为
Digital Twin-2
),那么我可以同时运行 2 个发布者和 1 个订阅者。再次强调,一切正常。

因此,您的代码不是问题。我相信您的环境中有某些东西阻止网络访问

test.mosquitto.org:1883

© www.soinside.com 2019 - 2024. All rights reserved.