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客户端JAVA代码----fusesource mqtt-client

fusesource版本:mqtt-client-1.7-uber.jar 下载地址:https://github.com/fusesource/mqtt-client fusesource提...

MQTT+ActiveMQ实现消息推送(服务器端java实现)

上一篇文章已经介绍了mqtt+activemq实现消息推送移动端的实现,也介绍了利用自带的web console进行消息发布的方法。但是在具体的项目应用中,当我们将需要将该消息推送模块嵌入到一个后台管...

MQTT协议实现Eclipse Paho学习总结一

一、概述 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如,但不仅限于此: 网络代价昂贵,带宽低、不可...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

MQTT协议实现Eclipse Paho学习总结二

http://blog.csdn.net/yangzl2008/article/details/8866066 一、概述 前一篇博客(MQTT协议实现Eclipse Paho学习总结一...

MQTT初体验mosquitto的java实现

上节简单描述了mosquitto的安装,与测试,本节继续MQTT使用java语言如何简单调用; 以上例子原型来源于网络,经过自己调试可用,目前仅限于代码的示例; 类: ServerMQTT Clie...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java用mqtt收发消息

import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient...
  • PZ0605
  • PZ0605
  • 2015年04月17日 10:07
  • 7204

Android APP必备高级功能,消息推送之MQTT

本文已授权微信公众号《鸿洋》原创首发,转载请务必注明出处。 1. Android端实现消息推送的几种方式 轮询:客户端定时向服务器请求数据。伪推送。缺点:费电,费流量。 拦截短信消息。服务器需要向客户...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MQTT协议实现(一)
举报原因:
原因补充:

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