Mar*_*l60 3 c# tcp mqtt mosquitto
我有 Linux Ubuntu 18.04 笔记本电脑,我在那里安装了 Mosquitto MQTT 代理。在我的 Windows 10 笔记本电脑上,我正在运行一个用 Visual Studio 2013 编写的 C# 应用程序,该应用程序使用 M2Mqtt 库。
如果我通过本地主机连接,一切都很好。我启动 Mosquitto 服务器,通过 C# 应用程序连接,订阅主题,然后可以全天来回发送消息。
但是,当我尝试通过互联网地址进行连接时,我始终收到 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 不是一个选项),另一个应用程序将在本地连接,但当我更改为互联网地址时不会连接。
我感觉我错过了一件小事,但我不知道它是什么。还有其他 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;
}
Run Code Online (Sandbox Code Playgroud)
配置文件: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
Run Code Online (Sandbox Code Playgroud)
正如我所说,我已经改变了它并尝试了很多事情:
监听器 1883 192.168.0.144 监听器 1883 0.0.0.0 监听器 1883
以上都不是。只是将其留空。他们都没有工作。
我将其作为答案发布,以便我可以提供更多详细信息,以防将来有人偶然发现这一点。
在 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
Run Code Online (Sandbox Code Playgroud)
第二步:打开1883端口并启动防火墙
sudo ufw allow 1883
sudo ufw enable
Run Code Online (Sandbox Code Playgroud)
第 3 步:验证 Mosquitto 尚未运行
pgrep mosquitto
Run Code Online (Sandbox Code Playgroud)
[注意,如果显示任何数字,那就是已经运行的 Mosquitto 的 PID。你可以杀掉它。另外,您可以尝试:sudo service mosquitto stop ]
第 4 步:使用详细选项启动 Mosquitto
mosquitto -v
Run Code Online (Sandbox Code Playgroud)
[注意:这将在不使用任何配置文件的情况下启动 Mosquitto。它将连接和状态信息回显到屏幕上。最容易快速调试。]
步骤 5:使用本地主机检查连接
转到您的客户端计算机(在我的例子中是 Windows 10 笔记本电脑)并运行 MQTT 客户端,连接到 Linux Mosquitto 服务器的本地地址(在我的例子中是 192.168.0.144)。您应该能够连接。事实上,您甚至可以在打开防火墙之前执行此步骤,因为这一切都在本地网络上,此时防火墙规则无关紧要。直到下一步...
第 6 步:使用 Web 工具检查连接性
使用:www.yougetsignal.com/tools/open-ports/ 或 https://canyouseeme.org/
[注意:除非 mosquitto broker 正在运行,否则您不会获得OPEN状态]
第 7 步:如果从互联网(即不是本地主机)进入时端口显示已关闭
这就是我被绊倒的地方。就我而言,我有一个 Verizon 调制解调器,它也有一个防火墙(因为它有一个路由器)。我有自己的无线路由器,即 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 说明进行操作。
希望这可以节省一些人的时间!