我是MQTT网的新手,我的程序需要一个MQTT代理来与第三方MQTT客户端交互,该客户端可能监听也可能不监听本地端口。如果是本地端口,我所需要做的就是根据我在网上找到的示例创建一个本地MQTT代理:
using MQTTnet;
using MQTTnet.Server;
using System.Net;
MqttServerOptionsBuilder options = new MqttServerOptionsBuilder()
.WithDefaultEndpoint()
.WithDefaultEndpointPort(1883); // I know this is the default, but if port number isn't 1883 I would specify it here
MqttServer mqttServer = new MqttFactory().CreateMqttServer(options.Build());
mqttServer.StartAsync().GetAwaiter();
Console.WriteLine("Press Enter to exit.");
Console.ReadLine();
这是有效的,没问题。
现在,我想让服务器连接到一个虚拟机,而不是本地连接,虚拟机的IP地址是10.100.10.100
。
我还没有找到足够清楚地解释我应该如何做到这一点的文档或教程,所以我做出了以下假设:
using MQTTnet;
using MQTTnet.Server;
using System.Net;
using System.Net.Security;
IPAddress ipAddress = new IPAddress(new byte[4] { 10, 100, 10, 100 });
RemoteCertificateValidationCallback callback = (message, cert, chain, sslPolicyErrors) =>
{
return true;
};
MqttServerOptionsBuilder options = new MqttServerOptionsBuilder()
.WithDefaultEndpointBoundIPAddress(new IPAddress(new byte[4] { 10, 100, 10, 100 }))
.WithRemoteCertificateValidationCallback(callback)
.WithDefaultEndpointPort(1883);
MqttServer mqttServer = new MqttFactory().CreateMqttServer(options.Build());
mqttServer.StartAsync().GetAwaiter();
Console.WriteLine("Press Enter to exit.");
Console.ReadLine();
这没用。如果我从100.10.100.10
本地运行程序,或者从另一台机器运行程序,则不会。当我使用命令行netstat -ab
浏览所有连接的列表时,在我指定的端口上没有任何连接。
所以我试着保持线路.WithDefaultEndpoint()
:
//...
MqttServerOptionsBuilder options = new MqttServerOptionsBuilder()
.WithDefaultEndpointBoundIPAddress(new IPAddress(new byte[4] { 10, 100, 10, 100 }))
.WithRemoteCertificateValidationCallback(callback)
.WithDefaultEndpoint()
.WithDefaultEndpointPort(1883);
//...
现在,至少它在从100.10.100.10
本地运行时可以工作(当然…(,但它仍然无法解决我最初试图从外部机器连接到端口的问题。
有什么想法吗?提前谢谢。
您没有。
您不能启动代理并将其绑定到另一台机器上的IP地址/端口。
通常情况下,经纪人不会连接,客户会连接到经纪人。
一个代理唯一会连接到另一个代理的时间是当它作为客户端并建立桥接时。