我有Linux Ubuntu 18.04笔记本电脑,并且在那里安装了Mosquitto MQTT代理。在Windows 10笔记本电脑上,我正在运行一个使用M2Mqtt库在Visual Studio 2013中编写的C#应用程序。
如果我通过本地主机连接,一切都很好。我启动了Mosquitto服务器,通过C#应用程序连接,订阅了一个主题,然后可以整天来回发送消息。
但是,当我尝试通过Internet地址进行连接时,始终会得到一个uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException: “无法建立连接,因为目标计算机处于活动状态 拒绝了它95.XXX.XXX.134:1883“错误。(地址是我通过“ WhatsmyIP”获得的地址)
这是我到目前为止所做的:
首先,我去了我的路由器,它是TP-LINK AC1200。我将端口设置为转发到Linux机器的本地IP地址。
然后我去Linux盒子,用ufw启用端口1833并启用防火墙
从那里开始,我尝试了所有我能想到的-我已经在命令行中声明的端口上运行了Mosquitto,我将conf文件更改为:
监听器1883 0.0.0.0
和
监听器1883 192.168.0.144
我已经完全删除了端口分配和侦听器分配(因为无论如何这都是默认设置),并且总是得到相同的结果。
我下载了2种不同的实用程序-一种是在Android手机上,另一种是Windows应用商店提供的应用程序,但我都无法与它们连接。 Android手机根本无法连接(它不在同一网络上,因此不能选择localhost),而另一个应用程序将在本地连接,但是当我更改为Internet地址时不会。
我觉得我只是想念一件小东西,但我不知道这是什么。还有其他stackoverflow问题显示相同的错误,但它们对我没有帮助。
如果有关系,正在运行的实际C#代码为:
try
{
System.Security.Cryptography.X509Certificates.X509Certificate caCert = null;
Boolean useSecureProtocol = false;
int OpenPort = 1883;
// external IP address
String PublicIPAddress = "95.XXX.XXX.134";
// local IP address
String LocalIPAddress = "192.168.0.144";
System.Net.IPAddress ipaddress = System.Net.IPAddress.Parse(PublicIPAddress);
client = new MqttClient(ipaddress, OpenPort, useSecureProtocol, caCert, MqttSslProtocols.TLSv1_0);
// certificate and Protocol are irrelevant because security set to false??
}
catch (System.Net.Sockets.SocketException SException )
{
string SEX = SException.Message;
}
* * *
try
{
Byte retVal = client.Connect(ClientId);
}
catch (uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException ex)
{
string m = ex.Message;
}
配置文件:conf.d(我使用-C选项显式运行)
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
#
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /home/mark_admin/mosquitto.log
include_dir /etc/mosquitto/conf.d
正如我所说,我已经对其进行了更改并尝试了许多事情:
监听器1883 192.168.0.144 侦听器1883 0.0.0.0 侦听器1883
以上都不是。只是空白。他们都没有工作。
答案 0 :(得分:0)
我将其发布为答案,以便将来提供更多详细信息,以防将来有人偶然发现。
在Ubuntu 18.04中设置MOSQUITTO MQTT服务器实际上并不难,但是步骤很重要。
第1步:安装Mosquitto软件
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto
步骤2:打开端口1883并启动防火墙
sudo ufw allow 1883
sudo ufw enable
第3步:验证Mosquitto是否尚未运行
pgrep mosquitto
[注意,如果显示任何数字,那就是已经运行的Mosquitto的PID。你可以杀死它。另外,您可以尝试: sudo服务mosquit停止]
第4步:使用详细选项启动Mosquitto
mosquitto -v
[注意:这将在不使用任何配置文件的情况下启动Mosquitto。它将连接和状态信息回显到屏幕。最容易进行快速调试。]
第5步:使用本地主机检查连接性
转到您的客户端计算机(在我的情况下为Windows 10笔记本电脑)并运行MQTT客户端,连接到Linux Mosquitto服务器的本地地址(在我的情况下为192.168.0.144)。您应该可以连接。实际上,您甚至可以在打开防火墙之前执行此步骤,因为这全部在本地网络上,因此此时的防火墙规则无关紧要。直到下一步...
步骤6:使用网络工具检查连通性
使用以下任一方法:www.yougetsignal.com/tools/open-ports/或 https://canyouseeme.org/
[注意:您不会获得 OPEN 状态除非蚊子经纪人正在运行]
步骤7:如果从Internet(即不是localhost)进入时端口显示为关闭状态
这是我绊倒的地方。在我的情况下,我有一个Verizon调制解调器,其中ALSO还具有防火墙(因为它具有路由器)。我有自己的无线路由器,即tp-link Archer C1200,已插入Fios调制解调器/路由器。我首先将端口转发置于tp-link中。但是该防火墙位于Fios防火墙之后,所以我需要去第一堵墙并在那儿做端口转发。
这是棘手的第二件事。所有的在线操作方法都说我应该将端口1883转发到我的Linux服务器的本地IP地址,在我的情况下为192.168.0.144。但这对我来说是不正确的。实际上,Archer C1200是我需要转发到的设备-它从那里处理了正确的分发。从Verizon路由器为其分配了一个地址192.168.0.152。我仍然有两个转发位置(例如Fios和tp-link),我想我都需要它们。
现在所有路径都已打开,您可以按照Mosquitto的其他说明进行操作,有关日志记录,配置文件,守护程序等。
希望这可以节省一些时间!