使用MQTTnet搭建Mqtt服务器

官方介绍:

MQTTnet

MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker). The implementation is based on the documentation from http://mqtt.org/.

Features

General

  • Async support
  • TLS 1.2 support for client and server (but not UWP servers)
  • Extensible communication channels (i.e. In-Memory, TCP, TCP+TLS, WS)
  • Lightweight (only the low level implementation of MQTT, no overhead)
  • Performance optimized (processing ~70.000 messages / second)*
  • Interfaces included for mocking and testing
  • Access to internal trace messages
  • Unit tested (~90 tests)

* Tested on local machine (Intel i7 8700K) with MQTTnet client and server running in the same process using the TCP channel. The app for verification is part of this repository and stored in /Tests/MQTTnet.TestApp.NetCore.

Client

  • Communication via TCP (+TLS) or WS (WebSocket) supported
  • Included core MqttClient with low level functionality
  • Also included ManagedMqttClient which maintains the connection and subscriptions automatically. Also application messages are queued and re-scheduled for higher QoS levels automatically.
  • Rx support (via another project)
  • Compatible with Microsoft Azure IoT Hub

Server (broker)

  • List of connected clients available
  • Supports connected clients with different protocol versions at the same time
  • Able to publish its own messages (no loopback client required)
  • Able to receive every message (no loopback client required)
  • Extensible client credential validation
  • Retained messages are supported including persisting via interface methods (own implementation required)
  • WebSockets supported (via ASP.NET Core 2.0, separate nuget)
  • A custom message interceptor can be added which allows transforming or extending every received application message
  • Validate subscriptions and deny subscribing of certain topics depending on requesting clients

Supported frameworks

  • .NET Standard 1.3+
  • .NET Core 1.1+
  • .NET Core App 1.1+
  • .NET Framework 4.5.2+ (x86, x64, AnyCPU)
  • Mono 5.2+
  • Universal Windows Platform (UWP) 10.0.10240+ (x86, x64, ARM, AnyCPU, Windows 10 IoT Core)
  • Xamarin.Android 7.5+
  • Xamarin.iOS 10.14+

Supported MQTT versions

  • 5.0.0 (planned)
  • 3.1.1
  • 3.1.0

Nuget

This library is available as a nuget package: https://www.nuget.org/packages/MQTTnet/

 

创建项目 

使用vs创建mqtt项目,选择winform项目,方便创建界面,查看相关数据信息。项目包括两个,server和client。

 服务器端界面结构如下:

Server在程序中添加本机IP:

var ips = Dns.GetHostAddressesAsync(Dns.GetHostName());

foreach (var ip in ips.Result)
{
    switch (ip.AddressFamily)
    {
        case AddressFamily.InterNetwork:
           TxbServer.Text = ip.ToString();
           break;
        case AddressFamily.InterNetworkV6:
           break;
     }
}

 添加一个Action ,用来想listbox中添加数据:

private Action<string> _updateListBoxAction;


//在load方法中定义
//超过1000条数据时,自动删除第一个
//出现滚动条时,滚动条自动向下移动
_updateListBoxAction = new Action<string>((s) =>
{
    listBox1.Items.Add(s);
    if (listBox1.Items.Count > 1000)
    {
        listBox1.Items.RemoveAt(0);
    }
    var visibleItems = listBox1.ClientRectangle.Height/listBox1.ItemHeight;

    listBox1.TopIndex = listBox1.Items.Count - visibleItems + 1;
});


