【面试僧】第二季·远程控制监测系统项目文档

尊敬的学者们,

 

你是否对人工智能、物联网技术充满好奇?是否想要亲手打造一款属于自己的智能物联网家居项目?现在,我们为你带来一堂极具创意的直播课程,让你在学习中体验科技的乐趣,开拓视野,提升技能。让我们一起踏上这场精彩的智能物联网家居项目学习之旅吧!

 

一、课程亮点

 

1. 实战为主:课程以实际项目为导向,让你在动手实践中学习编程、电子电路、机械设计等知识,锻炼创新能力。

 

2. 专业师资:我们的讲师团队具备丰富的教学经验和实践经验,为你提供专业、贴心的指导。

 

3. 互动教学:直播课程中,讲师将与你实时互动,解答你的疑问,让你在学习过程中不再迷茫。

 

4. 优质资源:课程提供丰富的学习资料,包括项目源码、教学视频、电子书籍等,让你随时随地巩固所学。

 

5. 项目实战:课程将带领大家完成多个实战项目,让你在实践中掌握所学知识,提高动手能力。

 

6. 定价策略:根据课程内容和市场需求,制定合理的价格策略。推出优惠活动,让你享受到更多实惠。

 

7. 售后服务:提供优质的售后服务,解答你在学习过程中遇到的问题,与你保持密切沟通。

 

8. 学员互动:定期举办学员聚会、线上交流等活动,让你结识志同道合的朋友,共同进步。

 

9. 持续宣传:根据学员反馈,不断完善课程内容,推出新课程。通过邮件、短信等方式,向你推送最新课程信息。

 

同学们,让我们一起加入这场智能家居项目的学习之旅,开启探索科技魅力的征程!不要犹豫,马上行动起来,开启你的智能物联网家居项目之旅吧!

 

敬请期待,我们在直播课堂与你相见!

 

祝学习愉快!

 

【面试僧电子】敬上

 

【报名联系方式】

QQ:2754106361

微信:17862853189

 

让我们共同开启智能物联网家居项目之旅,探索科技的无限可能!

早鸟价99元,活动结束恢复199元

 

付款后添加联系方式即可安排课程

课程部分大纲

第2章
第三代远程控制系统硬件设计

2.1
整体控制系统

2.1.1
方案选择

2.2
最小系统设计

2.2.1
方案选择

2.3
电源系统设计

2.3.1
降压芯片

2.3
外围电路系统设计

2.3.1
光照采集系统电路

2.4
烟雾系统设计

2.4.1
烟雾采集系统电路

2.5
蜂鸣器系统设计

2.5.1
蜂鸣器系统电路

2.6
温湿度采集系统设计

2.6.1
温湿度系统电路

2.7
串口通信系统设计

2.7.1
通信系统电路

2.8
本章小节

第3章
第二季远程控制系统软件设计

3.1
利用MQTT协议入网前基本操作

3.1.1
ESP8266入网前基本软件配置

3.1.2

构建发送以及接收缓冲区内存

3.2
利用阿里云平台搭建物联网设备

3.2.1

注册

3.2.3
初始化ESP8266联网模块

第4章
MQTT协议解析

4.1
CONNECT
– 连接服务端

4.1.1
固定报头

4.1.2
可变报头

4.1.2.1
协议名

4.1.2.2
协议级别

4.1.2.3
连接标志

4.1.2.4
清理会话

4.1.2.5
遗嘱标志

4.1.2.6
遗嘱
QoS

4.1.2.7
遗嘱保留

4.1.2.8
用户名标志

4.1.2.9
密码标志

4.1.2.10
保持连接

4.1.3
有效载荷

4.1.3.1
客户端标识符

4.1.3.2
遗嘱主题

4.1.3.3
遗嘱消息

4.1.3.4
用户名

4.1.3.5
密码

5.1
CONNECT
– 确认连接请求

5.1.1
固定报头

5.1.2
可变报头

