MQTT协议简介_THEONE10211024的博客-程序员宅基地

技术标签: 网络  

 

MQTT - MQ Telemetry Transport

 
  • 轻量级的 machine-to-machine 通信协议。
  • publish/subscribe模式。
  • 基于TCP/IP。
  • 支持QoS。
  • 适合于低带宽、不可靠连接、嵌入式设备、CPU内存资源紧张。
  • 是一种比较不错的Android消息推送方案。
  • FacebookMessenger采用了MQTT。
  • MQTT有可能成为物联网的重要协议。
 

消息体

 
 
 

MessageType

 
 
 
CONNECT
TCP连接建立完毕后,Client向Server发出一个Request。
如果一段时间内接收不到Server的Response,则关闭socket,重新建立一个session连接。
如果一个ClientID已经与服务器连接,则持有同样ClientID的旧有连接必须由服务器关闭后,新建立才能建立。
 
CONNACK
Server发出Response响应。
0x00 Connection Accepted
0x01 Connection Refused: unacceptable protocol version
0x02 Connection Refused: identifier rejected
0x03 Connection Refused: server unavailable
0x04 Connection Refused: bad user name or password
0x05 Connection Refused: not authorized
 
PUBLISH 发布消息
Client/Servier均可以进行PUBLISH。
publish message 应该包含一个TopicName(Subject/Channel),即订阅关键词。
 
关于Topic通配符
/:用来表示层次,比如a/b,a/b/c。
#:表示匹配>=0个层次,比如a/#就匹配a/,a/b,a/b/c。
单独的一个#表示匹配所有。
不允许 a#和a/#/c。
+:表示匹配一个层次,例如a/+匹配a/b,a/c,不匹配a/b/c。
单独的一个+是允许的,a+不允许,a/+/b不允许
 
PUBACK 发布消息后的确认
QoS=1时,Server向Client发布该确认(Client收到确认后删除),订阅者向Server发布确认。
 
PUBREC / PUBREL / PUBCOMP
QoS=2时
1. Server->Client发布PUBREC(已收到);
2. Client->Server发布PUBREL(已释放);
3. Server->Client发布PUBCOMP(已完成),Client删除msg;
订阅者也会向Server发布类似过程确认。
 
PINGREQ / PINGRES 心跳
Client有责任发送KeepAliveTime时长告诉给Server。在一个时长内,发送PINGREQ,Server发送PINGRES确认。
Server在1.5个时长内未收到PINGREQ,就断开连接。
Client在1个时长内未收到PINGRES,断开连接。
一般来说,时长设置为几个分钟。最大18hours,0表示一直未断开。
 
 

QoS

 
 
QoS=0:最多一次,有可能重复或丢失。
 
QoS=1:至少一次,有可能重复。
Client[Qos=1,DUP=0/*重复次数*/,MessageId=x] --->PUBLISH--> Server收到后,存储Message,发布,删除,向Client回发PUBACK
Client收到PUBACK后,删除Message;如果未收到PUBACK,设置DUP++,重新发送,Server端重新发布,所以有可能重复发送消息。
 
QoS=2:只有一次,确保消息只到达一次(用于比较严格的计费系统)。
 
 

Clean Session

 
如果为false(flag=0),Client断开连接后,Server应该保存Client的订阅信息。
如果为true(flag=1),表示Server应该立刻丢弃任何会话状态信息。
 
 
 

Refs

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/THEONE10211024/article/details/45394271

智能推荐

java curator_[java,zk]在 linux 上快速搭建 zookeeper curator 开发环境-程序员宅基地

在这篇博客中简单介绍一下,如何快速的在 linux 操作系统上搭建使用 zookeeper 客户端 curator 编程的单机环境。在前几篇博客中,介绍的是使用 zookeeper 原生提供的 API 来编程的方法,其实,在 curator 出来之后,使用 zookeeper 原生态 API 编程的方法就被很多人抛弃不用了。在前面的文章中也简单的介绍了在一个 linux 主机上,通过配置多端口来部..._curator linux

mysql export import_Oracle数据库的导出/导入(EXPORT/IMPORT)、冷备份、热备份-程序员宅基地

当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(包括机器故障、介质故障、误操作等),数据库有时也可能遭到破坏,这时如何尽快恢复数据就成为当务之急。如果平时对数据库做了备份,那么此时恢复数据就显得很容易。由当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(包括机器故障、介质故障、误操作等),数据库有时也可能遭到破坏,这时如何尽快恢..._mysql export

ftp协议拉去远程文件,并且传送到远端(python)_python ftplib 主动模式_choudan8888的博客-程序员宅基地