//添加按键事件,按c时清空listbox
listBox1.KeyPress += (o, args) =>
{
    if (args.KeyChar == 'c' || args.KeyChar=='C')
    {
         listBox1.Items.Clear();
    }
};

 mqttserver

        private async void MqttServer()
        {
            if (null != _mqttServer)
            {
                return;
            }

            var optionBuilder =
                new MqttServerOptionsBuilder().WithConnectionBacklog(1000).WithDefaultEndpointPort(Convert.ToInt32(TxbPort.Text));

            if (!TxbServer.Text.IsNullOrEmpty())
            {
                optionBuilder.WithDefaultEndpointBoundIPAddress(IPAddress.Parse(TxbServer.Text));
            }
            
            var options = optionBuilder.Build();
            
            
            (options as MqttServerOptions).ConnectionValidator += context =>
            {
                if (context.ClientId.Length < 10)
                {
                    context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
                    return;
                }
                if (!context.Username.Equals("admin"))
                {
                    context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                    return;
                }
                if (!context.Password.Equals("public"))
                {
                    context.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
                    return;
                }
                context.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
                
            };
            

            _mqttServer = new MqttFactory().CreateMqttServer();
            _mqttServer.ClientConnected += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, $">Client Connected:ClientId:{args.ClientId},ProtocalVersion:");

                var s = _mqttServer.GetClientSessionsStatusAsync();
                label3.BeginInvoke(new Action(() => { label3.Text = $"连接总数:{s.Result.Count}"; }));
            };

            _mqttServer.ClientDisconnected += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, $"<Client DisConnected:ClientId:{args.ClientId}");
                var s = _mqttServer.GetClientSessionsStatusAsync();
                label3.BeginInvoke(new Action(() => { label3.Text = $"连接总数:{s.Result.Count}"; }));
            };

            _mqttServer.ApplicationMessageReceived += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction,
                    $"ClientId:{args.ClientId} Topic:{args.ApplicationMessage.Topic} Payload:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)} QualityOfServiceLevel:{args.ApplicationMessage.QualityOfServiceLevel}");

            };

            _mqttServer.ClientSubscribedTopic += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, $"@ClientSubscribedTopic ClientId:{args.ClientId} Topic:{args.TopicFilter.Topic} QualityOfServiceLevel:{args.TopicFilter.QualityOfServiceLevel}");
            };
            _mqttServer.ClientUnsubscribedTopic += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, $"%ClientUnsubscribedTopic ClientId:{args.ClientId} Topic:{args.TopicFilter.Length}");
            };

            _mqttServer.Started += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, "Mqtt Server Start...");
            };

            _mqttServer.Stopped += (sender, args) =>
            {
                listBox1.BeginInvoke(_updateListBoxAction, "Mqtt Server Stop...");
                
            };

            await _mqttServer.StartAsync(options);
        }

把mqttserver中定义的事件都进行了绑定

(options as MqttServerOptions).ConnectionValidator 为进行mqttclient连接时进行的验证工作

 

想要查看完整代码,请移步到gitee

https://gitee.com/sesametech-group/MqttNetSln