………

第2章
第三代远程控制系统硬件设计

2.1
整体控制系统

2.1.1
方案选择

整体硬件电路方案设计和之前基本一致,区别在于硬件电路设计由之前插件式电路改为贴片电路,电路原理基本一致,串口调试接口采用了当下比较常用的CH340芯片进行USB和TTL转换。供电系统进行了重新设计,电压提供更加稳定。部分电路增加了续流二极管,滤波电容进行电路优化,主要目的是让电路更加稳定可靠。

2.2
最小系统设计

2.2.1
方案选择

最小系统是整个电路的核心,最小系统电路设计出现问题,外围电路就无法正常执行工作,所以我们的设计是由最小系统电路开始的,以下是最小系统的设计电路图2.1

图2.1
最小系统硬件电路图

最小系统电路常规设计包含单片机,本硬件依然采用的是当下热门产品STM32F103C8T6作为逻辑处理芯片,关于该芯片衍生出的产品众多,所以采用此款芯片进行电路改造,依然采用了两个外部晶振,一个8MHZ,一个32.768K,实际产品中为了节省成本,可能两个外部晶振都会被砍掉,但仅用于对时间精度要求不高的场合。设计了一个复位引脚,可使单片机复位重启。用于单片机最小系统的一些电容都是一般常规设计参数,参照硬件原理图设计没有问题,值得注意的是,同样将单片机引脚额外引出,实际开发中一般不用,引出是为了扩展功能,方便调试。

2.3
电源系统设计

2.3.1
降压芯片

整个系统电源采用的是外部5V供电,经过USB口后进行电源输入,利用线性稳压器将电压从5V稳定在3.3V左右,该芯片外观如图2.2。同时还在电路中设计了一个红色LED灯用于指示供电电路是否连通。

图2.2
线性稳压器外观图

2.3
外围电路系统设计

2.3.1
光照采集系统电路

采用的光照芯片为罗姆公司产品,在芯片的时钟引脚上接入了4.7K左右的上拉电阻,数据引脚上同样接入了4.7K左右的上拉电阻。该芯片外观如图2.3所示。

图2.3
BH1750外观图

2.4
烟雾系统设计

2.4.1
烟雾采集系统电路

烟雾采集电路相对比较简单,电压采集通道经过单片机的PA1端口进行处理,需要将PA1引脚置为模拟输入模式,利用ADC功能即可采集到电压值,经过转换后得到具体对应的烟雾浓度。其产品外观如图所示2.4所示。

图2.4
烟雾传感器外观图

2.5
蜂鸣器系统设计

2.5.1
蜂鸣器系统电路

蜂鸣器电路比较简单,其原理图如下图2.5所示,改蜂鸣器的发声与否与三极管是否通断有关,当控制引脚PA0处于高电平状态,三极管导通,使得蜂鸣器发出声响,低电平三极管截止导通,蜂鸣器停止发出声响。

图2.5
蜂鸣器电路图

2.6
温湿度采集系统设计

2.6.1
温湿度系统电路

温湿度采集电路如图2.6所示,该模块与单片机通信方式为单总线通信方式,原理图结构较为简单,主要设计难点在于软件通信。

图2.6
温湿度电路图

2.7
串口通信系统设计

2.7.1
通信系统电路

单片机和上位机之间的数据通信采用CH340转换芯片实现USB转TTL,该模块和PA9,PA10引脚连接,可实现数据调试打印功能,其原理图如下图2.7所示。

图2.7
USB转TTL电路图

2.8
本章小节

本章节简单介绍了单片机相关外围电路的硬件设计,比起第一季来说,硬件电路难度并没有增加多少,主要是PCB的布局和软件的优化难度相对来说要困难一些。还有一部分接口和第一季一样,引出的排针将会在PCB布局指导中看见,现目前的贴片电路板效果如图2.8所示,之后布局会略微调整,但基本布局已经定型。这是根据单片机芯片引脚引出后布局的合适效果。

