文档章节

MQTT 折腾笔记----协议简读

打杂程序猿
 打杂程序猿
发布于 2013/04/25 03:39
字数 1001
阅读 5.7K
收藏 22

##导言##

第一次听说MQTT 这玩意是由于要找个做手机推送的方案,后来发现,JPush这家伙做的实在不错,然后就不折腾了,最近,忽然心血来潮,把MQTT 协议 看了一遍,网上的很多中文的资料都是坑爹的,全部都是说MQTT 做推送,我按图索骥全部都是转载翻译自老外2010写的这篇文章实在汗颜...后来,我改用全英文关键字,搜索总算发现了MQTT 的用处.如果,你不愿意看我的长篇大论我建议你去wiki那里看下 MQTT 详细介绍

##MQTT 解决什么事情?##

对于需要要了解一个什么玩意,我们需要这玩意,解决我们什么事情.从WIKI 来看MQTT 协议主要解决的是机器与机器之间数据通信,各位想到什么没?有接触过物联网的话,可能有所了解了,当我们所有机器都能在一个网络上面分配的一个地址的话,由于,设备间的性能差异,低到可能就是一个插座,而你需要这个插座能进行数据通信,例如,控制这个插座的开-闭这类的,就需要一个极其轻量级的协议而MQTT 协议就是为此目的诞生的.

比较有趣的是,MQTT这个协议在1999 年就有了最新的版本是v3.1(2010/12/06),其适用于如下但不限于这几点:

  1. 即时传输的轻量级协议
  2. 专门设计用于低带宽或者高昂的网络费用
  3. 具备三种服务品质层级

##MQTT 协议简读## MQTT 协议相对某些协议来说,实在是简短的令人发指,整个协议只用42页就说完了.

MQTT v3 到 v3.1 有几点比较重要的变化个人感觉最重要的是从ascii 码转向 utf8的支持,不过我估计没人用过v3 所有我这里不多说了,有兴趣的,请翻阅一下协议文档.....

###传输开销的比较### MQTT 最引以为豪的就是最小的2 byte 头部传输开销.我们看下其他流行的协议的message format的设计

  • XMPP 消息体用的是xml

|--------------------| | <stream> | |--------------------| | <presence> | | <show/> | | </presence> | |--------------------| | <message to='foo'> | | <body/> | | </message> | |--------------------| | <iq to='bar'> | | <query/> | | </iq> | |--------------------| | ... | |--------------------| | </stream> | |--------------------|

HTTP-message = Request | Response ; HTTP/1.1 messages

还有很多协议,就不一样细说了,就举两个我比较了解的.就目前通用的协议来看很少有比MQTT 还要低的传输开销了.如果,你有了解的希望介绍一下.

###消息体的设计简说###

<table class="bits"> <thead> <tr> <th>bit</th> <th align="center">7</th> <th align="center">6</th> <th align="center">5</th>

		<th align="center">4</th>
		<th align="center">3</th>
		<th align="center">2</th>
		<th align="center">1</th>
		<th align="center">0</th>
	</tr>

</thead>
<tbody>
	<tr>
		<td>byte 1</td>
		<td align="center" colspan="4">Message Type</td>
		<td>DUP flag</td>
		<td align="center" colspan="2">QoS level</td>

		<td>RETAIN</td>
	</tr>
	<tr>
		<td>byte 2</td>
		<td align="center" colspan="8">Remaining Length</td>
	</tr>
</tbody>

</table>

第一个byte 用于说明消息体的信息.

第二个byte 用于传输我们需要传输的数据.

更多详情请看协议 msg-format 部分

接下来,结合一个最简例子来对这个消息体进行说明

##MQTT 最简例子## 为了方便进行MQTT的了解与使用,目前MQTT的资料极其匮乏,也找不到什么给力的例子所以,随着我研究的深度,来慢慢提高这些例子的难度.

准备

服务端:

客户端:

例子地址:https://github.com/youxiachai/mqttlesson/tree/master/LessonOne java 版本暂未提供,晚些时候写个android的客户端....

