mqtt 客户端未通过 ip 地址连接到 mqtt 代理

mqtt client not connecting to mqtt broker through ip address

我是 mqtt 协议的新手。我很难将我的 mqtt 客户端(已连接到另一个网络)与我的 mqtt 代理 运行 在我的电脑上使用 IP 地址连接。

我的 mqtt 代理连接到我的家庭 wifi,而我的客户端连接到不同的家庭 wifi。

我正在使用具有以下配置的 mosquitto 代理:

listener 1883 0.0.0.0
allow_anonymous true

Mqtt客户端代码:

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

broker = "10.18.124.166"
port = 1883
client = mqtt.Client("iot gateway 1")
client.connect(broker, port)

while True:
    num = uniform(1,10)
    client.publish("Iotgateway/MFMmeter", num)
    print("just published" + str(num) + " to" + str(broker) +  "on topic EdgeGrid/Iotgateway/MFMmeter")
    time.sleep(1)

在上面的代码中,我创建了一个随机数,并尝试将其发送到 mqtt 代理。

我遇到了这个错误:

Traceback (most recent call last):
  File "testing1.py", line 8, in <module>
    client.connect(broker, port)
  File "C:\Users\Rohit\AppData\Local\Programs\Python\Python38-32\lib\site-packages\paho\mqtt\client.py", line 914, in connect
    return self.reconnect()
  File "C:\Users\Rohit\AppData\Local\Programs\Python\Python38-32\lib\site-packages\paho\mqtt\client.py", line 1044, in reconnect
    sock = self._create_socket_connection()
  File "C:\Users\Rohit\AppData\Local\Programs\Python\Python38-32\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:\Users\Rohit\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 808, in create_connection
    raise err
  File "C:\Users\Rohit\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 796, in create_connection
    sock.connect(sa)
socket.timeout: timed out

my mqtt broker is connected to my home wifi where as my client is connected to a different home wifi.

这通常意味着客户端和代理都位于所谓的 NAT(网络地址转换)网关(这将是家庭网络路由器)之后。两个家庭网络都将使用无法通过互联网路由的 RFC1918 地址范围,为了解决这个问题,路由器将所有传出流量映射到 ISP 分配给路由器的单个 public IP 地址(假设没有运营商在此处对 NAT 评分)。

大多数 ISP 会动态地将这个 public IP 地址分配给路由器,这意味着它可以在每次重新启动路由器时更改。

为了在您的家庭网络上 运行 MQTT 代理,它需要可以通过 public IP 地址访问。这可以通过使用 ISP 分配给您的路由器的 Public IP 地址并启用所谓的端口转发来实现。问题是,如果这个地址不断变化,那么它就无法使用(因为每次它发生变化时,你都必须更新每个想要连接的客户端)。有一些解决方案(例如动态 DNS)可以将主机名映射到不断变化的 IP 地址。

考虑到所有这些,我建议您不要尝试在家里托管 MQTT 代理,直到您更好地了解家庭互联网连接的工作原理并考虑使用 public 测试之一MQTT 代理测试或考虑在云提供商上托管 MQTT 代理。

关于 Stack Overflow 的更多解释与主题无关,因为这是网络配置问题而不是编程问题。