MqttNet包使用汇总(C#)

Mqtt客户端:

1. 启动客户端

IMqttClient client = new MqttFactory().CreateMqttClient();
var build = new MqttClientOptionsBuilder()
    .WithClientId(model.ClientId)       //客户端标识
    .WithCredentials("test","1234")     //用户名+密码
    .WithTcpServer("192.168.0.1", "8080")       //ip+端口,也可以是域名
await client.ConnectAsync(build.Build());

2. 接收消息

方式1

client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MessageRecevicedHandler);
private void MessageRecevicedHandler(MqttApplicationMessageReceivedEventArgs obj)
{
            //Console.WriteLine($"主题:{obj.ApplicationMessage.Topic}");
            //Console.WriteLine($"消息:{Encoding.UTF8.GetString(obj.ApplicationMessage.Payload)}");
    Task.Run(()=> {
        onMessageReviced(obj.ApplicationMessage.Topic,
        Encoding.UTF8.GetString(obj.ApplicationMessage.Payload));
    });
}

方式2

client.UseApplicationMessageReceivedHandler(args=> {
   Console.WriteLine("===================================================");
   Console.WriteLine("收到消息:");
   Console.WriteLine($"主题:{args.ApplicationMessage.Topic}");
   Console.WriteLine($"消息:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}");
   Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++");
   Console.WriteLine();
});

3. MQTT刚连上时的操作

方式1

client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(ConnectedHandler);
private void ConnectedHandler(MqttClientConnectedEventArgs obj)
{
    Console.WriteLine("Mqtt连接成功");
}

方式2

client.UseConnectedHandler(args=> {
    Console.WriteLine("Mqtt连接成功");
});

4. MQTT断开后的操作

方式1

client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(DisconnectedHandlerAsync);
private async Task DisconnectedHandlerAsync(MqttClientDisconnectedEventArgs obj)
{
    Console.WriteLine("连接已断开,尝试重连中...");
    await client.ReconnectAsync(); //重连
}

方式2

client.UseDisconnectedHandler(args =>
{
    Console.WriteLine("本客户端已经断开连接");
    Console.WriteLine();
    try
    {
        client.ConnectAsync(options).GetAwaiter().GetResult();
    }
    catch (Exception)
    {
        Console.WriteLine("重连失败");
    }
});

5. 发布

public void publish(string topic, string context)
{
    if (string.IsNullOrEmpty(topic))
    {
        throw new Exception("发布主题不能为空!");
    }
    var message = new MqttApplicationMessageBuilder()
        .WithTopic(topic)
        .WithPayload(context)
        .WithAtMostOnceQoS()
        .Build();
    client.PublishAsync(message);
}

6. 订阅

方式1

client.SubscribeAsync("主题名称").GetAwaiter().GetResult();

方式2

List<MqttTopicFilter> Topics = new List<MqttTopicFilter>();
Topics.Add(new MqttTopicFilter() { Topic= "主题名称A", QualityOfServiceLevel= MqttQualityOfServiceLevel.ExactlyOnce});
Topics.Add(new MqttTopicFilter() { Topic = "主题名称B" });
Topics.Add(new MqttTopicFilter() { Topic = "主题名称C" });
client.SubscribeAsync(Topics.ToArray()).GetAwaiter().GetResult(); //核心语句

方式3

MqttClientSubscribeOptionsBuilder builder = new MqttClientSubscribeOptionsBuilder();
builder.WithTopicFilter("AAA");
client.SubscribeAsync(builder.Build()).GetAwaiter().GetResult();

Mqtt服务端:

1. 启动服务端

IMqttServer server = new MqttFactory().CreateMqttServer();
MqttServerOptionsBuilder serverOptions = new MqttServerOptionsBuilder();
serverOptions.WithDefaultEndpointPort(8080);
serverOptions.WithConnectionValidator(client => {
    string Account = client.Username;       //用户名
    string PassWord = client.Password;      //密码
    string clientid = client.ClientId;      //客户端标识
    if (Account == "test" && PassWord == "1234")
    {
        client.ReasonCode = MqttConnectReasonCode.Success;
        Console.WriteLine("校验成功");
    }
    else
    {
        client.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
        Console.WriteLine("校验失败");
    }
 });
await server.StartAsync(serverOptions.Build());

2. MQTT刚启动时的操作

server.StartedHandler = new MqttServerStartedHandlerDelegate(StartedHandler);
private void StartedHandler(EventArgs obj)
{
   Console.WriteLine($"程序已经启动!监听端口为:{model.Port}");
}

3. MQTT停止时的操作

server.StoppedHandler = new MqttServerStoppedHandlerDelegate(StoppedHandler);
private void StoppedHandler(EventArgs obj)
{
   Console.WriteLine("程序已经关闭");
}

4. 客户端连接事件

方式1

server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(ClientConnectedHandler);
private void ClientConnectedHandler(MqttServerClientConnectedEventArgs obj)
{
   Console.WriteLine($"{args.ClientId}此客户端已经连接到服务器");
}

方式2

server.UseClientConnectedHandler(args =>
{
   Console.WriteLine($"{args.ClientId}此客户端已经连接到服务器");
});

5. 客户端断开事件

方式1

server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(ClientDisconnectedHandler);
private void ClientDisconnectedHandler(MqttServerClientDisconnectedEventArgs obj)
{
   Console.WriteLine($"断开连接的客户端:{obj.ClientId}");
   Console.WriteLine($"断开连接类型:{obj.DisconnectType.ToString()}"); 
}

方式2

server.UseClientDisconnectedHandler(args => {
   Console.WriteLine($"断开连接的客户端:{args.ClientId}");
   Console.WriteLine($"断开连接类型:{args.DisconnectType.ToString()}");
});

6. 监听消息

方式1

server.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MessageReceivedHandler);
private void MessageReceivedHandler(MqttApplicationMessageReceivedEventArgs obj)
{
  Console.WriteLine("===================================================");
  Console.WriteLine("收到消息:");
  Console.WriteLine($"客户端:{obj.ClientId}");
  Console.WriteLine($"主题:{obj.ApplicationMessage.Topic}");
  Console.WriteLine($"消息:{Encoding.UTF8.GetString(obj.ApplicationMessage.Payload)}");
  Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++");
  Console.WriteLine();
}

方式2

server.UseApplicationMessageReceivedHandler(args=>{
     Console.WriteLine("===================================================");
     Console.WriteLine("收到消息:");
     Console.WriteLine($"客户端:{args.ClientId}");
     Console.WriteLine($"主题:{args.ApplicationMessage.Topic}");
     Console.WriteLine($"消息:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}");
     Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++");
     Console.WriteLine();
});

7. 客户端主题管理事件

订阅

server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(ClientSubscribedTopicHandler);
private void ClientSubscribedTopicHandler(MqttServerClientSubscribedTopicEventArgs obj)
{
   Console.WriteLine($"客户端:{obj.ClientId}");
   Console.WriteLine($"订阅主题:{obj.TopicFilter.Topic}");
}

取消订阅

server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(ClientUnsubscribedTopicHandler);
private void ClientUnsubscribedTopicHandler(MqttServerClientUnsubscribedTopicEventArgs obj)
{
   Console.WriteLine($"客户端:{obj.ClientId}");
   Console.WriteLine($"取消订阅主题:{obj.TopicFilter}");
}

8. 关闭MQTT服务器

public async Task StopAsync()
{
   if (server != null)
  {
     if (server.IsStarted)
     {
        await server.StopAsync();
        server.Dispose();
     }
  }
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值