前言

这一段时间在翻看MQTT-SN的协议,对针对不依赖于TCP传输的MQTT协议十分感兴趣,总是再想着这货到底是怎么定义的。一系列文章皆有MQTT-SN 1.2协议所拼装组成,原文档地址: MQTT-SN_spec_v1.2.pdf

MQTT-SN文档分为7个部分,我直接按照从前到后的顺序,直接组装成四个小篇。嗯,若放在一篇文章中,文字太长,造成排版难度。

非直译,完全按照自己理解整理而成,请知晓。

版本变迁历史

  1. 2007-11-29 1.0版本
  2. 2008-6-5 1.1版本,增加休眠设备支持
  3. 2011-5-20 1.2版本
  • 增加消息长度255字节支持
  • 增加转发封装支持
  • 增加返回代码"0x03 Rejected, not supported"
  • ReturnCode 增加到WILLTOPICRESP和WILLMSGRESP消息中

MQTT-SN名称由来

原名是MQTT-S,但会引起人们的误解,因此更名成MQTT-SN:

As part of the job of applying the same or similar license terms to the MQTT-S specification as those on the MQTT specification, we are proposing a small name change. The new name would be MQTT-SN, standing for exactly the same long name, MQTT for Sensor Networks. Some people had assumed that the S in MQTT-S stood for secure, so we hope this change will avoid that confusion. -- Ian Craggs

MQTT-SN存在目的

MQTT for Sensor Networks is aimed at embedded devices on non-TCP/IP networks, such as Zigbee. MQTT-SN is a publish/subscribe messaging protocol for wireless sensor networks (WSN), with the aim of extending the MQTT protocol beyond the reach of TCP/IP infrastructure for Sensor and Actuator solutions.

针对适配传感装置(缩写为SA)的特定版MQTT协议,一般运行在嵌入式电池驱动的电子元件中,传输通过基于IEEE 802.15.4规范无线低速网络构成的无线传感网络(WSN),同样具有企业级别特性具有以数据为核心的(data-centric)订阅/发布特性。

总之,针对低功耗、电池驱动、处理存储受限的设备、不支持TCP/IP协议栈网络的电子器件而定制,比如常见的ZigBee(或XBee),对所依赖的底层传输网络不可知,但只要网络支持双向数据传输和网关,都是可以支持较为上层的MQTT-SN协议传输。比如简单数据报服务,只要支持一个源端点发送数据到一个特定目的地端点,这对支持MQTT-SN协议,就足够了。广播数据报传输服务也是必须的用于网关和终端的自动发现流程。为了降低广播风暴,MQTT-SN定义了广播路径深度(广播范围或广播半径)。

一些名词和术语

  • topic id,主题标识符,两个字节16位表示的自然数(java语言short类型,0-65535范围),对应于主题topic name
  • 网关/服务器(gateway/server),在MQTT-SN中统一称之为网关,主要处理和MQTT-SN客户端的交互,缩写为网关
  • MQTT-SN终端和客户端(client),统一称之为客户端,其实也是嵌入式传感设备,或电子元件,资源受限,在无线区域个人网中运行
  • IEEE 802.15.4,完整栈的整个数据上限为128个字节,一般选择UDP(相比20个字节的TCP协议,UDP报文头部仅仅需要8个字节)协议传输数据
  • 低速网络/当前网络,指的是LR-WPAN(low-rate wireless personal area network,),低速无线个人区域网络

MQTT-SN VS MQTT

尽管MQTT-SN被设计成尽可能接近于MQTT,但那些低功耗、电池驱动、资源受限的设备所在网络场景为低速带宽、高连接失败、物理层数据包上线为128字节。文档提出了以下不同点:

  1. CONNECT消息被拆分成三个消息(CONNECT,WILLTIPIC,WILLMSG),后两者用于客户端传递遗嘱主题和遗嘱消息等
  2. 在PUBLISH消息中主题(topic name)被替换成两个字节长度自然数(topic id),这个需要客户端通过注册流程进行获取对应的topic id
  3. 预定义(提前定义)topic id和topic name,省去中间注册流程,客户端和网关要求提前在其固件中指定
  4. 协议引入的自动发现机制可帮助客户端发现潜在的网关。若存在多个网关,彼此可协调是为主从互备或者负载均衡
  5. "clean session"即可作用于订阅持久化,也被扩展作用于遗嘱特性(遗嘱主题和遗嘱消息)
  6. 针对休眠设备增加离线保活机制支持,当有消息时代理需要缓存,客户端被唤醒时再发送

MQTT-SN架构示意

在MQTT-SN架构图中,存在三种组件:

  1. MQTT-SN 客户端
  2. MQTT-SN 网关,可单独存在,也可以被集成到MQTT服务器中。需要承担MQTT-SN和MQTT协议之间的转换工作
  3. MQTT-SN 转发器,负责转发当前客户端数据到不可直接访问的网关上去,针对客户端而言网关不可直接访问时,转发器作用就凸显。转发器封装MQTT-SN消息转发给网关,解封来自网关的消息发送给客户端。网关不能够篡改原始数据。

