C#MQTT编程01--MQTT介绍

1、前言

        近年来物联网的发展如火如荼已经渗透到我们生活的方方面面。从智能家居到工业自动化从智慧城市到智慧农业物联网,正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视,这就是物联网在智能家居领域的应用,如果在10年前看到这种设备的应用肯定觉得很牛批,而现在只要是个设备都能上云这种家电设备的远程控制,已经成了大家习以为常的配置了。而在工业领域物联网技术可以帮助企业实现自动化生产、设备监控和预防性维护提高生产效率和产品质量。在智慧城市建设中物联网技术可以用于交通管理、环境监测和公共安全等方面提升城市管理和居民生活的质量。 在物联网、工业互联网,智慧城市,智能家居、智能设备、移动应用等方面的广泛应用,就离开不MQTT协议。

2、MQTT协议简介

        通信协议MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,被广泛应用于物联网和分布式系统中。它以其简单、可靠和高效的特性而备受推崇,成为连接设备和应用程序的首选协议。MQTT的重要性不言而喻,它为实时通信提供了可靠的解决方案,使得设备之间的数据交换和控制变得更加便捷。 MQTT广泛应用于工业物联网、智能家居、各类智能制造或各类自动化场景等。MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,它具有以下主要特性:

1. 发布/订阅模式:MQTT采用发布/订阅模式,其中消息发布者(Publisher)将消息发布到特定的主题(Topic),而订阅者(Subscriber)通过订阅特定的主题来接收消息。

2. 主题(Topic):主题是MQTT消息的分类标识,类似于消息的目的地。发布者将消息发布到特定的主题,而订阅者通过订阅特定的主题来接收与该主题相关的消息。

3. 消息质量等级(QoS):MQTT定义了三个消息质量等级:QoS 0(最多一次)、QoS 1(至少一次)和QoS 2(只有一次)。发布者和订阅者可以根据需求选择适当的QoS级别。

4. 保留消息(Retained Message):发布者可以选择发布一个保留消息,该消息将被存储在MQTT代理服务器上,并在有订阅者订阅该主题时发送给订阅者。

5. 遗嘱消息(Will Message):发布者可以设置一个遗嘱消息,当发布者异常断开连接时,MQTT代理服务器会将遗嘱消息发送给订阅者。

6. 连接和会话:MQTT客户端通过与MQTT代理服务器建立连接来进行通信。客户端可以选择保持连接以维护会话状态,并在重新连接时恢复之前的会话。

7. 低带宽和资源消耗:MQTT协议设计为轻量级,具有较低的带宽和资源消耗。它适用于低带宽和不稳定的网络环境,如物联网设备和传感器网络。

       
     MQTT是IBM开发的即时通讯协议,物联网通信的主流协议之一。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和制动器的通信协议。MQTT协议的底层是基于TCP/IP协议。 

       以下几张图说明MQTT的角色地位: 

 

3、MQTT协议原理 

实现MQTT协议需要客户端和服务器端通讯完成,也就是说它是一种客户端/服务器模型,即CS模型,在通信过程中,一个是服务器,一个是客户端,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者,也就是说客户端可以是订阅者,也可以是发布者,MQTT传输的消息分为:主题(Topic)和负载(Payload)两部分:

Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload),服务器会将消息发送给订阅所匹配标签的每个客户端。
Payload,可以理解为消息的内容,是指订阅者具体想要的内容。

MQTT会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输,当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(QoS)和主题名(Topic)相关连。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,那么作为客户端可以:

  • 发布其他客户端订阅的信息;
  • 订阅其它客户端发布的消息;
  • 退订或删除应用程序的消息;
  • 断开与服务器连接。

MQTT服务器以称为"消息代理"(Broker),可以是一个应用程序或一台设备。它位于消息发布者和订阅者之间,它可以:

  • 接受来自客户的网络连接;
  • 接受客户发布的应用信息;
  • 处理来自客户端的订阅和退订请求;
  • 向订阅的客户转发应用程序消息。

 它们的组成示意图:

发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立直接的联系也不需要知道对方的存在。

MQTT发布/订阅模式的精髓在于由一个被称为代理(Broker)的中间角色负责所有消息的路由和分发工作,发布者将带有主题的消息发送给代理,订阅者则向代理订阅主题来接收感兴趣的消息。

  • 发布者(Publisher)

负责将消息发布到主题上,发布者一次只能向一个主题发送数据,发布者发布消息时也无需关心订阅者是否在线。

  • 订阅者(Subscriber)

订阅者通过订阅主题接收消息,且可一次订阅多个主题。MQTT还支持通过共享订阅的方式在多个订阅者之间实现订阅的负载均衡。

  • 代理(Broker)

负责接收发布者的消息,并将消息转发至符合条件的订阅者。另外,代理也需要负责处理客户端发起的连接、断开连接、订阅、取消订阅等请求。

4、MQTT协议结构

在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。

固定头(Fixed header):存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
可变头(Variable header):存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
消息体(Payload):存在于部分MQTT数据包中,表示客户端收到的具体内容。

本系列博客文章就以C#作为开发语言,一步步紧致如初地分析MQTT协议,以实现应用层软件开发,让屌丝逆袭飞起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美解决报错Please verify that the package.json has a valid “main“ entry处理方法

出现下图中的错误 ,说明缺少main入口 解决方法: 1.删除 node_modules 和 package-lock.json这两个文件 2.命令行输入npm i 会重新下载包 3.重新执行检查没有报错