main.py# 这是一个示例 Python 脚本。# -*- coding: UTF-8 -*-from ftplib import FTPimport osimport datetimeimport sysimport file_opclass FTP_OP(object): def __init__(self, host, username, password, port): """ 初始化ftp :param host: _python ftplib 主动模式

关于网件交换机基本配置命令_pvid怎么配置_hdxx2022的博客-程序员宅基地

(GSM5212P) (Interface 0/1)#vlan participation include vlanID——添加特定的vlan。(GSM5212P) (Interface 0/1)#vlan participation include vlanID——添加特定的vlan。(GSM5212P) (Interface 0/1)#vlan pvid vlanID ——配置端口的特定vlan。(GSM5212P) (Config)#interface 0/1——进入接口模式。_pvid怎么配置

(2012.04.02-2012.07.06)九十六天的学习小记-程序员宅基地

(2012.04.02-2012.07.06)九十六天的学习小记 距离上次的记录又是九十多天了,四月到七月,有半个学期的时间吧,看着记录,这学期的计划多变,主要还是因为实际情况也不断在变化,所以也不得不去变,ACM,java,数据库,网络编程,SRP的东西,都初步接触了一下了,近期,写blog是越来越少了,为什么呢?好像是因为忙于考试周的复习,接下来的工作,也不知道自己还会不会抽空去写写b

位运算实现加减乘除运算-程序员宅基地

我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最底层都只是对0101的存储和运算。因此,了解位运算有助于提升我们对计算机底层操作原理的理解。_位运算实现加减乘除

随便推点

NVcaffe源码阅读——Layer-程序员宅基地

nvcaffe的Layer.hpp/cpp在功能上与以前的caffe相比有一些明显改变。nvcaffe对Layer.hpp的代码进行了拓展,提供了很多便利的新特性。

源码阅读(6):Java中主要的List、Deque结构——LinkedList集合(上)_java deque和linklist-程序员宅基地

典型的数据结构中,对于“表”结构的定义是:在一维空间下元素按照某种逻辑结构进行线性连接排列的数据结构(一对一)。java中集合定义中所包括的链表(ArrayList)、链表(LinkedList)、各种队列(Queue/Deque)、栈(Stack)等都满足这样的定义。本文及后续的几篇文章中将介绍Java集合结构中关于List接口、Queue接口、Set接口下的重要实现类。注意,关于java.util.concurrent包下对于List接口、Queue接口和Set接口实现类的介绍,将在后续专门的文章介绍_java deque和linklist

共轭梯度法的简单直观理解_共轭梯度下降法_beidou111的博客-程序员宅基地

共轭梯度法的简单直观理解共轭梯度法可以看作是梯度下降法(又称最速下降法)的一个改进。梯度下降法x移动的方向正是函数f的负梯度方向,这代表了局部上f减小最快的方向。但是局部上减小最快的方向并不代表全局上指向最终解的方向。所以梯度下降法会出现像醉汉下山一样走出zig-zag的路线。如下图为什么会走出这一Z形线呢?因为梯度下降的方向恰好与f垂直,也就是说和等高线垂直。沿着垂直于等高线的方向,一定能让函数减小,也就是下了一个台阶。但是最快下台阶并不意味着最快到达目标位置(即最优解)。为了修正这一路线,采_共轭梯度下降法

根据entry的value对Map进行排序_entry 排序_码上有对象啊的博客-程序员宅基地

根据entry的value对Map进行排序1)利用stream// 用list收集entry List<Map.Entry<Integer, Integer>> entries = map.entrySet() .stream().sorted((o1, o2) -> o2.getValue().compareTo(o1.getValue())) .collect(Collectors.toList())_entry 排序

【com】require和import,动态和静态_import动态引入和静态引入-程序员宅基地

一、require和import的区别require用于读取并执行js文件, 并返回该模块的exports对象, 若无指定模块, 会报错。CommonJS规范加载模块是同步且动态的, 只有加载完成, 才能执行后续操作。可以在代码中引入import用于引入外部模块, 其他脚本等的函数, 对象或者基本类型。import属于ES6的命令, 它和require不一样, 它会生成外部模块的引用而不是加载模块,等到真正使用到该模块的时候才会去加载模块中的值。二、动态引入和静态引入webpack支持node的c_import动态引入和静态引入

如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?-程序员宅基地

https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_ansid=6579491774144708872&app_id=26这个实现起来不难,无非就是两步,先利用python解析pdf文件,提取出文本内容,再将文本内容写入到txt文件中,下面我大概介..._python 修改pdf text