我对这个协议、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 视频来遵循这些步骤。
我完全复制并粘贴了您的发布者和订阅者代码,没有任何修改:
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
。