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 java客户端代码

package com.pig.test.mqtt; import com.ibm.mqtt.MqttClient; import com.ibm.mqtt.MqttException; impor...

MQTT实现消息推送

MQTT实现消息推送   MQTT实现消息接收(接收消息需实现MqttSimpleCallback接口并实现它的publishArrived方法)必须注册接收消息方法 mqttClient....

MQTT C Client实现消息推送(入门指南)

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,通过MQTT协议,目前已经扩展出了数十个MQTT服务器端程序,可以通...

单片机MQTT实现推送简单使用

1、准备条件: a)硬件:ATMEGA644PA 8位单片机 b)下载MQTT c语言的包: C/C++ MQTT Embedded clients https://www.eclipse.o...

MQTT协议之使用Future模式订阅及发布(使用fusesource mqtt-client实现)

fusesource版本:mqtt-client-1.10.jar 下载地址:https://github.com/fusesource/mqtt-client fusesource提供三...

MQTT连接服务器发送和接收数据

这里使用MQTTClient.framework这个第三方框架。 在工程中导入MQTTClient.framework这个框架,见附件。 .h文件 #import #im...

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

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

MQTT初体验mosquitto的java实现

上节简单描述了mosquitto的安装,与测试,本节继续MQTT使用java语言如何简单调用; 以上例子原型来源于网络,经过自己调试可用,目前仅限于代码的示例; 类: ServerMQTT Clie...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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