C# 无法使MOSQUITO允许从外部本地网络进行连接

C# 无法使MOSQUITO允许从外部本地网络进行连接,c#,tcp,mqtt,mosquitto,C#,Tcp,Mqtt,Mosquitto,我有LinuxUbuntu18.04笔记本电脑,我在那里安装了MosquittoMQTT代理。在我的Windows 10笔记本电脑上,我正在运行一个用Visual Studio 2013编写的使用M2Mqtt库的C#应用程序 如果我通过本地主机连接,一切正常。我启动MOSQUITO服务器,通过C#应用程序连接,订阅一个主题,然后可以整天来回发送消息 但当我尝试通过internet地址连接时,我始终会得到uPLibrary.Networking.M2Mqtt.Exceptions.MqttConn

我有LinuxUbuntu18.04笔记本电脑,我在那里安装了MosquittoMQTT代理。在我的Windows 10笔记本电脑上,我正在运行一个用Visual Studio 2013编写的使用M2Mqtt库的C#应用程序

如果我通过本地主机连接,一切正常。我启动MOSQUITO服务器,通过C#应用程序连接,订阅一个主题,然后可以整天来回发送消息

但当我尝试通过internet地址连接时,我始终会得到uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException: “无法建立连接,因为目标计算机处于活动状态 拒绝它95.XXX.XXX.134:1883“错误。(那里的地址是我通过“WhatsmyIP”获得的)

以下是我迄今为止所做的工作:

首先,我去了我的路由器,它是一个TP-LINK AC1200。我将端口设置为转发到Linux设备的本地IP地址

然后我转到我的Linux机器,使用ufw启用端口1833并启用防火墙

从那以后,我尝试了我能想到的一切——我在命令行中声明了端口并运行了mosquito,我将conf文件更改为:

监听器1883 0.0.0.0

监听器1883 192.168.0.144

我已经完全删除了端口分配和侦听器分配(因为这是它的默认值),并且总是得到相同的结果

我下载了两个不同的实用程序——一个是安卓手机上的,另一个是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选项显式运行)

正如我所说,我改变了它,尝试了很多事情:

监听器1883 192.168.0.144 监听器1883 0.0.0.0 听众1883


以上都没有。只留下空白。它们都不起作用。

我将此作为一个答案发布,这样我可以提供更多细节,以防将来有人偶然发现

在Ubuntu18.04中设置MOSQUITTO MQTT服务器其实并不难,但步骤很重要

步骤1:安装MOSQUITO软件

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:验证MOSQUITO尚未运行

pgrep mosquitto
[注意,如果有数字显示,这是已经运行的Mosquitto的PID。您可以将其杀死。此外,您可以尝试:sudo服务Mosquitto stop]

步骤4:使用verbose选项启动Mosquetto

mosquitto -v
[注意:这会在不使用任何配置文件的情况下启动MOSQUITO。它会将连接和状态信息回显到屏幕上。便于快速调试。]

步骤5:使用本地主机检查连接

转到您的客户机(在我的示例中是Windows 10笔记本电脑)并运行MQTT客户机,连接到Linux Mosquito服务器的本地地址(在我的示例中是192.168.0.144)。你应该能够连接。事实上,您甚至可以在打开防火墙之前执行此步骤,因为这都在本地网络上,所以防火墙规则在这一点上是不相关的。直到下一步

步骤6:使用web工具检查连接

sudo ufw allow 1883 
sudo ufw enable
使用:或

[注意:除非MOSQUITTO代理正在运行,否则您将无法获得打开的状态]

步骤7:如果从Internet(即非本地主机)进入时端口显示关闭

这就是我被绊倒的地方。在我的例子中,我有一个Verizon调制解调器,它也有一个防火墙(因为它有一个路由器)。我有自己的无线路由器,一个tp-link Archer C1200,我已将其插入Fios调制解调器/路由器。我首先将端口转发放在tp链接中。但是防火墙在Fios防火墙之后,所以我需要到第一道墙,在那里做端口转发

这是第二件棘手的事情。所有的在线指南都说我应该将端口1883转发到我的Linux服务器的本地IP地址,在我的例子中是192.168.0.144。但对我来说,这是不正确的。Archer C1200实际上是我需要转发的设备——它从那里处理正确的分发。它有一个地址192.168.0.152从Verizon路由器分配给它。我仍然有两个转载到位(即FIO和tp链接),我的猜测是,我需要他们两个

现在所有路径都已打开,您可以按照其他有关日志、配置文件、守护进程等的MOSQUITO说明进行操作


希望这能为大家节省一些时间

我将此作为一个答案发布,这样我可以提供更多细节,以防将来有人无意中发现这一点

在Ubuntu18.04中设置MOSQUITTO MQTT服务器其实并不难,但步骤很重要

步骤1:安装MOSQUITO软件

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:验证MOSQUITO尚未运行

pgrep mosquitto
[注意,如果有数字显示,这是已经运行的Mosquitto的PID。您可以将其杀死。此外,您可以尝试:sudo服务Mosquitto stop]

步骤4:使用verbose选项启动Mosquetto

mosquitto -v
[注意:这会在不使用任何配置文件的情况下启动MOSQUITO。它会将连接和状态信息回显到屏幕上。便于快速调试。]

步骤5:使用本地主机检查连接

转到您的客户机(在我的例子中是Windows 10笔记本电脑)并运行MQTT客户机,连接