图2.8
第二季远程控制系统硬件电路图

第3章
第二季远程控制系统软件设计

3.1
利用MQTT协议入网前基本操作

3.1.1
ESP8266入网前基本软件配置

单片机复位引脚本次硬件设计没有涉及,其硬件电路图如图3.1所示,我们可以发现RST引脚并没有接入单片机引脚上,所以单片机引脚此时是无法控制ESP8266复位的。但是我们程序中可以先将复位控制写上,待第三季的时候我们将升级功能,加深难度,到时候再控制也不迟,第二季版本,屏蔽掉这段代码也不影响单片机联网。

图3.1
ESP8266系统硬件电路图

ESP8266连接路由器操作步骤:

  1. 先复位模块,等待模块响应复位成功。

  2. 设置STA模式,等待模块响应设置成功。

  3. 取消自动连接模式,等待该操作响应成功。

  4. 连接路由器,等待该操作成功。

  5. 设置透传模式,等待该操作成功。

  6. 关闭多路连接,等待该操作成功。

  7. 连接服务器,等待该操作成功。

以上是一套完整的ESP8266连接路由器以及服务器的流程,很多学习者疑问ESP8266是如何接收和回复需要响应的数据,其实这是利用了单片机串口的接收和发送引脚来进行数据传递的,在软件中,我们将串口2发送引脚PA2设置为复用推挽输出模式,这样就可以以高低电平的方式将需要发送的字符串发送出去。那如何接收数据呢?很多同学肯定也有这样的疑问,我们将串口接收引脚PA3设置为浮空输入模式,此刻ESP8266做为从机响应单片机发过来的数据,如果一切顺利,就回复“OK”或者其他字符串,具体回复解析需要对照软件来学习。因为不是每一种指令都回复“OK”字符串,就比如连接服务器有三种回复“CONNECT”表示连接成功,“CLOSED”表示服务器未开启,“ALREADY
CONNECTED”如果接受到ALREADY
CONNECTED已经建立连接。在这个过程中我们规定了多久时间回复,如果不设置这个时间,我们连接的过程将变的不可控,如果规定时间还检索不到需要的字符串则退出函数,并说明操作超时,等待我们程序再重新尝试一遍所有指令连接。以上是ESP8266连接路由器以及服务器IP地址的具体流程。这个过程并不复杂,对照代码练习一遍即可掌握理解。

3.1.2

构建发送以及接收缓冲区内存

为了便于单片机和服务器之间的数据交互,我们需要设定相应的缓冲区去承载我们需要的数据,但是我们同时也希望我们的数据不管是发送还是接收我们都能很清楚的判断是否载入我们设定的内存区域。所以有必要设置一些指针去引导我们判断。我们需要定义以下几个变量,为了方便后期移植,我们将他们封装成结构体,同属于一个结构体下面,这样编写程序的时候会更方便,以下是需要定义的结构体成员变量,如图3.2。

图3.2
定义的结构体变量(可放大查看)

构建了以上变量之后,我们就需要开始了解上传数据至阿里云需要设置的方法了,和第一季自己搭建的服务器不同,上传数据至阿里云需要我们设置设备的三元组信息。我们先拿到三元组信息之后,直接添加进代码中,才可以开始接下来的所有入网操作,接下来一章我将带领大家如何使用阿里云注册一个自己的产品。

3.2
利用阿里云平台搭建物联网设备

3.2.1

注册

在搜索引擎搜索
“阿里云”,确保阿里云官网如图3.3箭头所示。点击进入官网,如果未注册的同学就注册一个账号,注册过程和注册APP类似,可以用多种方式进行注册,本文以注册过的用户形式进行讲解,所以确保你已经注册账号成功,按照步骤进行操作。

图3.3
引擎搜索

进入官网之后,我们搜索物联网平台,如图3.4所示。

图3.3
阿里云官网搜索

