赞
踩
物联网,物的互联网
现代的物联网产品一定是”物“通过某种方式接入了互联网
一种轻量级的数据交换格式,易于理解和使用的文本格式
本质:JSON本质就是一个字符串
字符集:必须是UTF-8,可以在字符串类型的值前加编码转义符
为什么取代了XML,称为物联网场景数据传输的首选
JSON | XML | |
---|---|---|
数据体积 | 体积小,文本格式简介 网络传输和存储占用更少带宽 | 体积大,使用大量标签和属性 对存储和网络要求高 |
解析速度 | 解析速度快,结构简单语法清晰 | 解析速度慢,语法复杂 |
阅读和编写 | 易于阅读 | 冗长复杂,不方便阅读 缺少注释的支持和标签的歧义性 |
可移植性 | 可移植性好,独立于编程语言和平台的格式 | |
支持 | 很多平台原生支持JSON,无需额外库和插件 | 没有直接集成,没有内置的支持 |
可嵌套性 | 支持嵌套,可以包含对象和数字 | |
应用领域 | 适合数据交互,数据传输快速,轻量的场合 | 适合数据结构复杂的表示和扩展 |
总结 | 更适合物联网场景 |
格式:大括号里面是键和值
键与值之间用" : “隔开
键值之间用” , “隔开,最后一个键值后没有” , "
注意:
格式1:
{
"key":"value", //字符串类型
"key1":123 //数字数据类型(包括:整数、小数、负数),没有长度限制
"key2":{ //对象,JSON嵌套,作为key内容存在
"name":"迟仪鑫",
"qq":2488701239
}
"key3":[1,2,3,4], //数组,可以是字符串、数字,对象
"key4":null //空值
}
格式2:
{"key":"value","key1":"value1"}
//去掉换行符,传输时节省内存和网络带宽
将数据对象转换为JSON字符串的过程
序列化过程中,数据对象中的属性和值被转换为JSON格式的键值,并按照JSON语法规则进行组织
将JSON字符串转换为数据对象的过程
在反序列化过程中,JSON字符串被解析,键值被还原为数据对象的属性和值
一个客户端/服务端架构的**“发布/订阅"模式的"轻量级”**的消息传输协议,被设计为高效、简单和2易于实现,适用于各种网络环境和设备
MQTT协议是应用层协议
MQTT协议基于TCP/IP协议
MQTT传输是以数据报进行传输,传输是以二进制形式进行的
注意:
消息队列 | MQTT | |
---|---|---|
创建 | 发送消息前要创建队列 | 可以直接订阅主题,发送消息 |
消息 | 读走后消息消失 | 没人读,消息丢弃 |
设备 | 一对一 | 一对一,一对多,多对一 |
发布时,设备将信息发布给代理,代理接收到数据转发给订阅设备
消息处理:代理接收到发布者的消息,将该消息转发给当前订阅者,如果没有订阅者则消息会被丢弃
会话存储:将消息存储在独立于代理的持久会话中,即使订阅者断开,会话不会消息,发布者发布消息会存储进持久会话中,这些消息等到客户端再次上线不需要重新订阅,就会拿到消息
优点:
中网和特性:发布者不知道订阅者是否成功接收,需要添加请求和应答机制
客户端订阅和发布消息时,相互独立,空间上可以分离,时间上可以异步
最底层是TCP/IP,利于保证简单和易于实现的特点,降低集成难度
对于消息有序、可靠的要求上,MQTT和TCP目标是一致的
注意:TCP仍有可能因为网络断开而丢失消息
MQTT通过消息服务和持有规划机制共同保证了消息的可靠到达,最大程度上避免了消息丢失
假死状态
客户端定期发送心跳包报文
遗嘱消息
客户端在意外断开连接时发送一条预定义的消息给代理服务器,这个消息叫做遗嘱消息
遗嘱消息是用于通知其他阅览相同主题的客户端,发布者已经离线或连接中断
保留消息
在代理外部添加消息存储或消息队列系统,代理并不会保留消息
代理会保留某一主题发布的最后一条消息,当订阅端上线并重新订阅这个主题是,代理会将保留的消息进行下发
编码,UTF-8
最大长度,65535
区分大小写
可以通过"/"划分主题层级
配合主题通配符,一次订阅多个主题
+:单层通配符
#:多层通配符,包括0个层级
home/#
可以匹配home
必须是主题最后一个字符
可以在主题中同时使用单层通配符和多次通配符
注意:
Mosaquitto、EMQ X、HiveMQ、VerneMQ
格式:二进制数据包
作用:MQTT通过交换预定义的MQTT控制报文来通信
组成:固定报头、可变报头、有限载荷
组成 | 含义 | 包含 |
---|---|---|
固定报头 | 必须存在,用于描述报文信息。 | 数据包类型、对应标识、数据包大小 |
可变报头 | 不一定存在。主要看什么样子类型的报文 | 由数据包决定 |
有效载荷部分 | 内容。也是通信信息存放的地方。知识有时候会存放一些额外的信息,如:客户ID | 具体数据 |
大小:2byte
组成:
名称 | 值 | 方向 | 描述 |
---|---|---|---|
Reserved | 0 | 不可用 | 保留位 |
CONNECT | 1 | Client到Broker | client请求连接到Broker |
CONNACK | 2 | Broker到Client | 连接确认 |
PUBLISH | 3 | 双向 | 发布消息 |
PUBACK | 4 | 双向 | 发布确认 |
PUBREC | 5 | 双向 | 发布收到 |
PUBREL | 6 | 双向 | 发布释放 |
PUBCOMP | 7 | 双向 | 发布完成 |
SUBSCRIBE | 8 | Client到Broker | Client请求订阅 |
SUBACK | 9 | Broker到Client | 请阅确认 |
UNSUBSCRIBE | 10 | Client到Broker | client请求取消订阅 |
UNSUNACK | 11 | Broker到Client | 取消订阅确认 |
PINGREQ | 12 | Client到Broker | PING请求 |
PINGREQ | 13 | Broker到Client | PING应答 |
DISCONNECT | 14 | Client到Broker | Client主动中断连接 |
Reserved | 15 | 不可以 | 保留位 |
数据包 | 标识位 | Bit3 | Bit2 | Bit1 | Bit0 |
---|---|---|---|---|---|
CONNECT | 保留位 | 0 | 0 | 0 | 0 |
CONNACK | 保留位 | 0 | 0 | 0 | 0 |
PUBLISH | MQTT 3.1.1使用 | DUP | QoS | QoS | RETAIN |
PUBACK | 保留位 | 0 | 0 | 0 | 0 |
PUBREC | 保留位 | 0 | 0 | 0 | 0 |
PUBREL | 保留位 | 0 | 0 | 0 | 0 |
PUBCOMP | 保留位 | 0 | 0 | 0 | 0 |
SUBSCRIBE | 保留位 | 0 | 0 | 0 | 0 |
SUBACK | 保留位 | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | 保留位 | 0 | 0 | 0 | 0 |
UNSUBACK | 保留位 | 0 | 0 | 0 | 0 |
PINGREQ | 保留位 | 0 | 0 | 0 | 0 |
PINGRESP | 保留位 | 0 | 0 | 0 | 0 |
DISCONNECT | 保留位 | 0 | 0 | 0 | 0 |
组成:协议名、协议级别、连接标志、保持连接
组成:客户端标识符、用户名、密码
在进行订阅发布直接需要连接到代理
流程:
固定头,数据包字段值为1,数据包标识位保留
可变头,协议名称、协议版本、连接表示、Keepale
值 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
用户名标识 | 密码标识 | 遗愿消息标识(Retain) | 遗愿消息标识(Qos) | 遗愿消息标识(Qos) | 遗愿标识 | 会话清除标识(clean) | 保留 | |
是否有用户名字段 | 是否有密码字段 | 是否保留消息 | 遗愿消息等级高位 | 遗愿消息等级低位 | 是否使用遗愿消息 | 是否建立持久会话 |
消息体,客户端标识符、遗愿主题、遗愿QOS、遗愿消息、用户名和密码
固定报头,数据包字段值为2,标识位保留,剩余长度固定为2
可变报头,固定两字节
确认标识,1~7位固定为0,0位为0或1
返回码,表示是否连接成功
Return Code | 连接状态 |
---|---|
0 | 连接已建立 |
1 | 连接被拒绝,不允许的协议版本 |
2 | 连接被拒绝,Client Identifier(标识)被拒绝 |
3 | 连接被拒绝,服务器不可用 |
4 | 连接被拒绝,错误的用户名或密码 |
5 | 连接被拒绝,未授权 |
步骤:
为什么不直接断开TCP:
broket主动断开,长时间没有收到Broekt数据包
方式:直接关闭底层TCP
注意:MQTT库实现的client被动断开后自动重连
为什么先订阅后发布:如果先发布后订阅,则代理看见该消息没有订阅者,则该消息会被丢弃
作用:用于在Sender和Receiver之间传输消息
报文:
返回码 | 含义 |
---|---|
0 | 订阅成功,最大可以Qos为0 |
1 | 订阅成功,最大可以Qos为1 |
2 | 订阅成功,最大可以Qos为2 |
128 | 订阅失败 |
MQTT保证消息稳定传输的机制,包括消息应答、存储和重传
注意:这个保证是客户端和代理之间的
发送到向接收端发送一个包含数据的PUBLISH数据包,不会关注最终结果
优点:占用资源最少
缺点:信息是否可靠由网络状况决定
在Qos0的基础上添加了应答机制
服务端会选项发布消息和订阅消息中较低的Qos来实现消息传输,这也被称作服务降级
仅仅是TCP层连接状态检测是不够的,MQTT有一套Keepalive机制
传递时MQTT从换地Keepalive参数,MQTT越低在1.5XKeepalive的时间间隔内,如果代理没有收到来自Client的任何数据包,则认为带了和Client之间的连接以及断开
通过PINGREQ/PINGRESP数据包满足Keepalive的约定和连接的侦测
特点 | UDP | TCP |
---|---|---|
是否由连接 | 无连接 | 有链接 |
传输基本单位 | 数据包 | 数据流 |
传输速度 | 传输速度快,且天生高并发 | 传输速度较慢 |
可靠性 | 不可靠 | 可靠 |
基本单位:数据包
UDP数据包是一个独立的,完整的数据单元,它具有包含源和目的端口号的头部信息
每个数据包都是独立的,可以独立地接收和发送不会受到其他数据报的影响
基本单位:数据流
将应用城市数据视为一系列字节,没有固定的分隔单位。TCP协议在发送数据时,会将数据流切分成合适的大小,添加TCP头部信息,封装成TCP段进行传输
TCP会重新组装收到的TCP段,还原为原始的字节流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。