你感觉文章还可以,移步到gitee上给个star


  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: MQTT(Message Queue Telemetry Transport)是一种轻量级的消息协议,它特别适用于低带宽和不稳定的网络环境下的物联网(IoT)设备。 如果想要搭建一个MQTT服务器,通常有两种方案,一种是使用现成的第三方云服务,如AWS IoT、Microsoft Azure IoT Hub、Google Cloud IoT Core等。另一种是自己搭建一个MQTT服务器,这里介绍一下如何在.net core中搭建MQTT服务器。 首先,需要安装MQTT服务端库,可以使用M2Mqtt库,它提供了MQTT客户端和服务端的实现。通过.NET Core SDK中的NuGet包管理器,可以很容易下载安装。 其次,在.net core中编写MQTT服务器代码。需要创建一个控制台应用程序,并添加M2Mqtt库。然后,定义一个MQTT服务,创建一个MQTT服务实例并在其上注册需要监听的主题,定义接收到消息时的处理程序,将其注册到MQTT服务实例中。 最后,在MQTT服务器上运行上述代码。在成功构建和启动MQTT服务器后,可以使用MQTT客户端向该服务器连接并发布/订阅消息。 总之,MQTT服务器搭建比较简单,只需要下载安装MQTT服务端库,编写服务端代码,就可以完成自己的MQTT服务器搭建。通过MQTT服务器,可以实现物联网设备之间的通信和控制。 ### 回答2: MQTT是一种轻量级的、高效的、发布订阅模式的通讯协议,在物联网中得到广泛的应用。在.netcore环境中,我们可以使用MQTTnet库来实现MQTT服务器搭建。 1. 环境准备 在开始构建MQTT服务器之前,需要先安装.netcore和MQTTnet库。可以通过NuGet包管理器或在命令行中使用以下命令进行安装: ``` dotnet add package MQTTnet ``` 2. 实现MQTT服务器 在.NetCore中实现MQTT服务器,首先需要构建一个MQTT服务器对象。通过调用MQTTnet库的MqttFactory类来构造MqttServer对象: ``` var mqttServer = new MqttFactory().CreateMqttServer(); ``` 然后,我们需要实例化一个MqttServerOptions对象来指定MQTT服务器的配置参数,例如监听IP地址、端口号和SSL证书等。 ``` var mqttServerOptions = new MqttServerOptionsBuilder() .WithConnectionBacklog(100) .WithDefaultEndpointPort(1883) .Build(); ``` 在实例化MqttServer时,需要传入MqttServerOptions对象作为参数。 ``` var mqttServer = new MqttFactory().CreateMqttServer(); await mqttServer.StartAsync(mqttServerOptions); ``` 以上代码就完成了MQTT服务器的启动,就可以在指定的端口上接收来自客户端的连接消息和发布订阅消息。 3. 实现MQTT客户端 通过MQTTnet库,我们同样可以实现MQTT客户端的开发。在启动客户端时,需要指定MQTT服务器的IP地址和启用的端口号。 ``` var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer("localhost", 1883) .Build(); ``` 然后可以创建一个MqttClient对象,并使用ConnectAsync方法连接服务器。 ``` var mqttClient = new MqttFactory().CreateMqttClient(); var result = await mqttClient.ConnectAsync(mqttClientOptions); ``` 至此,我们已经实现了MQTT服务器和客户端的基本功能。 4. 实现发布订阅功能 在发布应用程序中,我们很少只是简单地传送一条消息给服务器,大多数情况下,客户端要发布并订阅一个或多个MQTT主题。有了这些主题,客户端就可以从MQTT服务器上接收到感兴趣的消息。 客户端可以通过SubscribeAsync()方法订阅一个或多个主题。 ``` await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build()); ``` 服务器可以通过PublishAsync()方法向客户端发送主题信息。 ``` await mqttServer.PublishAsync(new MqttApplicationMessageBuilder() .WithTopic("my/topic") .WithPayload("Hello World") .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce) .Build()); ``` 在构建MQTT服务器和客户端的时候,需要根据实际的应用场景来选择QoS级别、消息容错等参数,以达到最佳的性能和可靠性。 ### 回答3: MQTT(Message Queuing Telemetry Transport)是一个轻量级的ISO标准消息协议,主要用于物联网(IoT)中设备间的通信。搭建MQTT服务器可以提供稳定可靠的消息传递服务,方便设备之间的数据交互。本文将介绍如何使用.net core搭建MQTT服务器。 首先,我们需要使用NuGet包管理器安装MQTT服务器的核心库,可以在Visual Studio中右键选择项目,点击“Manage NuGet Packages”,在搜索框中搜索“MQTT Server”并安装。 接着,我们需要创建一个类来初始化MQTT服务及其选项。我们可以使用下面的代码: ```csharp using MQTTnet.Server; public static class MqttBroker { static MqttBroker() { var optionsBuilder = new MqttServerOptionsBuilder() .WithConnectionBacklog(100) .WithPersistentSessions() .WithDefaultEndpointPort(1883); var mqttServer = new MqttFactory().CreateMqttServer(); mqttServer.StartAsync(optionsBuilder.Build()); } } ``` 这个类会在初始化时启动MQTT服务,并使用默认端口号1883,同时启用持久会话及连接后向服务等待响应的最大连接数(Connection Backlog)为100,具体设置可以根据需求进行修改。 最后,在应用程序的主方法中调用上面的类以便启动MQTT服务。我们可以在一个控制台程序中这样做: ```csharp static void Main(string[] args) { MqttBroker.Start(); while (true) { } } ``` 这样就完成了MQTT服务器搭建,可以开始使用MQTT协议进行设备之间的通信了。 本文介绍了如何使用.net core搭建MQTT服务器,包括引入依赖项、初始化服务及启动MQTT服务的过程。使用MQTT协议可以方便地完成IoT设备之间的通信,为物联网中的设备提供更加稳定可靠的数据传输服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值