搜索物联网平台之后,搜索结果里有个对应的物联网平台地址展示,如图3.4所示。

图3.4
搜索结果

点击进去就是物联网平台展示页,如图3.5所示。点击进入控制,接下来就是我们的设备配置过程了。

图3.5
物联网平台展示页

我们点击进去之后有一个公共实例,如图3.6所示。点击公共实例。

图3.6
公共实例展示页

点击公共实例之后就进入到我们的产品创建的页面了,我们第一步操作就是创建产品,点击创建产品按钮,如图3.7所示。

图3.7
创建产品页

点击,在创建产品过程中,需要我们填入一些基本参数,按照如图3.8配置即可。

图3.8
创建产品信息填写页

当产品创建成功之后,就需要添加设备了,如图3.9所示,以为为例,随便添加一个设备。

图3.9
设备信息添加页

进入到设备添加页之后的页面效果如图3.10所示,我们点击添加设备。

图3.10
添加设备页

当我们点击添加设备时,会弹出信息让我们填写,我们按照如图3.11所示进行填写操作,信息主要设备名称,这个名称将作为三元组第一个信息,关联我们的设备。

图3.11
设备信息填写页

添加成功之后,我们将在列表里看到我们的设备基本信息,此时显示的未激活状态,这是因为我们设备还未连接上阿里云过,所以显示如图3.12所示。

图3.12
设备信息展示页

我们继续点击左上角的产品二字,可以看到我们所有产品信息如图所示3.13所示。我们点击刚才我们创建的产品,点击进去。

图3.13
产品信息展示页

点击功能定义,然后编辑草稿,开始添加功能,如图3.14所示。

图3.14
添加功能页

进去之后我们就开始添加标准功能了,点击标准功能,如图3.15所示。

图3.15
添加标准功能页

我们开始选择产品功能,我们板子上有灯光控制,所以我们搜索一个灯,选择其中一个功能,这个可以不用按照我的来选择,只要符合开关灯的条件就可以,如图3.16所示。

图3.16
选择功能页

到此我们创建的第一个产品下的设备就成功添加了,如图3.17所示。大家可以看到现在列表里有一个布尔数据类型的主灯开关,标识符为LightSwitch,这个设备将是我们第一个实验的场景,大家一定要按操作将设备创建好,这样我们拿到三元组信息就是很容易的事情了。

图3.17
设备展示页

那么怎么拿到我们设备的三元组信息呢,我们刷新一下界面,点击左上角的产品,如图3.18所示,列表里会展示我们所有的产品信息,我们点击我们刚才创建的设备。

图3.17
产品展示页

我们产品下有很多功能可以开发利用,大家需要关注的内容已经用红框给框起来了,如图3.18所示。我们的三元组信息就在这个界面可以查询到。

图3.18
产品详情展示页

到此,我们就拿到了下位机上所需要的三元组信息,这个三元组信息中密钥和产品ID的查看位置如图3.19所示。还有一个设备名称不在本页面,但是我们之前是自己创建设备填写过,那个就是自定义的设备名称如图3.20所示。

图3.19
三元组信息查看页

图3.20
三元组信息查看页

3.2.2
初始化生成三元组信息

那么拿到三元组信息又如何操作呢,首先我们定义几个宏定义如图3.21所示

图3.21
三元组信息定义

这几个参数在用于构建三元组是十分重要的,首先我们进行连接阿里云初始化参数设置,主要就是用到这几个参数,这几个参数通过程序拼接和密钥生成所需要的三元组信息。

3.2.3
初始化ESP8266联网模块

前面讲到过初始化ESP8266的流程,那么初始化ESP8266模块对于联网比较重要的两步,一步是连接路由器,第二部是连接服务器。对于连接服务器,需要给定服务器域名和端口号,服务器域名和端口号在初始化过程中已经填入,不需要大家再去寻找操心,不过此时同学肯定又有一个疑惑了?我连接上服务器之后需要向服务器发送和接收数据,这个过程是基于MQTT协议传输数据的,但是对于MQTT协议却不太熟悉,所以,为了彻底解决同学们对MQTT协议的疑惑,专门开设一个章节来介绍一下MQTT协议。

