MQTT协议实现(一)

原创 2015年11月17日 17:34:07

MQTT协议实现(一)

11年的时候,记录写过一篇文章《采用MQTT协议实现android消息推送》,那个时候,只是为了实现推送的功能,没有仔细阅读过MQTT协议的内容。最近看同事又重新提起这个协议,于是就心血来潮去实现一下。MQTT协议是在tcp协议之上的,是基于TCP/IP的一个应用协议,正好可以验证一下自己之前整理的基于tcp的RHSocket框架。

MQTT协议简述

MQTT(Message Queue Telemetry Transport),遥测传输协议,提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),对于移动互联网的场景的消息推送十分有效。

特点如下:

1.使用发布/订阅消息模式,提供一对多的消息发布,接触应用程序耦合。

2.对负载内容屏蔽的消息传输。

3.使用TCP/IP提供网络连接。

4.有三种消息发布服务质量:“至多一次”,“至少一次”,“只有一次”

5.传输数据小(最小固定长度的头部是2个字节),协议交换最小化,以降低网络流量。

具体的协议内容可以从ibm网站学习:http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html

官方下载地址: http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/MQTT_V3.1_Protocol_Specific.pdf

也可以直接阅读网友的博客:http://www.blogjava.net/yongboy/archive/2014/02/07/409587.html

阅读了MQTT的协议内容后,会发现它其实和前面RHSocket框架中提到过的自定义协议内容类似,

协议头(固定头部fixedheader,可变头部variableheader)+内容(内容载体payload)。

固定头部(第一个固定协议字节,可变长度字节)

第一个字节(8位)

固定携带了4个数据内容,message type,dup flag,QoS level,retain。

0 1 2 3 4 5 6 7

第0到3位,这4个bit是message type。

第4位,这1个bit是dup flag。

第5和6位,这2个bit是QoS level。

第7位,这1个bit是retain,预留位。


程序定义如下:

/** message type */
typedef NS_ENUM(UInt8, RHMQTTMessageType) {
    RHMQTTMessageTypeConnect = 1,           //client request to connect to server
    RHMQTTMessageTypeConnAck = 2,           //connect acknowledgment
    RHMQTTMessageTypePublish = 3,           //publish message
    RHMQTTMessageTypePubAck = 4,            //publish acknowledgment
    RHMQTTMessageTypePubRec = 5,            //publish received (assured delivery part 1)
    RHMQTTMessageTypePubRel = 6,            //publish release (assured delivery part 2)
    RHMQTTMessageTypePubComp = 7,           //publish complete (assured delivery part 3)
    RHMQTTMessageTypeSubscribe = 8,         //client subscribe request
    RHMQTTMessageTypeSubAck = 9,            //subscribe acknowledgment
    RHMQTTMessageTypeUnsubscribe = 10,      //client unsubscribe request
    RHMQTTMessageTypeUnsubAck = 11,         //unsubscribe acknowledgment
    RHMQTTMessageTypePingReq = 12,          //ping request
    RHMQTTMessageTypePingResp = 13,         //ping response
    RHMQTTMessageTypeDisconnect = 14,       //client is disconnecting
    RHMQTTMessageTypeReserved = 15          //reserved
};

/** QoS(Quality of Service,服务质量) */
typedef NS_ENUM(UInt8, RHMQTTQosLevel) {
    RHMQTTQosLevelAtMostOnce = 0,               //至多一次,发完即丢弃,<=1
    RHMQTTQosLevelAtLeastOnce = 1,              //至少一次,需要确认回复,>=1
    RHMQTTQosLevelExactlyOnce = 2,              //只有一次,需要确认回复,=1
    RHMQTTQosLevelReserved = 3                  //待用,保留位置
};


可变长度字节(为可变头部和协议内容的长度之和,动态计算获得,最小为1个字节0x7F,最大为4个字节0xFF,0xFF,0xFF,0x7F)

