我是靠谱客的博主 无聊大地,最近开发中收集的这篇文章主要介绍C# 使用MQTTnet实现MQTT通信,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

   MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。例如,它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器

特点

  • 开放消息协议,简单易实现
  • 发布订阅模式,一对多消息发布
  • 基于TCP/IP网络连接,提供有序,无损,双向连接。
  • 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
  • 消息QoS支持,可靠传输保证

应用

MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

  • 物联网M2M通信,物联网大数据采集
  • Android消息推送,WEB消息推送
  • 移动即时消息,例如Facebook Messenger
  • 智能硬件、智能家具、智能电器
  • 车联网通信,电动车站桩采集
  • 智慧城市、远程医疗、远程教育
  • 电力、石油与能源等行业市场

C#程序实现

MQTnet库

MQTTnet 是一个用于基于 MQTT 的通信的高性能 .NET 库。它提供 MQTT 客户机和 MQTT 服务器(代理),并支持版本 5 之前的 MQTT 协议。

常规

  • 异步支持
  • 客户端和服务器(但不是 UWP 服务器)的 TLS 支持
  • 可扩展的通信通道(例如内存中、TCP、TCP+TLS、WS)
  • 轻量级(只有MQTT的低级实现,没有开销)
  • 性能优化(每秒处理约 150,000 条消息)*
  • 跨所有受支持的 MQTT 协议版本的统一 API
  • 访问内部跟踪消息
  • 单元测试(约 636 次测试)
  • 无外部依赖关系
    在本地机器(英特尔 i7 8700K)上测试,MQTTnet 客户端和服务器使用 TCP 通道在同一进程中运行。用于验证的应用程序是此存储库的一部分,并存储在/Tests/MQTTnet.TestApp.NetCore中。

客户

  • 支持通过 TCP (+TLS) 或 WS (WebSocket) 进行通信
  • 包含内核低级别MqttClient,具有低级别功能
  • 还包括 ManagedMqttClient,它会自动维护连接和订阅。此外,应用程序消息会自动排队并重新安排为更高的 QoS 级别。
  • Rx 支持(通过另一个项目)
  • 与 Microsoft Azure IoT Hub 兼容

服务器(代理)

  • 可用连接的客户端列表
  • 支持同时使用不同协议版本的连接客户端
  • 能够发布自己的消息(无需环回客户端)
  • 能够接收每条消息(无需环回客户端)
  • 可扩展的客户端凭据验证
  • 支持保留的消息,包括通过接口方法持久保存(需要自己的实现)
  • 支持 WebSockets(通过 ASP.NET Core 2.0,单独的 nuget)
  • 可以添加自定义消息拦截器,允许转换或扩展每个收到的应用程序消息
  • 验证订阅并拒绝订阅某些主题,具体取决于请求客户端
  • 同时连接具有不同协议版本的客户端。

支持的框架

框架版本
.NET5.0+
.NET Framework4.5.2+
.NET 标准1.3+
.NET Core1.1+
.NET Core App1.1+
5.2+
断续器10.0.10240+
Xamarin.Android7.5+
Xamarin.iOS10.14+
Blazor WebAssembly3.2.0+

服务端代码实现

 public static async void MqttServer()
        {
            var optionBuilder = new MqttServerOptionsBuilder()
                .WithDefaultEndpointBoundIPAddress(IPAddress.Parse("192.168.0.2"))
                .WithDefaultEndpointPort(1883)
                .WithConnectionBacklog(1000)
                .WithConnectionValidator(c =>
                {
                    if (c.ClientId.Length < 10)
                    {
                        c.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
                        return;
                    }

                    if (c.Username != "admin") //用户名
                    {
                        c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
                        return;
                    }

                    if (c.Password != "public") //密码
                    {

                        c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
                        return;
                    }

                    Console.WriteLine($"{c.ClientId}连接成功!");
                    c.ReasonCode = MqttConnectReasonCode.Success;
                }).Build();
            _mqttServer = new MqttFactory().CreateMqttServer();

            //客户端接入
            _mqttServer.UseClientConnectedHandler(ClientConnected);

            //客户端断开
            _mqttServer.UseClientDisconnectedHandler(ClientDisconnected);

            //主题消息
            _mqttServer.UseApplicationMessageReceivedHandler(ApplicationMessageReceived);

            //主题订阅需要实现IMqttServerClientSubscribedTopicHandler
            _mqttServer.ClientSubscribedTopicHandler =new ClientSubscribedTopic();

            //启动监听需要实现IMqttServerStartedHandler
            _mqttServer.StartedHandler = new ServerStarteOrStopped();
            //停止监听 IMqttServerStoppedHandler
            _mqttServer.StoppedHandler = new ServerStarteOrStopped();
            //服务启动
            await _mqttServer.StartAsync(optionBuilder);
        }

客户端代码实现

public static async  void Client()
        {
            var options = new MqttClientOptions();

            options.ClientId = Guid.NewGuid().ToString().Replace("-", "").ToUpper();

            //设置服务器地址与端口
            options.ChannelOptions = new MqttClientTcpOptions()
            {

                Server = "192.168.0.2",
                Port = 1883
            };
            //设置账号与密码
            options.Credentials = new MqttClientCredentials()
            {
                Username = "admin",
                Password = Encoding.Default.GetBytes("public")
            };
            options.CleanSession = true;

            //保持期
            options.KeepAlivePeriod = TimeSpan.FromSeconds(100.5);

            //构建客户端对象
            _mqttClient = new MqttFactory().CreateMqttClient() as MqttClient;

            try
            {
                //绑定消息接收方法
                _mqttClient.UseApplicationMessageReceivedHandler(ApplicationMessageReceivedHandler);

                //绑定连接成功状态接收方法
                _mqttClient.UseConnectedHandler(ConnectedHandler);

                //绑定连接断开状态接收方法
                _mqttClient.UseDisconnectedHandler(DisconnectedHandler);

                //启动连接
                await _mqttClient.ConnectAsync(options);

                //订阅消息
                await _mqttClient.SubscribeAsync(
                    new MqttTopicFilter[] { //订阅消息集合
                        new MqttTopicFilter() //订阅消息对象
                        { 
                            Topic = "123",  //订阅消息主题
                            QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce  //消息类型
                        }
                    });
            }
            catch
            {
                Console.WriteLine($"连接失败");
            }
        }

Demo下载地址:https://download.csdn.net/download/herees/85160530

最后

以上就是无聊大地为你收集整理的C# 使用MQTTnet实现MQTT通信的全部内容,希望文章能够帮你解决C# 使用MQTTnet实现MQTT通信所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部