###例子设计### 为了简单,方便理解,这个例子:

  1. 服务器是一个广播模型

  2. 对于订阅/发布没有限制使用topic(主要是为了后面的知识做准备)

  3. 订阅者获取到一次发布者消息就断开连接

  4. 首先服务端启动,接着启动 mqttClientSub

例子流程图: clientA ->(connect) server

  1. 启动发布者:mqttClientPub

例子流程图: clientB ->(publish) server ->(pub) clientA

以上就是整个例子的流程

© 著作权归作者所有

上一篇: Java Formatter 心得
下一篇: Hexo 主题制作
打杂程序猿

打杂程序猿

粉丝 135
博文 41
码字总数 51561
作品 3
广州
程序员
私信 提问
加载中

评论(3)

l
leeks
哥们你写的android的例子呢
打杂程序猿
打杂程序猿 博主

引用来自“komagt”的评论

可不可以肤浅的认为只是小数据轮询 ?

轮询只是一种形式而已,mqtt就是一个协议而已,没有别的。。。
komagt
komagt
可不可以肤浅的认为只是小数据轮询 ?
TCP/IP实时通信相关协议

一步一步学WebSocket (一) 初识WebSocket 一步一步学WebSocket(二) 使用SuperWebSocket实现自己的服务端 .NET 的 WebSocket 开发包比较 Websocket全讲解。跨平台的通讯协议!!基于websocket...

boonya
2016/05/10
155
0
MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用标签: MQTT物联网Mosquitto2014-09-13 16:30 27023人阅读 评论(15) 收藏 举报分类: 物联网学习笔记(37) 版权声明:本文为博主原创文章...

baiwengong
2016/01/07
412
0
[AliOS-Things 之 MQTT] 接入阿里云物联网套件

阿里开发 AliOS-Things 的主要动机,应该就是让别的商家利用 AliOS-Things 快速接入阿里云平台,所以我们可以直接利用 AliOS-Things 提供的 mqttapp 示例进行快速接入。 关于 AliOS 的系列博...

行者武松
2018/06/12
0
0
filecoin技术架构分析之十五:filecoin源码分析之节点运行逻辑

我是先河系统CTO杨尉,欢迎大加关注的的Github: waynewyang,本文是filecoin技术架构分析系列文章第十五章源码分析之节点运行逻辑。 分析基于的源码版本:go-filecoin master a0598a54(2019年...

深入浅出区块链
2019/03/10
0
0
[1] MQTT,mosquitto,Eclipse Paho----入门

MQTT,mosquitto,Eclipse Paho这三个单词陌生而又神秘。那么这三个单词究竟是什么意思,代表了什么技术,他们之间有关联吗?不着急,请听笔者慢慢给大家分享。 (1)MQTT(英语全称,Message...

chancein007
2015/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Simple-Html-Dom解析HTML文件

要想获得网页源码里的指定内容需要用到正则表达式!正则表达式,让我猝不及防,因为之前没有接触过,用起来非常的吃力! 在Java中,有大牛封装好的库,我使用的是Jsoup。将Jsuop的Jar包引入项...

owenzhang24
10分钟前
21
0
在PHP中转换日期格式

我正在尝试将日期从yyyy-mm-dd为dd-mm-yyyy (但在SQL中不是); 但是我不知道date函数如何需要时间戳,并且我无法从该字符串获取时间戳。 这怎么可能? #1楼 如果您想避免strtotime转换(例...

技术盛宴
12分钟前
32
0
mina服务端检测客户端心跳实例

服务端代码 public class MyServer { /** 30秒后超时 */ private static final int IDELTIMEOUT = 30; /** 15秒发送一次心跳包 */ private static final int HEARTBEATRATE = 15; /** 心跳包......

whoisliang
14分钟前
41
0
mac几个知识点。

用mac必须知道下面几个知识。 复制、粘贴。 command + c 复制, command+option+v 粘贴。 剪切。 首先选中要剪切的文件command + c 复制,然后在要粘贴的目录 command+option+v 粘贴。 bmg文...

王坤charlie
14分钟前
53
0
ActiveMQ学习之Spring整合ActiveMQ------>监听配置

一、pom <dependencies> <!--activemq--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.9<......

冥焱
20分钟前
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部