热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MQTT通讯协议之MQTTnet

文章目录一、MQTT的概念二、MQTT应用场景三、MQTT的通信过程四、MQTT代码实现一、MQTT的概念MQTT协议的全称是MessageQueuingTelemetryTra


文章目录

      • 一、MQTT的概念
      • 二、MQTT应用场景
      • 三、MQTT的通信过程
      • 四、MQTT代码实现


一、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代码实现


  • 条件

    • JDK

    • MQTT服务端

      • 下载地址
        链接:https://pan.baidu.com/s/1uRBLZjkbS0OVbyM6lA9LnQ
        提取码:umt3
    • 客户端代码

  • 服务端安装

    • 执行命令

      #进入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();


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
author-avatar
水儿本人_164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有