MQTT-SN传输网关

MQTT-SN网关传输方式,下面的图片一目了然。 

  1. 透明网关,会为每一个客户端都建立一个TCP连接到MQTT服务器的通道,这样会较为耗费网关网络资源,但模型简单
  2. 聚合网关,只建立一条TCP连接通道到MQTT服务器上,所有的客户端共享一个通道,很经济的说。

网关需要抉择哪些消息需要和远程的MQTT Server进行交互,比如只选择客户端发送的PUBLISH、SUBSCRIBLE消息等。

小结

上面简单介绍了MQTT-SN,下面将会介绍MQTT-SN消息头部和格式。

MQTT-SN协议乱翻之简要介绍的更多相关文章

  1. MQTT-SN协议乱翻之小结篇

    前言 这里简单做一些小结和对比,针对前面的协议翻译部分,一阶段的学习完结. MQTT-SN VS MQTT MQTT-SN基于MQTT原有语义,但做了很多的调整.比如: 一个CONNECT消息被拆分为 ...

  2. MQTT-SN协议乱翻之功能描述

    前言 紧接上文,这是第三篇,主要是对MQTT-SN 1.2协议进行总体性功能描述. 嗯,这一部分可以结合着MQTT协议对比着来看. 网关的广播和发现 网关只能在成功连接到MQTT Server之后,才 ...

  3. MQTT-SN协议乱翻之消息格式

    前言 紧接着上篇初步介绍,本文为第二篇,主要梳理MQTT-SN 1.2协议中定义的消息格式. 通用消息格式 消息头 其它可变部分 2/4字节表示 N字节组成 消息头部 长度 消息类型 1或3个字节 1 ...

  4. MQTT-SN协议乱翻之实现要点

    前言 本篇是MQTT-SN 1.2协议最后一篇翻译了,主要涉及实现要点,很简短. 需要支持QoS 值为 -1 QoS虽默认设置有0,1,2三个值,但还有一种情况其值为-1.来自客户端的PUBLISH消 ...

  5. HTTP协议简要介绍

    1. 网络基础 TCP/IP 通常使用的网络是在TCP/IP协议簇基础上运作的. HTTP属于它内部的一个子集. TCP/IP分为4个层次, 应用层, 传输层, 网络层, 链路层. (Applicat ...

  6. 关于HTTP协议与HTTP状态码的简要介绍

    在互联网时代HTTP协议的重要性无需多言,对于技术岗位的同学们来说理解掌握HTTP协议是必须的.本篇博客就从HTTP协议的演进.特性.重要知识点和工作中常见问题的总结等方面进行简单的介绍.理解掌握了这 ...

  7. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  8. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  9. [转]java加密算法简要介绍

    本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法.     BASE64编码算法不算是真正的加密算法.     MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密 ...

随机推荐

  1. Energy Modes能量管理模式

    1  EM0 运行模式 默认模式; 2  EM1 休眠模式 休眠模式 主处理器停止,片上系统模块运行; 3  EM2 深度休眠 只有异步或低频外设运行; 4  EM3 停止模式 与EM2相比,低频晶振 ...

  2. Kettle变量和自己定义java代码的实例应用

    1  kettle.properties參数配置数据源连接和FTP连接 因为測试环境和生产环境中数据库连接FTP等配置会在部署过程中变更,所以预先定义成配置项,在配置文件里改动.这样測试和公布将会变得 ...

  3. vmware下ubuntu不能上网 => 恢复默认虚拟网络

    1.关闭虚拟机ubuntu 2.打开:编辑=> 虚拟网络编辑器 3.打开后点击左下角恢复默认 4.重启ubuntu就可以了

  4. 【转】WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  5. perl 内置操作符 $^O -判断操作系统环境

    今天看bowtie2的源代码的时候,发现有这样一段用法: my $os_is_nix = $^O ne "MSWin32"; my $align_bin_s = $os_is_ni ...

  6. 根据IP定位城市

    根据IP定位城市:http://www.sucaihuo.com/js/35.html 示例:http://www.sucaihuo.com/jquery/0/35/demo/

  7. URAL 1203 Scientific Conference(贪心 || DP)

    Scientific Conference 之前一直在刷计算几何,邀请赛连计算几何的毛都买见着,暑假这一段时间就做多校.补多校的题目.刷一下一直薄弱的DP.多校假设有计算几何一定要干掉-.- 题意:给 ...

  8. linux系统中RPM包的通用命名规则

    http://blog.csdn.net/kexiuyi/article/details/53292358

  9. [转]ASP.NET MVC 5 -从控制器访问数据模型

    在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里. 在开始下一步前,先Build一下应用程序(生 ...

  10. Tcp/ip实验准备:一个简单的定时器——boost实现

    tcp/ip实验须要在指定的时间查看结果,为了实验方便,做了一个定时器.用法是: 在命令行输入:timer 输入数字之后,计时对应秒数 输入m数字之后.计时对应分钟数(支持小数分钟数) 输入q退出. ...