第4章
MQTT协议解析

4.1
CONNECT
– 连接服务端

4.1.1
固定报头

客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是
CONNECT
报文
[MQTT-
3.1.0-1]。

在一个网络连接上,客户端只能发送一次
CONNECT
报文。服务端必须将客户端发送的第二个
CONNECT报文当作协议违规处理并断开客户端的连接
[MQTT-3.1.0-2]。

有效载荷包含一个或多个编码的字段。包括客户端的唯一标识符,Will
主题,Will
消息,用户名和密码。除了客户端标识之外,其它的字段都是可选的,基于标志位来决定可变报头中是否需要包含这些字段。
如图4.1所示

图4.1
固定报头

剩余长度等于可变报头的长度(10
字节)加上有效载荷的长度。

4.1.2
可变报头

CONNECT
报文的可变报头按下列次序包含四个字段:协议名(Protocol
Name),协议级别(Protocol
Level),连接标志(Connect
Flags)和保持连接(Keep
Alive)。

4.1.2.1
协议名

协议名是表示协议名
MQTT

UTF-8
编码的字符串。MQTT
规范的后续版本不会改变这个字符串的偏移和长度。

如果协议名不正确服务端可以断开客户端的连接,也可以按照某些其它规范继续处理
CONNECT
报文。对于后一种情况,按照本规范,服务端不能继续处理
CONNECT
报文。

4.1.2.2
协议级别

客户端用
8
位的无符号值表示协议的修订版本。对于
3.1.1
版协议,协议级别字段的值是
4(0x04)。如果发现不支持的协议级别,服务端必须给发送一个返回码为
0x01(不支持的协议级别)的
CONNACK
报文响应CONNECT
报文,然后断开客户端的连接。

4.1.2.3
连接标志

服务端必须验证
CONNECT
控制报文的保留标志位(第
0
位)是否为
0,如果不为
0
必须断开客户端连接。如图4.2所示。

图4.1
连接字节图

4.1.2.4
清理会话

一般来说,客户端连接时总是将清理会话标志设置为
0

1,并且不交替使用两种值。这个选择取决于具体的应用。清理会话标志设置为
1
的客户端不会收到旧的应用消息,而且在每次连接成功后都需要重新订阅任何相关的主题。清理会话标志设置为
0
的客户端会收到所有在它连接断开期间发布的
QoS
1 和
QoS2
级别的消息。因此,要确保不丢失连接断开期间的消息,需要使用QoS1
或QoS2
级别,同时将清理会话标志设置为
0。清理会话标志
0
的客户端连接时,它请求服务端在连接断开后保留它的
MQTT
会话状态。如果打算在之后的某个时间点重连到这个服务端,客户端连接应该只使用清理会话标志
0。当客户端决定之后不再使用这个会话时,应该将清理会话标志设置为
0
最后再连接一次,然后断开连接。

4.1.2.5
遗嘱标志

遗嘱标志(Will
Flag)被设置为
1,表示如果连接请求被接受了,遗嘱(Will
Message)消息必须被存储在服务端并且与这个网络连接关联。之后网络连接关闭时,服务端必须发布这个遗嘱消息,除非服务端收到DISCONNECT
报文时删除了这个遗嘱消息。

遗嘱消息发布的条件,包括但不限于:

服务端检测到了一个
I/O
错误或者网络故障。

   客户端在保持连接(Keep
Alive)的时间内未能通讯。

客户端没有先发送
DISCONNECT
报文直接关闭了网络连接。

由于协议错误服务端关闭了网络连接。

如果遗嘱标志被设置为
1,连接标志中的
Will
QoS 和
Will
Retain 字段会被服务端用到,同时有效载荷中必须包含
Will
Topic 和
Will
Message字段。

