C# MQTTnet 3.1升级到MQTTnet 4.0 Client编程变化

26 篇文章 6 订阅

1、前言

        MQTTnet的C#版的开源MQTT通讯库,支持MQTT Server和Client,并提供各种类型的连接方法Demo。

       MQTTnet库3.1升级到4.0,并不完全兼容,在连接方式构建、事件订阅等方面需要修改。

2、MQTTnet 3.1 Client编程

using部分

using MQTTnet;
using MQTTnet.Client.Options;
using MQTTnet.Client;
using MQTTnet.Protocol;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Receiving;
using MQTTnet.Client.Publishing;
using MQTTnet.Exceptions;

连接与事件订阅

MqttClient mqttClient;

    private async Task MqttClientStart()
    {
        try
        {
            var mqttFactory = new MqttFactory();

            var options = new MqttClientOptions
            {
                ClientId = "clientid_pascalming",
                ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311,
                ChannelOptions = new MqttClientTcpOptions
                {
                    Server = "127.0.0.1",
                    Port = 1883
                },
            };
            if (options.ChannelOptions == null)
            {
                throw new InvalidOperationException();
            }

            options.Credentials = new MqttClientCredentials
            {
                Username = "mqttusername",
                Password = "mqttpassword"
            };
            options.CleanSession = false;
			//心跳检测时间,单位:秒
            options.KeepAlivePeriod = TimeSpan.FromSeconds(30);

            mqttClient = mqttFactory.CreateMqttClient() as MqttClient;
            mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnMqttClientConnected);
            mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnMqttClientDisConnected);
            mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived);
            await mqttClient.ConnectAsync(options);
            Console.WriteLine($"客户端[{options.ClientId}]尝试连接...");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"客户端尝试连接出错.>{ex.Message}");
        }
    }
	private async Task ClientStop()
    {
        try
        {
            if (mqttClient == null) return;
            await mqttClient.DisconnectAsync();
            mqttClient = null;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"客户端尝试断开Server出错. {ex.Message}");
        }
    }
    private void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs obj)
    {
        Console.WriteLine($"OnSubscriberMessageReceived..");
    }

    private void OnMqttClientDisConnected(MqttClientDisconnectedEventArgs obj)
    {
        Console.WriteLine($"Mqtt Client DisConnected.");
    }

    private void OnMqttClientConnected(MqttClientConnectedEventArgs obj)
    {
        Console.WriteLine($"Mqtt Client Connected.");
    }

发送数据

       //质量:AtMostOnce(0,最多一次)/AtLeastOnce(1,最少一次)/ExactlyOnce(2,只一次)
		string payload = "hello,from pascalming!";
		Task<MqttClientPublishResult> task = mqttClient.PublishAsync("/topic/pascalming/v1",payload,MqttQualityOfServiceLevel.AtLeastOnce,true);
        task.Wait();

3、MQTTnet 4.0 Client编程

using部分

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;

连接与事件订阅

private IMqttClient mqttClient;
private void MqttConnectAsync()
{
    try
    {
        mqttIsConnected = false;

        var mqttFactory = new MqttFactory();

        //使用Build构建
        var mqttClientOptions = new MqttClientOptionsBuilder()
            .WithTcpServer("127.0.0.1", 1883)
            .WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
            .WithClientId("clientid_pascalming")
            .WithCleanSession(false)
            .WithKeepAlivePeriod(TimeSpan.FromSeconds(30))
            .WithCredentials("user", "password")
            .Build();

        mqttClient = mqttFactory.CreateMqttClient();
        //与3.1对比,事件订阅名称和接口已经变化
        mqttClient.DisconnectedAsync += MqttClient_DisconnectedAsync;
        mqttClient.ConnectedAsync += MqttClient_ConnectedAsync;
        mqttClient.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync;
        Task task = mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
        task.Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Mqtt客户端尝试连接出错:{ex.Message}");
    }
}
private Task MqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
{
    return Task.CompletedTask;
}

private Task MqttClient_ConnectedAsync(MqttClientConnectedEventArgs arg)
{
    Console.WriteLine($"Mqtt客户端连接成功.");
    return Task.CompletedTask;
}

private Task MqttClient_DisconnectedAsync(MqttClientDisconnectedEventArgs arg)
{
    Console.WriteLine($"Mqtt客户端连接断开");
    return Task.CompletedTask;
}

发送数据

string payload = "hello,from pascalming!";
string mqttTopic="/topic/pascalming/v1";
var applicationMessage = new MqttApplicationMessageBuilder()
    .WithTopic(mqttTopic)
    .WithPayload(payload)
    .Build();
Task<MqttClientPublishResult> task = mqttClient.PublishAsync(applicationMessage);
task.Wait();

4、并发执行与短暂断开数据不丢失处理

       客户端上报数据,上面的示例使用的是等待执行模式,也可以改为异步执行提高并发度。数据的计数需要使用安全的Interlocked.Increment和Interlocked.Increment执行。

      数据上报后只有两种情况:执行成功或出错,这个需要等待异步执行结果的反馈。这是可以用计数器控制发送数据、执行成功和出错的计数,并控制这个差值的窗口大小。

      上报出错的数据,需要保存,然后再次重连后重新上报。

5、参考资料

MQTTnet的Demo示例 dotnet/MQTTnet · GitHub

基于MQTTnet 3.0.12实现MQTT服务器和客户端

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用C#MQTT.NET库进行MQTT通信的示例程序: ```csharp using System; using System.Text; using System.Threading; using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Options; using MQTTnet.Extensions.ManagedClient; class Program { static async Task Main(string[] args) { var factory = new MqttFactory(); var mqttClient = factory.CreateMqttClient(); var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com", 1883) // 设置MQTT服务器地址和端口 .WithClientId("mqtt_client") // 设置客户端ID .Build(); mqttClient.UseConnectedHandler(async e => { Console.WriteLine("Connected to MQTT broker"); // 订阅主题 await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic("test/topic").Build()); // 发布消息 var message = new MqttApplicationMessageBuilder() .WithTopic("test/topic") .WithPayload("Hello MQTT") .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) .WithRetainFlag(false) .Build(); await mqttClient.PublishAsync(message); }); mqttClient.UseDisconnectedHandler(async e => { Console.WriteLine("Disconnected from MQTT broker"); await Task.Delay(TimeSpan.FromSeconds(5)); try { await mqttClient.ConnectAsync(options); } catch { Console.WriteLine("Reconnecting failed"); } }); await mqttClient.ConnectAsync(options); Console.ReadLine(); } } ``` 这个示例程序使用了MQTT.NET库来创建一个MQTT客户端,并连接到指定的MQTT服务器。在连接成功后,它订阅了一个名为"test/topic"的主题,并发布了一条消息到该主题。你可以根据需要修改服务器地址、端口、客户端ID、订阅的主题和发布的消息内容。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值