全网唯一物联网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();
}

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

  1. 2021年度28个开箱即用的MQTT开源项目合集【附源码】

    随着云通讯行业持续增长,5G建设逐步推进.音视频技术快速迭代,都是为了满足人与人.设备与人.设备与设备之间的消息传输.这无疑是一个消息传输的时代.在这个时代中,所有的协议.配置都在于恰到好处.正如MQ ...

  2. C语言丨整蛊必备小程序,好玩炸翻天(附源码)

    前言 感觉学了c语言后仍然一无是处?!!想要整蛊一下朋友仍然不会?!! 别慌,看完这篇文章,你就会了. 下面给大家分享两个基础的整蛊小程序 1.我是猪关机程序 2.无限弹窗程序 一.我是猪关机程序 效 ...

  3. ESP32运行MicroPython通过MQTT上报温湿度到中移OneNET物联网平台(附源码)

    前言:MQTT是当下物联网用的比较多的协议,本篇聊一聊用esp32通过MQTT连接到中移OneNET物联网平台. OneNET平台创建产品和设备 1.​创建产品:开发者中心->全部产品-> ...

  4. python程序员专用壁纸_程序员炫技必备:用Python生成马赛克画!(文末附源码)...

    原标题:程序员炫技必备:用Python生成马赛克画!(文末附源码) 源 | Python与数据分析文 | 强哥 大家知道马赛克画是什么吗?不是动作片里的马赛克哦~~ 马赛克画是一张由小图拼成的大图,本 ...

  5. 程序员debug必备神器—每日Bug看板(附源码)

    本文以开源Demo--每日bug看板为开发实例,手把手教大家如何使用环信MQTT消息云实现在线通知功能,并见证一下MQTT+即时通知在项目开发管理中是如何敏捷而出色地满足多人云协作需求的! 随着数字化 ...

  6. 100个Python实战练手项目(附源码+素材),学习必备

    前言: 不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了最新32个Python实战项目列表,都有完整且详细的视频教程和 ...

  7. 宅男必备福利壁纸大全自动采集微信小程序源码带动态壁纸支持多种流量主

    这是一款可以说是宅男的最爱 也可以说是专门给宅男准备的一款小程序吧 里面支持动态视频,静态壁纸,情侣头像等多种分类 保存内容支持每天激励视频解锁保存 全内容自动采集,内附含了数不清的小姐姐,二次元,各 ...

  8. 【Python小案例】打工人必备:有了这款倒计时神器,再也不用担心自己的隐私被偷窥啦~(附源码)

    前言 又见面了,小伙伴儿们,发现最近大家喜欢看一些简单的小案例?! 咳咳,下面进入正题. 每个人的电脑里都会有不想让别人知道的隐私,或者是上班时间偷偷摸鱼怕被发现的小秘密. 那怎么办?就干脆把隐私锁起 ...

  9. 【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo...

    开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩 ...

最新文章

  1. 如何在你的应用中使用Jasypt来保护你的数据库用户名和密码
  2. list、tuple、set、dict 四大数据结构
  3. Matlab调整子图位置及大小(祛白边)+调整画布大小+添加总标题
  4. prototype.js ajax.request,javascript – Prototype和Ajax.Request范围
  5. cv mat 灰度值和_c++ 访问OpenCV中灰度图像的像素值
  6. hive 创建外部表产生java_(一)Hive表(管理表、外部表)的创建规则
  7. 我去过细节印象最深的酒店
  8. 让jquery构造出类
  9. 交互设计-手机端原型尺寸规范
  10. delphi 分析抓取html,delphi网页数据抓取
  11. android11.0 Launcher3 高端定制之抽屉列表隐藏指定APP图标
  12. 云服务器搭建深度学习环境
  13. Xss小游戏通关攻略带解释
  14. RV1126笔记二十三:Nginx及cgi移植
  15. c++和python哪个好_python和c++哪个好 有什么区别
  16. 手机LBS位置应用服务盘点
  17. C++ STL容器详解
  18. mininet *** Error: RTNETLINK answers: No such file or directory 问题及解决方法
  19. IP-Guard 基础安装配置教程
  20. Java @queryhint_11个JPA和Hibernate查询配置小技巧

热门文章

  1. P1357 花园 (矩阵快速幂+ DP)
  2. Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)
  3. QT添加rtmp库的时候出现问题
  4. JAVA基础知识之网络编程——-基于AIO的异步Socket通信
  5. 如何在线查找成千上万的免费电子书
  6. 使用CEOP增强的Internet Explorer 8帮助保护您的孩子
  7. 形容计算机老师风采的句子,关于老师的句子
  8. c++的进制转换函数
  9. 基于DeepConvLSTM的传感器信号分类
  10. 多线程介绍和多线程模块-lock-互斥锁