一旦被发布或者服务端收到了客户端发送的
DISCONNECT
报文,遗嘱消息就必须从存储的会话状态中移除。

如果遗嘱标志被设置为
0,连接标志中的
Will
QoS 和
Will
Retain 字段必须设置为
0,并且有效载荷中不能包含
Will
Topic 和
Will
Message 字段。

如果遗嘱标志被设置为
0,网络连接断开时,不能发送遗嘱消息。

服务端应该迅速发布遗嘱消息。在关机或故障的情况下,服务端可以推迟遗嘱消息的发布直到之后的重启。

如果发生了这种情况,在服务器故障和遗嘱消息被发布之间可能会有一个延迟。

4.1.2.6
遗嘱
QoS

这两位用于指定发布遗嘱消息时使用的服务质量等级。

如果遗嘱标志被设置为
0,遗嘱
QoS
也必须设置为
0(0x00)。

如果遗嘱标志被设置为
1,遗嘱
QoS
的值可以等于
0(0x00),1(0x01),2(0x02)。它的值不能等于
3

4.1.2.7
遗嘱保留

如果遗嘱消息被发布时需要保留,需要指定这一位的值。

如果遗嘱标志被设置为
0,遗嘱保留(Will
Retain)标志也必须设置为
0

如果遗嘱标志被设置为
1:

如果遗嘱保留被设置为
0,服务端必须将遗嘱消息当作非保留消息发布。

如果遗嘱保留被设置为
1,服务端必须将遗嘱消息当作保留消息发布。

4.1.2.8
用户名标志

如果用户名(User
Name)标志被设置为
0,有效载荷中不能包含用户名字段。

如果用户名(User
Name)标志被设置为
1,有效载荷中必须包含用户名字段。

4.1.2.9
密码标志

如果密码(Password)标志被设置为
0,有效载荷中不能包含密码字段。

如果密码(Password)标志被设置为
1,有效载荷中必须包含密码字段。

如果用户名标志被设置为
0,密码标志也必须设置为
0

4.1.2.10
保持连接

保持连接(Keep
Alive)是一个以秒为单位的时间间隔,表示为一个
16
位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。客户端负责保证控制报文发送的时间间隔不超过保持连接的值。如果没有任何其它的控制报文可以发送,客户端必须发送一个PINGREQ
报文。

不管保持连接的值是多少,客户端任何时候都可以发送
PINGREQ
报文,并且使用
PINGRESP
报文判断网络和服务端的活动状态。

如果保持连接的值非零,并且服务端在一点五倍的保持连接时间内没有收到客户端的控制报文,它必须断开客户端的网络连接,认为网络连接已断开。

客户端发送了
PINGREQ
报文之后,如果在合理的时间内仍没有收到
PINGRESP
报文,它应该关闭到服务端的网络连接。

保持连接的值为零表示关闭保持连接功能。这意味着,服务端不需要因为客户端不活跃而断开连接。注意:不管保持连接的值是多少,任何时候,只要服务端认为客户端是不活跃或无响应的,可以断开客户端的连接。

以上是关于可变报头的每一个字节的介绍,如图4.2所示。

图4.2
可变报头图

4.1.3
有效载荷

CONNECT
报文的有效载荷(payload)包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码。

4.1.3.1
客户端标识符

服务端使用客户端标识符
(ClientId)
识别客户端。连接服务端的每个客户端都有唯一的客户端标识符

(ClientId)。客户端和服务端都必须使用
ClientId
识别两者之间的
MQTT
会话相关的状态
[MQTT-3.1.3-2]。

客户端标识符
(ClientId)
必须存在而且必须是
CONNECT
报文有效载荷的第一个字段
[MQTT-3.1.3-3]。

客户端标识符必须是
1.5.3
节定义的
UTF-8
编码字符串
[MQTT-3.1.3-4]。

服务端必须允许
1