0xff 0xff 0xff 0x7f
如果可变头部和包体内容的数据长度之和大于127,则可变长度字节数需要加长,从原来的1个字节,变为可容纳的字节数,最大为4个字节。

至于为什么不是0xff,http://www.blogjava.net/yongboy/archive/2014/02/07/409587.html中有说明,是MQTT协议规定所致。

可变头部

可变头部,协议中不同的命令,携带的数据内容也不同。http://www.blogjava.net/yongboy/archive/2014/02/09/409630.html

后续通过程序实现分别说明。


包体内容

同上。

具体的内容,已经提供了学习连接,我就不拷贝了,哈哈。

阅读相关的内容后,应该大概了解MQTT协议的字段定义了,下一篇我们从MQTT协议的连接入手,来一步步的学习。

相关代码已经提交到github,https://github.com/zhu410289616/RHMQTTKit



MQTT协议-MQTT协议简介及协议原理

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建...
  • JIESA
  • JIESA
  • 2016年02月04日 15:34
  • 43795

Android开发之利用MQTT协议实现消息的即时推送

Android开发之利用MQTT协议实现消息的即时推送 近来做项目,要用到消息的即时推送,一般情况下,在项目初期,本人都要对项目中遇到的各个问题进行了解剖析以及处理,由于前期的项目中没用到过即时消息推...
  • qq_29196551
  • qq_29196551
  • 2016年05月24日 10:43
  • 16082

MQTT协议应用实例

引子:很久以前就知道MQTT协议了,也知道该协议主要应用到物联网上,具备很多特点,但是一直是处于不知其意状态。今天有幸看到了一篇博文,然后自己将该博文里面的内容操作了一遍,同时将手上的CC3200开发...
  • pengpengjy
  • pengpengjy
  • 2017年05月14日 22:41
  • 4003

MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级...
  • xukai871105
  • xukai871105
  • 2014年09月13日 16:30
  • 168490

Android基于MQTT协议实现的推送功能

前段时间公司需要Android端的手机群推功能,我们就通过MQTT来实现了该功能。 MQTT的官网如下 http://mqtt.org/ 关于系统的主要架构就不详述了。这关系的到职业道德问题,在这里只...
  • boonya
  • boonya
  • 2016年05月16日 16:03
  • 3572

[Android实例] MQTT消息推送,即时通讯

该篇文章从eoeAndroid搬迁过来的,原文地址:[Android实例] MQTT消息推送,即时通讯 前几天刚学习了MQTT服务器搭建和如何使用MQTT进行消息推送,不清楚的同学可以查看[Andro...
  • krubo1
  • krubo1
  • 2016年01月04日 16:36
  • 3167

即时通讯-Android推送方案(MQTT)

1.什么是MQTT协议MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。有可能成为物联网的重要组成部分。该协议支持所有...
  • u012987546
  • u012987546
  • 2016年11月03日 13:59
  • 2434

Android mqtt即时通讯方案

鼓捣了一个多月的即时通讯项目,暂时告一段落,其实对于Android的IM以前有用TCP做过,但仅限于文字与图片,新的项目加入了语音聊天,使用WebRTC相关的技术。 此次通讯协议是MQTT,也是第一...
  • lv_ws
  • lv_ws
  • 2015年12月14日 15:20
  • 5207

基于MQTT协议的消息传输

基于MQTT协议的消息传输为什么MQTT?之前刚写了一篇关于socket的文章,为什么又来一个MQTT?因为MQTT协议就是socket接口实现的啊(socket和MQTT只是层级不一样而已),并且感...
  • dhfsh
  • dhfsh
  • 2017年03月29日 18:00
  • 1456

java用mqtt收发消息

import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient...
  • PZ0605
  • PZ0605
  • 2015年04月17日 10:07
  • 8714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MQTT协议实现(一)
举报原因:
原因补充:

(最多只允许输入30个字)