IOT必备之MQTT结构分析,不进来看看?【后附源码】

全网唯一物联网MQTT协议报文

结构分析以及基于C#代码的报文组装实现

介绍

MQTT是一种基于TCP/IP协议的应用层协议,它规定了不同应用之间进行数据交换时的传送格式。既然是协议,理论上可以被任何开发语言实现它,以运行在任何平台,这个特性就可以将所有可联网的物品通过此协议的方式进行数据通信,这是其一,之所以被物联网所青睐,还因为它的几个主要的特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除耦合,各终端之间无关

2、对负载内容屏蔽的消息传输,可以对消息订阅者所接受到的内容有所屏蔽

3、具体有三种消息发布的服务质量(以后细说)

4、小型传输,开销小,固定长度的头部是 2 字节,协议交换最小化,以降低网络流量

5、使用Last Will和Testament特性通知有关各方客户端异常中断的机制

应用实现

为了更方便的抓包分析,进行了MQTT协议的服务端与客户端的应用实现

运行机制

服务端:通过云端一个服务器程序开启MQTT服务器(Broker),常见的如EMQ

客户端:不管是IoT管理应用程序还是IoT设备,都属性于客户端程序

订阅:各客户端程序如果想要接收到别人发送过来的数据,就需要订阅一个主题(Topic)

发布:任何客户端都可以根据一个主题向服务器发布消息,服务器会根据订立记录,将消息推送至订阅了对应主题的客户端

数据传输格式

MQTT报文大体上包含三大部分:固定报头、可变报头、报文载荷,整体结构如下

固定报头

第一个字节中高4位保存了消息的类型信息,包含1-14种类型(5.0版本扩充了第15个:认证交换)

1 CONNECT – 连接服务端

2 CONNACK – 确认连接请求

3 PUBLISH – 发布消息

4 PUBACK –发布确认

5 PUBREC – 发布收到(QoS 2,第一步)

6 PUBREL – 发布释放(QoS 2,第二步)

7 PUBCOMP – 发布完成(QoS 2,第三步)

8 SUBSCRIBE - 订阅主题

9 SUBACK – 订阅确认

10 UNSUBSCRIBE –取消订阅

11 UNSUBACK – 取消订阅确认

12 PINGREQ – 心跳请求

13 PINGRESP – 心跳响应

14 DISCONNECT – 断开连接

15 AUTH – 认证交换

可变报头

报文载荷

报文截获

利用 WireShark进行报文截获,以连接请求报文为例:

C#代码实现

此处以客户端发送连接请求为例,完整报文拼接实例如下