23
个字节长的
UTF-8
编码的客户端标识符,客户端标识符只能包含这些字符:

“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”(大写字母,小写字母和数字)[MQTT-3.1.3-5]。

服务端可以允许编码后超过
23
个字节的客户端标识符
(ClientId)。服务端可以允许包含不是上面列表字符的客户端标识符
(ClientId)。

服务端可以允许客户端提供一个零字节的客户端标识符
(ClientId)
,如果这样做了,服务端必须将这看作特殊情况并分配唯一的客户端标识符给那个客户端。然后它必须假设客户端提供了那个唯一的客户端标识符,正常处理这个
CONNECT
报文
[MQTT-3.1.3-6]。

如果客户端提供了一个零字节的客户端标识符,它必须同时将清理会话标志设置为
1
[MQTT-3.1.3-7]。

如果客户端提供的
ClientId
为零字节且清理会话标志为
0,服务端必须发送返回码为
0x02(表示标识符不合格)的
CONNACK
报文响应客户端的
CONNECT
报文,然后关闭网络连接
[MQTT-3.1.3-8]。

如果服务端拒绝了这个
ClientId,它必须发送返回码为
0x02(表示标识符不合格)的
CONNACK
报文响应客户端的
CONNECT
报文,然后关闭网络连接
[MQTT-3.1.3-9]

4.1.3.2
遗嘱主题

如果遗嘱标志被设置为
1,有效载荷的下一个字段是遗嘱主题(Will
Topic)。遗嘱主题必须是
1.5.3
节定义的
UTF-8
编码字符串。

4.1.3.3
遗嘱消息

如果遗嘱标志被设置为
1,有效载荷的下一个字段是遗嘱消息。遗嘱消息定义了将被发布到遗嘱主题的应用消息,见
3.1.2.5
节的描述。这个字段由一个两字节的长度和遗嘱消息的有效载荷组成,表示为零字节或多个字节序列。长度给出了跟在后面的数据的字节数,不包含长度字段本身占用的两个字节。

遗嘱消息被发布到遗嘱主题时,它的有效载荷只包含这个字段的数据部分,不包含开头的两个长度字节。

4.1.3.4
用户名

如果用户名(User
Name)标志被设置为
1,有效载荷的下一个字段就是它。用户名必须是
1.5.3
节定义的UTF-8
编码字符串
[MQTT-3.1.3-11]。服务端可以将它用于身份验证和授权。

4.1.3.5
密码

如果密码(Password)标志被设置为
1,有效载荷的下一个字段就是它。密码字段包含一个两字节的长度字段,长度表示二进制数据的字节数(不包含长度字段本身占用的两个字节),后面跟着
0

65535
字节的二进制数据。

如果验证成功,服务端会执行下列步骤。

1.
如果
ClientId
表明客户端已经连接到这个服务端,那么服务端必须断开原有的客户端连接。

2.
服务端必须按照执行清理会话的过程。

3.
服务端必须发送返回码为零的
CONNACK
报文作为
CONNECT
报文的确认响应。

4.
开始消息分发和保持连接状态监视。

允许客户端在发送
CONNECT
报文之后立即发送其它的控制报文;客户端不需要等待服务端的
CONNACK报文。如果服务端拒绝了
CONNECT,它不能处理客户端在
CONNECT
报文之后发送的任何数据。

5.1
CONNECT
– 确认连接请求

5.1.1
固定报头

服务端发送
CONNACK
报文响应从客户端收到的
CONNECT
报文。服务端发送给客户端的第一个报文必须是
CONNACK。

如果客户端在合理的时间内没有收到服务端的
CONNACK
报文,客户端应该关闭网络连接。合理的时间取决于应用的类型和通信基础设施。如图5.1所示,是固定报头格式。

图5.1
固定报头

剩余长度字段

表示可变报头的长度。对于
CONNACK
报文这个值等于
2

5.1.2
可变报头

图5.2
可变报头

未完待续……

资源下载: