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

智能推荐

Qt播放常见视频格式的方法-程序员宅基地

Qt Multimedia 模块,其中有个实例Media Player Example源代码位于 ..\Qt5_15\Examples\Qt-5.15.0\multimediawidgets\player 或者 https://doc.qt.io/qt-5/qtmultimedia-multimediawidgets-player-example.html执行后 发现没法运行本地 *.mp4格式解决的方法,很简单,下载完美解码,...

关于一个服务上面多个应用的场景-程序员宅基地

关于一个服务上面多个应用的场景: Timer执行的方法: 服务启动,可能同时启动多个应用,这时侯使用线程挂起让不同的线程休眠一定的时间, int rnd =(int)(Math.random()*60000); Thread.sleep(rnd);第一个进入的线程,临时修改数据库表中的标志,这样其他的线程在判断这个标志的时候,就不能进入操作了,等到第一个线程在休眠剩余差值时间后,在把这个标志值设置成原来的值。保证

linux(ubuntu)设置清华源_linux 配置清华源-程序员宅基地

移步:设置清华源https://blog.csdn.net/CAU_Ayao/article/details/83507338_linux 配置清华源

R语言 - 数据预处理-程序员宅基地

前段时间写数据挖掘作业,用R语言,踩了不少坑,特此记录一下。1. R语言包的加载:library("package_name")建议在windows配合RStudio使用R语言,linux下的支持不太友好。如果显示没有“package_name”这个包,可以在RStudio中使用install.packages("package_name")下载。可能会遇到下载完“package_name”这个包...

简述jvm内存模型及垃圾回收_垃圾回收的调度模型-程序员宅基地

一,java内存模型jvm内存模型见下图:1,程序计数器线程是cpu调度的最小单位,当多线程竞争cpu时间片段时,当线程切换时能正确的切回到指定位置,需要一个计数器记录当前执行的字节码的地址。因此,程序计数器是线程私有的一块较小的内存空间,其可以看做是当前线程所执行的字节码的行号指示器。2,本地方法栈属于线程私有,存放java的本地方法调用,java本地方法指的时native修饰的那..._垃圾回收的调度模型

将r中的数据导出为excel文件_如何把r导出带数字的双引号的名字变成表格-程序员宅基地

1.参考链接 http://bbs.pinggu.org/thread-1096905-1-1.html http://blog.sina.com.cn/s/blog_6d5ee5530101fyt5.html2._如何把r导出带数字的双引号的名字变成表格

随便推点

python可以用break作为变量名_Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】...-程序员宅基地

写在前面的:作为一个控制专业的女研究生,不知道每天在研究什么,但总归逃脱不了码代码的命运。之前也学习过一些C语言、C++,基础嘛,稍稍微有一些。本不想走上码农的道路,天真烂漫的过此生(白日梦过程中......)无数前辈日日教诲:“女生啊、尤其是工科的女生啊、不好找工作。要好好努力才行......”眼真真看着前辈们踏上码代码的路,过着人好、钱多、头发少、死的早的日子。心里默默地有点心动了,这样的生活..._break_1可以在python中当名字嘛

ARCGIS接口详细说明-程序员宅基地

ArcGIS接口详细说明... 11. IField接口(esriGeoDatabase)... 22. IFieldEdit接口(esriGeoDatabase)... 23. IFields接口(esriGeoDatabase)... 24. IRow接口(esriGeoDatabase)... 35. ITable接口(e

matlab读取txt数据保留六位小数,matlab规定小数点保留4位且非科学计数法格式存储txt...-程序员宅基地

经常在表示matlab值时,它总会把一些小于1的大于1000的数使用科学计数法表示。这有时让人看了很不爽,每次把数据写到文本文件中也是很恶。所以每次查来查去,这次解决是这样解决的。1)、前面设置format g;2)、使用fprintf设置格式为%g。二、在小数点后某一位四舍五入,即保留几位小数,也经常用到。1.数值型 roundn—任意位位置四舍五入>>a=123.4567890;&..._matlab写入txt控制小数点位数

什么是Suid Shell? -程序员宅基地

Suid shell是一种可用于以拥有者权限运行的shell。也就是说,如果拥有者是root,那你就可能以root的 身份执行命令。普通的shell文件属性为rwxr-xr-x,拥有者为root,root可读/写/执行这个shell,而其他用户 则只能以自己的权限读和运行它。然而,如果有一个文件属性为rwsr-xr-x的shell,就可以获得文件拥有者权 限;如果文件拥有者是root,那么任何运行了这个s

shell 脚本实现文件的随机无重复筛选_shell实现打包的文件名不重复_打工人小飞的博客-程序员宅基地

在做深度学习实验时,需要训练和测试较多类型的数据,以此来体现网络架构的合理性。不同的数据集数量不一,且列别繁多,在做图像分类实验时,如果人工的去筛选和划分图片,工作量巨大,还容易犯错。作为一名合格的程序员,不会偷懒是万万不行的!废话不多说,直接上代码:#!/bin/bashtrainPath="此处写训练集的路径"validationPath="此处写测试集的路径"# trainPath下的所有_shell实现打包的文件名不重复

Android 中像素px和dp的转化-程序员宅基地

在Android的布局文件中,往往使用dp作为控件的宽度和高度尺寸,但是在Java代码中,调用getWidth()方法获得的尺寸单位却是像素px,这两个单位有明显的区别:dp和屏幕的密度有关,而px与屏幕密度无关,所以使用时经常会涉及到两者之间的互相转化,代码示例如下:public int Dp2Px(Context context, float dp) { final floa...

推荐文章

热门文章

相关标签