static void Main(string[] args)
{Console.WriteLine("欢迎关注朝夕教育,我是Jovan");try{string ip = "127.0.0.1";int port = 1883;string username = "admin";string password = "123456";string clientId = "C001";//Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);socketClient.Connect(ip, port);Console.WriteLine(">>> TCP 连接通道已建立");// 建立MQTT连接{// 构建MQTT报文Listbytes = new List();bytes.AddRange(new byte[] { 0, 4 });// Protocol Name Lengthbytes.AddRange(Encoding.ASCII.GetBytes("MQTT"));// Protocol Namebytes.Add(4);byte flag = 0;flag |= 128;// 用户名标记flag |= 64; // 密码标记flag |= 2;  // Clean Session 标记bytes.Add(flag);// KeepAlivebyte[] bytesKeepAlive = BitConverter.GetBytes((int)TimeSpan.FromSeconds(100).TotalSeconds);bytes.Add(bytesKeepAlive[1]);bytes.Add(bytesKeepAlive[0]);// ClientIDbyte[] clienIdBytes = Encoding.ASCII.GetBytes(clientId);bytes.Add((byte)(clienIdBytes.Length / 256));bytes.Add((byte)(clienIdBytes.Length % 256));// 长度占两个字节bytes.AddRange(clienIdBytes);// UserNamebyte[] usernameBytes = Encoding.ASCII.GetBytes(username);bytes.Add((byte)(usernameBytes.Length / 256));bytes.Add((byte)(usernameBytes.Length % 256));// 长度占两个字节bytes.AddRange(usernameBytes);// Passwordbyte[] passwordBytes = Encoding.ASCII.GetBytes(password);bytes.Add((byte)(passwordBytes.Length / 256));bytes.Add((byte)(passwordBytes.Length % 256));// 长度占两个字节bytes.AddRange(passwordBytes);byte[] bufferLen = new byte[] { (byte)bytes.Count };MemoryStream memoryStream = new MemoryStream();memoryStream.WriteByte(1 << 4);memoryStream.Write(bufferLen, 0, (int)bufferLen.Length);memoryStream.Write(bytes.ToArray(), 0, (int)bytes.Count);byte[] array = memoryStream.ToArray();memoryStream.Close();socketClient.Send(array);}}catch (Exception ex){Console.WriteLine(ex.Message);}Console.ReadLine();
}

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

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

相关文章

要成为年薪五十万的数据分析师,除了技术还需要什么?

超过59%企业&#xff0c;将提高数据分析岗位数量----一流的数据分析师&#xff0c;年薪轻松突破50万想必同学们看到这个数据并不惊讶&#xff0c;如今在中国&#xff0c;各行各业对数据分析岗位的需求日益提高&#xff1a;在线社交媒体&#xff0c;希望通过数据时刻洞察用户关注…

c语言电脑蓝屏代码,电脑蓝屏代码0x0000001a的解决方法

遇到蓝屏&#xff0c;第一时间记录停机码&#xff0c;如有导致蓝屏的文件名&#xff0c;那么排查的范围就会缩小。下面小编就为大家介绍电脑蓝屏代码0x0000001a的解决方法介绍&#xff0c;希望能对大家有所帮助&#xff01;方法/步骤1、先看这张截图的停机码所在位置。STOP后面…

关于序列建模,是时候抛弃RNN和LSTM了

作者表示&#xff1a;我们已经陷入 RNN、LSTM 和它们变体的坑中很多年&#xff0c;是时候抛弃它们了&#xff01;在 2014 年&#xff0c;RNN 和 LSTM 起死回生。我们都读过 Colah 的博客《Understanding LSTM Networks》和 Karpathy 的对 RNN 的颂歌《The Unreasonable Effecti…

如何运用并行编程Parallel提升任务执行效率

本文来自小易&#xff0c;【DoTNET技术圈】公众号已获得转载授权。《.NET并发变成实战》读后感&#xff1a;并行编程Parallel手打目录&#xff1a;一、前言二、任务并行库&#xff08;TPL&#xff09;的介绍三、Parallel.Invoke的使用四、Parallel.For的使用五、Parallel.ForEa…

通过 GitHub Actions 自动创建 Github Release

通过 GitHub Actions 自动创建 Github ReleaseIntro在 GitHub 上维护了几个小的开源项目&#xff0c;每次在发布新版本的时候会创建一个 release&#xff0c;这样可以比较方便的找到对应的版本的代码&#xff0c;不需要再人肉的从 git log 中找到指定的 commit&#xff0c;而且…

利用win7的applocker功能来有组织的阻止相关软件运行

我有4年没用360相关的软件了&#xff0c;没有360的弹窗用电脑就是舒服。但是我的电脑有时候会有别人来用&#xff0c;我的同学或者我的父母。但是他们经常会自作主张地在我的电脑上装上360卫士&#xff0c;还有360浏览器。每次都是装了我再删&#xff0c;反反复复也不是办法。后…

人工智能会让工作环境变得更公平,还是更压抑?

人工智改变的不仅仅是工作内容……人工智能&#xff08;AI&#xff09;正在踏足商业领域。正如我们本周的特别报道所诠释到的那样&#xff0c;所有类型的公司都在利用人工智能来预测需求&#xff0c;雇佣员工和对付客户。2017年&#xff0c;企业在与人工智能相关的并购交易中支…

离开时请告诉自己生意就是生意

离开时请告诉自己生意就是生意 离职或者被离职&#xff0c;是职场中很常见的事情&#xff0c;每天这个星球上不知道要发生多少次&#xff0c;不管你经历过与否、体会到其中的滋味与否&#xff0c;他都会一直存在着&#xff01;当这一切发生时&#xff0c;不管你是获利者还是受害…

如何假装成一名好程序员?

最近我对一位资深程序员就工作生活问题进行了深度采访&#xff0c;采访内容如下&#xff1a;Q&#xff1a;请问你工作多久了&#xff1f;A&#xff1a;5年了Q&#xff1a;你觉得&#xff0c;程序员这份工作对你有什么影响吗&#xff1f;A&#xff1a;有Q&#xff1a;那你的生活…

c语言 gbk字模点阵数组,GBK点阵显示字库的制作和使用

GBK编码共收录汉字21003个、符号883个&#xff0c;并提供1894个造字码位&#xff0c;简、繁体字融于一库。以两个字节表示一个汉字&#xff0c;编码范围是0x8140~0xfefe&#xff0c;兼容GB2318&#xff0c;并覆盖了unicode中的所有汉字。Win7记事本默认以GBK保存汉字。开发环境…

云服务器下行_腾讯云轻量应用服务器简单测评

这台机器的配置是1核心1G内存3M带宽,一直在吃灰&#xff0c;到现在才想起来应该测评一下腾讯云活动推荐​cloud.tencent.com测评机器概况从图中可以看到这台机器CPU采用 AMD EPYC 7K62 48-Core Processor 主频2.60GhzI/O大致129.3MB/S 用来建站是没问题的。3Mbps上行带宽跑满,下…

这是我见过的最全的训练数据集,没有之一!

从大学毕业起&#xff0c;小编就开始收集各类数据集&#xff0c;经过近几年的积累和沉淀&#xff0c;小编收集整理了32套数据集&#xff0c;内容涵盖“自动驾驶”、“人脸识别”、“世界杯”、“股票数据”、“基因组数据”、“全球各大社交媒体数据”等。现在&#xff0c;小编…

运维小姐姐说这篇Consul集群和ACL配置超给力(保姆级)

前言上一篇简单介绍了Consul&#xff0c;并使用开发模式&#xff08;dev&#xff09;进行流程演示&#xff0c;但在实际开发中需要考虑Consul的高可用和操作安全性&#xff0c;所以接着来聊聊集群和ACL的相关配置&#xff0c;涉及到的命令会在环境搭建过程中详细介绍。正文关于…

c语言判断x的个位数是否为5,用C语言编程从键盘输入一个正整数,判断其个位数是否为5,若是5则输出“yes”,否则输出“no”...

#include int main(){int five;printf("输入一个整数:");scanf("%d",&five);while(five>10){five five%10;}if(five 5)printf("yes");elseprintf("no");return 0;}扩展资料&#xff1a;“模”是“Mod”的音译&#xff0c;模运…

从基础概念到数学公式,这是一份520页的机器学习笔记(图文并茂)

导读&#xff1a;近日&#xff0c;来自SAP&#xff08;全球第一大商业软件公司&#xff09;的梁劲&#xff08;Jim Liang&#xff09;公开了自己所写的一份 520 页的学习教程&#xff08;英文版&#xff09;&#xff0c;详细、明了地介绍了机器学习中的相关概念、数学知识和各种…

Excel模板导出之动态导出

说明目前Magicodes.IE已支持Excel模板导出时使用JObject、Dictionary和ExpandoObject来进行动态导出&#xff0c;具体使用请看本篇教程。本功能的想法、部分实现初步源于arik的贡献&#xff0c;这里再次感谢arik&#xff01;在开始本篇教程之前&#xff0c;我们重温一下模板导出…

简述原型模型的特点_3D打印硅胶复模手板的步骤和特点有哪些

硅胶手板是一种主要用于手板模制作的硅胶制品&#xff0c;手板硅胶主要要求&#xff1a;不缩水、不变形&#xff0c;硬度合适不太复杂的产品使用。硅胶手板经常用硅胶模具来制造为产品快速成型复制提供便利性&#xff0c;产品收缩率可达到千分之二&#xff0c;主要用于手板模型…

快速成长为数据挖掘高手的秘诀

随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。目前而言&#xff0c;数据挖掘大致分为四个层次&#xff1a;纯粹数据加工…

ASP.NET Core 基于角色的 JWT 令牌

原文&#xff1a;https://bit.ly/3vYljq3作者&#xff1a;Rick Strahl翻译&#xff1a;精致码农-王亮声明&#xff1a;我翻译技术文章不是逐句翻译的&#xff0c;而是根据我自己的理解来表述的。其中可能会去除一些本人实在不知道如何组织但又不影响理解的句子。ASP.NET Core 中…

圆形比例分布图怎么做_解读宝山区2035总体规划:建设用地的比例在上海非中心城区中最高...

《上海市宝山区总体规划暨土地利用总体规划(2017-2035)》已经发布&#xff0c;在宝山区2035总体规划中&#xff0c;一个重要的核心指标成为了亮点&#xff0c;这就是宝山区的建设用地面积为244.3平方公里。宝山区的陆地总面积是301.6平方公里&#xff0c;由此宝山区建设用地面积…