01循环算法

1.求小数点的某一位&#xff0c;且超出float和double的精度问题 【题目描述】 分数a/b化为小数后&#xff0c;小数点后第n位的数字是多少&#xff1f; 【输入】 三个正整数a&#xff0c;b&#xff0c;n&#xff0c;相邻两个数之间用单个空格隔开。0<a<b<100&#…

【微信小程序独立开发2】授权登录 上

前言&#xff1a;这一节设想完成的功能为进入小程序后请求授权信息&#xff0c;用户授权登录后&#xff0c;弹出宠物登记页面&#xff0c;并根据宠物类型播放背景音乐 小程序昵称头像在之前的版本获取规则为触发后弹出用户授权弹窗&#xff0c;授权后可直接获取用户头像和昵称&…

使用 CMake 和 Ninja 构建 C/C++ 项目的教程

使用 CMake 和 Ninja 构建 C/C 项目的教程 CMake 是一个跨平台的开源构建工具&#xff0c;它简化了项目的构建过程。而 Ninja 是一个快速、轻量级的构建系统&#xff0c;与 CMake 配合使用可以提高项目的构建效率。本教程将向你介绍如何使用 CMake 和 Ninja 来构建你的 C/C 项…

金融科技革命:数字化如何塑造未来经济_光点科技

当今世界&#xff0c;数字化不仅是一种趋势&#xff0c;更是深刻重塑经济和金融领域的关键力量。在这个过程中&#xff0c;金融科技&#xff08;FinTech&#xff09;崭露头角&#xff0c;成为革命性变化的代名词。以下是数字化技术在经济和金融领域的几个关键应用&#xff0c;它…

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

高度自适应scroll-view,uniapp项目

中间粉红的区域高度自适应,不管换什么机型&#xff0c;高度都自适应 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><te…

HTML5+CSS3+JS小实例:音频可视化

实例:音频可视化 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><m…

C++学习笔记——私有继承、多重继承、类模板

目录 一、私有继承 二、多重继承 三、类模板 四、一个使用私有继承的示例代码 4.1代码 4.2输出结果 五、多重继承案列 六、类模板案例 C中的继承和模板是非常强大和灵活的特性&#xff0c;它们可以帮助我们实现代码复用、抽象和泛化等目标。本文将着重介绍私有继承、多…

class_1:qt的安装及基本使用方式

一、选择组件&#xff1a; 1、windows编译工具&#xff1a;MinGW 7.30 32-bit MinGW 7.30 64-bit 2、QT源代码&#xff1a;sources 3、QT的绘图模块&#xff1a;QT charts 4、QT虚拟键盘&#xff1a;QT Virtual Keyboard 5、QT Creational 4.12.2 GDB 二、新建QT项目 文…

Linux完全卸载Anaconda3和MiniConda3

如何安装Anaconda3和MiniConda3请看这篇文章&#xff1a; 安装Anaconda3和MiniConda3_minianaconda3-CSDN博客文章浏览阅读474次。MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&…

高通平台开发系列讲解(USB篇)adb function代码分析

文章目录 一、FFS相关动态打印二、代码入口三、ffs_alloc_inst四、ep0、ep1&ep2的注册五、读写过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB adb function代码f_fs.c。 一、FFS相关动态打印 目录:msm-4.14/drivers/usb/gadget/fun…

docker+jmeter实现windows作为主控机,linux作为负载机的分布式压测环境搭建

dockerjmeter实现windows作为主控机&#xff0c;linux作为负载机的分布式压测环境搭建 1、搭建环境说明2、windows主控机安装Jmeter3、linux负载机安装Jmeter3.1、安装docker环境3.2、使用docker安装jmeter 4、windows主控机分发测试任务 1、搭建环境说明 准备一台windows主机…

时间序列数据库选型: influxdb; netdiscover列出docker实例们的ip,docker管理工具lazydocker、scope

influxdb influxdb: 有收费版本、有开源版本 influxdb 安装、启动(docker) docker run -itd --name influxdb-dev -p 8086:8086 influxdb #influxdb的web客户端(端口8003)被去掉了 #8006是web-service端口#docker exec -it influxdb-dev bashinfluxdb 自带web界面 从后面的…

Rust-函数

简介 Rust的函数使用关键字fn开头。 函数可以有一系列的输入参数&#xff0c;还有一个返回类型。 函数体包含一系列的语句(或者表达式)。 函数返回可以使用return语句&#xff0c;也可以使用表达式。 Rust编写的可执行程序的入口就是fn main()函数。 以下是一个函数的示例…

代码随想录算法训练营第四天 |24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题02.07.链表相交,142、环形链表II

链表基础 1、链表定义&#xff1a; &#xff08;1&#xff09;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null…

C++核心编程——文件操作

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

ROS无人机开发常见错误

一. Ubuntu 相关 1、SSH远程连接报错 解决方案&#xff1a;终端运行上述图中选中部分&#xff0c;更新一下即可 第一步&#xff1a; 第二步&#xff1a;根据提示输入yes后输入密码即可 第三步&#xff1a;成功后如下图所示 2、解决“E 无法获得锁/ var/lib/apt/lists/ (11 资…

Altium Desigenr 孔 规则修改2

1、过孔修改 在这里插入图片描述 2、物理孔

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator 线性控制器设计-轨迹跟踪&#xff08;Fellow a Desired Path&#xff09;