MQTT通讯协议之MQTTnet

一、MQTT的概念

  • MQTT 协议的全称是 Message Queuing Telemetry Transport,翻译为消息队列传输探测,它是 ISO 标准下的一种基于发布 - 订阅模式的消息协议,它是基于 TCP/IP 协议簇的,它是为了改善网络设备硬件的性能和网络的性能来设计的。

二、MQTT应用场景

  • MQTT 一般多用于 IoT 即物联网上,广泛应用于工业级别的应用场景,比如汽车、制造、石油、天然气等。

三、MQTT的通信过程

  • 角色
    • 客户端(Client)
      • 使用 MQTT 的程序或设备。客户端总是通过网络连接到服务端。它可以
        • 发布应用消息给其它相关的客户端。
        • 订阅以请求接受相关的应用消息
        • 取消订阅以移除接受应用消息的请求。
        • 从服务端断开连接。
    • 服务端(Server)
      • 一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
        • 接受来自客户端的网络连接
        • 接受客户端发布的应用消息
        • 处理客户端的订阅和取消订阅请求。
        • 转发应用消息给符合条件的客户端订阅。
    • 订阅(Subscription)
      • 订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话
        (Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器
  • 角色相关的术语
    • 主题名(Topic Name):
      附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
    • 主题过滤器(Topic Filter:):
      订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
    • 会话(Session):
      客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
    • 控制报文(MQTT Control Packet):
      通过网络连接发送的信息数据包。MQTT 规范定义了十四种不同类型的控制报文,其中一个(PUBLISH 报 文)用于传输应用消息。

四、MQTT代码实现

  • 条件

  • 服务端安装

    • 执行命令
        #进入bin文件,执行命令
          apollo.cmd create [文件夹名称]
        #进入新建文件夹下bin文件夹,在执行命令
          apollo-broker.cmd run
      
  • 客户端代码实现

    • nuget 安装包
       MQTTnet
      
    • 代码实现
      • 发布
            Console.WriteLine("---------------MQTT客户端 通信开始------------");
            //建立连接
             var  conn = new MqttFactory().CreateManagedMqttClient();
            IMqttClientOptions value = new MqttClientOptionsBuilder()
                .WithClientId("MQTTClie")
                .WithTcpServer("127.0.0.1",1883)
                .WithCredentials("admin","123456")
                .Build();  
            IManagedMqttClientOptions options = new ManagedMqttClientOptionsBuilder()
                .WithClientOptions(value)
                .Build(); 
            await conn.StartAsync(options); 
            
            //客户端发布 
            MqttApplicationMessage mqttApplicationMessage = new MqttApplicationMessageBuilder()
                .WithTopic("server")
                .WithPayload(Encoding.UTF8.GetBytes("Good Luck!"))
                .Build();
            await conn.PublishAsync(mqttApplicationMessage);
            Console.WriteLine("---------------MQTT客户端 通信结束------------");
            Console.ReadLine();          
        
      • 订阅
            Console.WriteLine("---------------MQTT客户端 通信开始------------");
            //建立连接
             var  conn = new MqttFactory().CreateManagedMqttClient();
            IMqttClientOptions value = new MqttClientOptionsBuilder()
                .WithClientId("MQTTClie")
                .WithTcpServer("127.0.0.1",1883)
                .WithCredentials("admin","123456")
                .Build();  
             //响应订阅主题
            conn.ApplicationMessageReceivedHandler
                = new MqttApplicationMessageReceivedHandlerDelegate(e => {
                    Console.WriteLine($"收到消息{e.ApplicationMessage.ConvertPayloadToString()},来自clientID{e.ClientId}");
                });
            IManagedMqttClientOptions options = new ManagedMqttClientOptionsBuilder()
                .WithClientOptions(value)
                .Build(); 
            await  conn.StartAsync(options);
            //订阅主题过滤器 
            MqttTopicFilter topicFilter = new MqttTopicFilterBuilder()
                //设置主题
                .WithTopic("server")
                //设置服务质量
                .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce)
                .Build();     
            await conn.SubscribeAsync(topicFilter); 
            Console.WriteLine("---------------MQTT客户端 通信结束------------");
            Console.ReadLine();             
        
      • 既是发布也是订阅
            Console.WriteLine("---------------MQTT客户端 通信开始------------");
            //建立连接
             var  conn = new MqttFactory().CreateManagedMqttClient();
            //响应订阅主题
            conn.ApplicationMessageReceivedHandler
                = new MqttApplicationMessageReceivedHandlerDelegate(e => {
                    Console.WriteLine($"收到消息{e.ApplicationMessage.ConvertPayloadToString()},来自clientID{e.ClientId}");
                });
            await Task.Delay(1000);
            IMqttClientOptions value = new MqttClientOptionsBuilder()
                .WithClientId("MQTTClie")
                .WithTcpServer("127.0.0.1",1883)
                .WithCredentials("admin","123456")
                .Build();  
            IManagedMqttClientOptions options = new ManagedMqttClientOptionsBuilder()
                .WithClientOptions(value)
                .Build(); 
            await  conn.StartAsync(options);
        
            //订阅主题
            MqttTopicFilter topicFilter = new MqttTopicFilterBuilder()
                //设置主题
                .WithTopic("server")
                //设置服务质量
                .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce)
                .Build();
             await conn.SubscribeAsync(topicFilter);
        
        
            //客户端发布 
            MqttApplicationMessage mqttApplicationMessage = new MqttApplicationMessageBuilder()
                .WithTopic("server")
                .WithPayload(Encoding.UTF8.GetBytes("Good Luck!"))
                .WithRetainFlag (true)  
                .Build();
            await conn.PublishAsync(mqttApplicationMessage);
            Console.WriteLine("---------------MQTT客户端 通信结束------------");
            Console.ReadLine();        
        
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值