MQTT消息传输机制(协议解读与调用实例)
mqtt用法命令-概述说明以及解释

mqtt用法命令-概述说明以及解释1.引言1.1 概述MQTT是一种轻量级的通讯协议,它被设计用于在低带宽和不稳定的网络环境下进行高效的通讯。
MQTT代表消息队列遥测传输,它贯穿了许多领域,例如物联网、实时数据传输等。
MQTT的主要特点是简单、灵活和可靠。
MQTT协议由IBM开发,最早用于监测石油管道网络的状况。
它基于发布-订阅模式,其中包含两个主要角色:发布者(发布消息)和订阅者(接收消息)。
这个模式允许多个客户端订阅特定的主题,并接收与主题相关的消息。
实际上,发布者和订阅者之间没有直接联系,它们通过MQTT 代理(也叫做broker)进行通讯。
MQTT协议在资源受限的设备上运行良好,如传感器和嵌入式系统。
它使用了轻量级的消息头,使得能够在低带宽和不稳定的网络环境下发送和接收消息。
此外,MQTT还支持三种不同的服务质量等级(QoS):0级是最低的,消息不可靠且最低延迟;1级提供至少一次的消息传递,确保消息到达,但可能重复;而2级提供恰好一次的消息传递,确保消息只会被传递一次。
MQTT的用法和命令非常简单,它定义了一些基本的命令,如连接、发布、订阅和断开连接等。
这些命令可以通过网络发送给MQTT代理,从而实现设备间的通讯。
除此之外,MQTT还定义了一套规范,用于确定客户端和代理之间的行为,如消息格式和连接参数等。
总之,MQTT是一种非常适合在限制资源和不稳定网络环境下使用的通讯协议。
它的简单性、灵活性和可靠性使得它成为物联网和实时数据传输等领域的理想选择。
接下来,我们将更详细地介绍MQTT的基本概念和原理,以及它在不同应用场景下的使用方法和命令。
文章结构旨在为读者提供一个清晰的框架,以便他们能够更好地理解和阅读整篇文章。
下面是本文的文章结构:1. 引言- 1.1 概述:介绍MQTT协议的背景和意义,以及在物联网中的应用广泛程度。
- 1.2 文章结构(本节):介绍本文将要涵盖的各个部分和章节。
- 1.3 目的:说明本文的目标和意图,以及对读者的价值。
MQTT协议详解

MQTT协议详解MQTT协议是一种轻量级的消息传输协议,被广泛应用于物联网(IoT)领域。
MQTT协议的设计目标是在低带宽、不稳定网络环境下提供可靠且高效的消息传输机制。
它采用发布-订阅模型,支持多个客户端与服务器之间的消息交互。
MQTT协议的核心有三个组件:发布者(Publisher)、订阅者(Subscriber)和代理服务器(Broker)。
发布者负责发布消息,而订阅者需要订阅感兴趣的消息。
代理服务器则负责接收并分发消息。
1.轻量级:MQTT协议采用了精简的协议头,协议报文大小只有2字节,以减少网络流量和传输开销。
2.异步通信:MQTT的通信是异步的,即发布者发送消息后不需要等待订阅者的响应,可以继续执行其他任务。
4. QoS级别:MQTT提供了三个不同的服务质量级别(Quality of Service,QoS):最多一次(At Most Once)、至少一次(At Least Once)和恰好一次(Exactly Once),可以根据需求选择合适的级别。
5.低能耗:MQTT协议的设计考虑了移动和低功耗设备的特点,使用简单的协议头和较少的网络资源,使得在资源受限的设备上能够高效运行。
6.支持连接断开和重新连接:如果网络连接断开,MQTT协议可以自动重新连接并保持消息的持久性。
7.安全性:MQTT协议支持传输层安全协议(TLS)进行通信加密,以保证数据的安全性。
总体来说,MQTT协议是一种可靠、灵活且高效的消息传输协议,特别适用于物联网领域中大量设备之间的通信。
它在保证可靠性和低能耗的前提下,提供了灵活的消息传递模式和多种服务质量级别的选择。
通过使用MQTT协议,可以实现设备之间的实时通信、数据采集和远程控制等功能,为物联网应用提供了良好的基础支持。
mqtt通信机制

mqtt通信机制MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,被广泛应用于物联网(IoT)领域中的设备通信。
MQTT协议具有连接简单、传输可靠、节能省电等特点,可以为设备间通信提供高效、稳定、快速的方式。
一、MQTT协议的基本原理MQTT协议基于发布/订阅(publish/subscribe)模型,设备之间通过一个中间代理服务器(broker)进行消息的传递。
发布者将消息发布到指定主题(topic)上,订阅者在订阅该主题后,就可以接收到该主题上的消息。
MQTT协议中的主题是一个字符串,可以类比于邮件中的主题,用来区分不同类型的消息。
MQTT协议中的消息可以分为三种类型:发布消息、订阅消息和PINGREQ/PINGRESP消息。
发布消息用于发送数据,订阅消息用于订阅主题,PINGREQ/PINGRESP消息用于保持连接。
二、MQTT协议的连接在MQTT协议中,设备与broker之间通过TCP/IP协议建立连接,设备向broker发送连接请求,请求格式如下:CONNECT报文格式:| 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | N字节 ||-------|-------|-------|-------|-------|-------|| 0x10 | Length | Flags | Keep Alive | Protocol Name | Protocol Level |连接成功后,broker会向设备发送CONNACK消息,表示连接已经建立。
三、MQTT协议的QoSMQTT协议中的QoS(Quality of Service)可以控制消息的传递质量,包括三个等级:QoS 0:最多发送一次,不进行重传,消息传输效率最高,但不保证消息一定能够到达接收端。
QoS 1:至少发送一次,确保消息至少被接收端收到一次,但是可能会出现重复消息的情况。
linux下mqtt的使用实例

linux下mqtt的使用实例在Linux操作系统下,使用MQTT(Message Queuing Telemetry Transport)协议进行通信是一种高效和可靠的方式。
MQTT是一种轻量级的消息传输协议,广泛应用于物联网和传感器网络等领域。
本文将以中括号内的内容为主题,为您介绍在Linux下如何使用MQTT。
1. MQTT简介和环境搭建MQTT是一个基于发布/订阅模式的消息传输协议,它使用TCP/IP协议进行通信。
在开始之前,您需要确保在Linux系统上已经正确安装了MQTT broker(例如Eclipse Mosquitto)和相应的MQTT客户端,您可以通过包管理器进行安装。
2. MQTT连接和认证MQTT使用客户端-服务器架构进行通信。
在Linux上使用MQTT,您需要使用MQTT客户端连接到MQTT broker,并且可能需要进行身份验证。
要连接到MQTT broker,可以使用以下命令:mosquitto_pub -h broker地址-p 端口号-u 用户名-P 密码-t [主题] -m "消息内容"使用-m选项可以指定发送的消息内容,-t选项用于指定主题。
3. 发布和订阅主题MQTT通过发布-订阅模式进行通信,发布者将消息发送到特定的主题,而订阅者可以订阅感兴趣的主题以接收消息。
要发布一个主题,可以使用以下命令:mosquitto_pub -h broker地址-p 端口号-u 用户名-P 密码-t [主题] -m "消息内容"要订阅一个主题,可以使用以下命令:mosquitto_sub -h broker地址-p 端口号-u 用户名-P 密码-t [主题]这将使您获得对特定主题的实时订阅。
4. MQTT消息保留和清除会话MQTT允许将消息保留在broker上,以便新的订阅者可以获取最新的消息。
要发布一个保留消息,可以使用以下命令:mosquitto_pub -h broker地址-p 端口号-u 用户名-P 密码-t [主题] -m "消息内容" -r使用-r选项表示发布的消息是保留消息。
mqtt协议技术要求_概述及解释说明

mqtt协议技术要求概述及解释说明1. 引言1.1 概述MQTT(Message Queuing Telemetry Transport)协议是一种轻量级的、开放的、基于发布/订阅模式的消息传输协议。
它最初由IBM开发,旨在解决低带宽高延迟网络环境下的物联网通信需求。
MQTT已成为物联网领域中广泛应用的协议之一,其简单、灵活且可靠的特点使得它适用于各种场景,包括家庭自动化、工业监测和农业物联网等。
本文将对MQTT协议技术要求进行概述与解释说明。
首先,我们将介绍本文结构以及文章各部分的目的;然后,我们将从背景与起源、基本原理以及特点与优势三个方面来概述MQTT协议技术要求;接下来,我们会详细解释连接建立与断开规范、消息发布与订阅规范以及主题过滤规范与消息路由机制这三个方面;最后,我们将通过家庭智能化控制系统、工业领域实时数据监测系统和农业物联网远程监控系统这三个应用案例来分析MQTT在物联网中的具体应用。
最后,我们将总结本文要点和主要观点,同时展望MQTT的未来发展趋势。
通过对MQTT协议技术要求的概述与解释说明,我们旨在帮助读者全面了解MQTT协议的基本原理和特性,掌握其在物联网中的应用方法与技巧,并为未来的研究与开发提供参考和启示。
下面让我们开始探索MQTT协议技术要求的详细内容。
2. MQTT协议技术要求概述2.1 MQTT协议背景与起源MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,主要用于设备之间的消息传递。
它最初由IBM开发,旨在解决物联网中设备间通信的需求,并于1999年发布了第一个版本。
MQTT协议因其简单、可靠和高效的特点,在物联网领域得到了广泛应用。
它支持低带宽和不稳定网络环境下的通信,并提供灵活的消息传输机制,使得各种类型的设备能够快速连接和交换数据。
2.2 MQTT协议基本原理MQTT协议基于发布/订阅模式(Publish/Subscribe),包含两个核心组件:发布者(Publisher)和订阅者(Subscriber)。
MQTT协议简介及协议原理

MQTT协议简介及协议原理MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,最初由IBM开发,用于在低带宽、不稳定网络环境下传输数据。
它被广泛应用于物联网(IoT)领域,特别适用于传输小型数据包。
一、协议概述MQTT协议基于发布/订阅模式,由发布者(Publisher)和订阅者(Subscriber)组成。
发布者将消息发布到特定的主题(Topic),而订阅者则通过订阅相应的主题来接收消息。
这种解耦的方式使得MQTT协议在分布式系统中具有优势。
二、协议特点1. 轻量级:MQTT协议采用二进制消息格式,协议头部开销小,适用于低带宽、高延迟的网络环境。
2. 灵活性:支持多种消息质量等级(QoS),可以根据实际需求选择消息传输的可靠性。
3. 可靠性:MQTT协议支持消息持久化,确保消息传输的可靠性和一致性。
4. 低功耗:MQTT协议设计用于低功耗设备,可以在资源受限的设备上运行。
5. 安全性:MQTT协议支持TLS/SSL加密,保障数据传输的安全性。
三、协议原理1. 连接建立:- 客户端与MQTT服务器建立TCP连接。
- 客户端发送CONNECT报文给服务器,包含协议版本号、客户端标识符等信息。
- 服务器响应CONNACK报文,表示连接建立成功或失败。
2. 发布消息:- 客户端发送PUBLISH报文给服务器,指定主题和消息内容。
- 服务器将消息发送给所有订阅了该主题的订阅者。
- 服务器可以选择将消息持久化,以便在订阅者离线时仍能接收到消息。
3. 订阅主题:- 客户端发送SUBSCRIBE报文给服务器,指定订阅的主题和消息质量等级。
- 服务器响应SUBACK报文,表示订阅成功或失败。
- 服务器将发布到订阅主题的消息发送给订阅者。
4. 取消订阅:- 客户端发送UNSUBSCRIBE报文给服务器,取消对某个主题的订阅。
- 服务器响应UNSUBACK报文,表示取消订阅成功或失败。
mqtt 底层原理的实现 调用 socket

mqtt 底层原理的实现调用 socketMQTT,一种轻量级的发布/订阅模型协议,广泛应用于物联网(IoT)场景中。
本篇文章将深入探讨MQTT协议的底层原理,并展示如何通过Socket实现其功能。
一、MQTT协议原理MQTT协议基于TCP/IP网络通信协议,是一种发布/订阅模型的消息传输协议。
它具有以下特点:1. 轻量级:MQTT协议相较于其他协议(如Kafka、RabbitMQ 等)在传输效率、内存占用等方面具有显著优势,适用于资源受限的环境,如物联网设备。
2. 发布/订阅模型:MQTT采用一对多的消息分发模式,即发布者(MQTT服务器)只负责将消息发送到所有订阅该主题的订阅者(客户端)。
这种模型降低了消息的传输成本,提高了效率。
3. 持久性连接:MQTT协议要求客户端与服务器建立持久性连接,这为实时消息传输提供了保障。
4. 简化认证:MQTT协议支持通过Username/Password或X.509证书等方式进行身份验证,大大简化了认证过程。
二、Socket实现Socket是网络编程中常用的术语,用于描述应用层与TCP/IP协议族之间的接口。
下面我们将通过Socket实现MQTT协议的功能。
1. 服务器端实现首先,我们需要实现一个MQTT服务器端,其主要功能包括接收客户端连接、发布消息、处理订阅和发布等操作。
(1)创建服务器:使用Socket库创建TCP/IP连接,并绑定指定的IP地址和端口号。
(2)接收连接:监听指定的端口,等待客户端连接请求。
一旦有客户端连接,就建立持久性连接。
(3)消息处理:根据订阅主题将消息发送给对应的客户端。
(4)关闭连接:在客户端断开连接时,服务器应关闭相应的连接并释放资源。
2. 客户端实现客户端的实现相对简单,主要负责建立连接、订阅主题、发布消息等操作。
具体步骤如下:(1)创建Socket对象:使用Socket库创建TCP/IP连接,指定服务器IP地址和端口号。
mqtt例子

mqtt例子MQTT (Message Queuing Telemetry Transport) 是一种轻量级的通信协议,适用于物联网设备和嵌入式系统中的通信。
它是一个简单且高效的发布/订阅消息传递协议,能够实现可靠的消息传递和正好一次交付的特性。
以下是一些使用MQTT的示例,可以帮助读者了解如何在不同的应用场景中应用MQTT协议。
1. 传感器数据收集在物联网设备中,传感器通常用于收集各种环境参数,如温度、湿度、气体浓度等。
MQTT可以用于将传感器数据发布到云平台,供其他设备或应用程序订阅和使用。
例如,一个气象站可以使用MQTT协议将收集到的气象数据发布到云平台,然后用户可以订阅这些数据并在手机App上查看实时的天气情况。
2. 远程监控和控制MQTT可以用于远程监控和控制物联网设备。
例如,一个智能家居系统可以使用MQTT协议将传感器数据发送到云平台,用户可以通过手机App订阅这些数据并控制智能家居设备,如调整灯光、温度或安全设备等。
3. 消息通知MQTT可以用于提供实时消息通知功能。
例如,一个即时通讯应用可以使用MQTT协议来实现消息的实时推送,当有新消息到达时,应用可以通过MQTT协议将消息发布到云平台,然后其他用户可以订阅这些消息并立即收到通知。
4. 资源监控与管理MQTT能够提供对物联网设备的实时监控和管理功能。
例如,一个物流公司可以使用MQTT协议来监控车辆的位置和状态,通过订阅这些数据,可以实时跟踪车辆的位置和运营情况,提高物流效率和货物的安全性。
5. 数据采集和分析MQTT可以用于数据采集和分析。
例如,一个智能农业系统可以使用MQTT协议将土壤湿度、光照强度等数据发布到云平台,云平台可以订阅这些数据并进行实时分析,提供相应的农业建议和决策支持,帮助农民提高农作物的产量和质量。
使用MQTT协议的好处包括:- 轻量级:MQTT协议的代码量很小,适用于嵌入式系统和低带宽的网络环境。
- 可靠性:MQTT协议提供可靠的消息传递和一次交付的特性,确保消息的可靠发送和接收。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MQTT消息传输机制(协议解读与调用实例)前言最近在研究MQTT时,我发现我身边的同事都在看类似android中实现mqtt通信、java如何调用mqtt实现消息推送等,这种方式在现实编程中见怪不怪,也是常规的解决思路,但也有诸多疑惑是常规思路中不能轻易达成的,原因有以下几点:1.代码调用简单,仅实现基本的功能;2.现成的类库文档较少,影响对类库的理解;3.开发者自身知其然,不知其所以然,等等由此产生了很多令人困惑的问题,诸如:1.用户(非)正常断开连接,代码能对断开的用户进行后续的逻辑处理吗(断开后的业务回调)?2.消息发布后,接收者未在线,上线能接收到之前发布的消息吗?3.如何进行用户的登录验证?4.消息发送失败及接收端下线,如何确保接收端再次登录后有正常接收到消息?5.……本篇会把连接(CONNECT)、心跳(PINGREQ/PINGRESP)、确认(CONNACK)、断开连接(DISCONNECT)和在一起,通过对协议的解读,结合类库的调用来对以上问题进行逐一解答。
CONNECT像前面所说,MQTT有关字符串部分采用的修改版的UTF-8编码,CONNECT可变头部中协议名称、消息体都是采用修改版的UTF-8编码。
前面基本上可变头部内容不多,下面MQTT消息传输机制(协议解读与调用实例)李阳MQTT消息传输机制(协议解读与调用实例)李阳MQTT消息传输机制(协议解读与调用实例)李阳可变头部协议名称和协议版本都是固定的。
连接标志(Connect Flags)一个字节表示,除了第1位是保留未使用,其它7位都具有不同含义。
业务上很重要,对消息总体流程影响很大,需要牢记。
Clean Session0,表示如果订阅的客户机断线了,要保存为其要推送的消息(QoS为1和QoS为2),若其重新连接时,需将这些消息推送(若客户端长时间不连接,需要设置一个过期值)。
1,断线服务器即清理相关信息,重新连接上来之后,会再次订阅。
Will Flag定义了客户端(没有主动发送DISCONNECT消息)出现网络异常导致连接中断的情况下,服务器需要做的一些措施。
简而言之,就是客户端预先定义好,在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱(Testament)。
这个遗嘱就是一个由客户端预先定义好的主题和对应消息,附加在CONNECT的可变头部中,在客户端连接出现异常的情况下,由服务器主动发布此消息。
只有在Will Flag位为1时,Will Qos和Will Retain才会被读取,此时消息体Playload中要出现Will Topic和Will Message具体内容,否则,Will QoS和Will Retain值会被忽略掉。
Will Qos两位表示,和PUBLISH消息固定头部的QoS level含义一样。
这里先掠过,到PUBLISH消息再回过头来看看,会更明白些。
若标识了Will Flag值为1,那么Will QoS就会生效,否则会被忽略掉。
Will RETAIN如果设置Will Flag,Will Retain标志就是有效的,否则它将被忽略。
MQTT消息传输机制(协议解读与调用实例)李阳当客户端意外断开服务器发布其Will Message之后,服务器是否应该继续保存。
这个属性和PUBLISH固定头部的RETAIN标志含义一样,这里先掠过。
User name 和password Flag:用于授权,两者要么为0要么为1,否则都是无效。
都为0,表示客户端可自由连接/订阅,都为1,表示连接/订阅需要授权。
Playload/消息体消息体定义的消息顺序(如上表所示),约定俗成,不得更改,否则将可能引起混乱。
若Will Flag值为0,那么在Playload中,Client Identifer后面就不会存在Will Topic和Will Message内容。
若User Name和Password都为0,意味着Playload/消息体中,找不到User Name和password的值,就算有,也是无效。
标志决定着是否读取与否。
心跳时间(Keep Alive timer)以秒为单位,定义服务器端从客户端接收消息的最大时间间隔。
一般应用服务会在业务层次检测客户端网络是否连接,不是TCP/IP协议层面的心跳机制(比如开启SOCKET的SO_KEEPALIVE选项)。
一般来讲,在一个心跳间隔内,客户端发送一个PINGREQ消息到服务器,服务器返回PINGRESP消息,完成一次心跳交互,继而等待下一轮。
若客户端没有收到心跳反馈,会关闭掉TCP/IP端口连接,离线。
16位两个字节,可看做一个无符号的short类型值。
最大值,2^16-1 = 65535秒= 18小时。
最小值可以为0,表示客户端不断开。
一般设为几分钟,比如微信心跳周期为300秒。
Will Message编码MQTT消息传输机制(协议解读与调用实例)李阳另外,相关说明:/wiki/doku.php/will message utf8_supporthttps:///issues/browse/MQTT-2连接异常中断通知机制CONNECT消息一旦设置在可变头部设置了Will flag标记,那就启用了Last-Will-And-Testament特性,此特性很赞。
一旦客户端出现异常中断,便会触发服务器发布Will Message消息到Will Topic主题上去,通知Will Topic订阅者,对方因异常退出。
接收CONNECT后的响应动作接收到CONNECT消息之后,服务器应该返回一个CONNACK消息作为响应:1.若客户端绕过CONNECT消息直接发送其它类型消息,服务器应关闭此非法连接若客户端发送CONNECT之后未收到CONNACT,需要关闭当前连接,然后重新连接2.相同Client ID客户端已连接到服务器,先前客户端必须断开连接后,服务器才能完成新的客户端CONNECT连接客户端发送无效非法CONNECT消息,服务器需要关闭CONNACKMQTT消息传输机制(协议解读与调用实例)李阳MQTT消息传输机制(协议解读与调用实例)李阳只有从上面看出,一个CONNACT,四个字节表示。
一个正常的CONNACT消息实际内容可能如下:0x20 0x02 0x00 0x00若是在私有协议中,两个字节就足够了。
很多时候,客户端和服务器端在没有消息传递时,会一直保持着连接。
虽然不能依靠TCP心跳机制(比如SO_KEEPALIVE选项),业务层面定义心跳机制,会让连接状态检测、控制更为直观。
PINGREQ心跳频率在CONNECT可变头部“Keep Alive timer”中定义时间,单位为秒,无符号16位short表示。
PINGRESP服务器收到PINGREQ请求之后,会立即响应一个两个字节固定格式的PINGRESP消息。
MQTT消息传输机制(协议解读与调用实例)李阳行为一致,但对客户端的订阅不会产生影响(不会清除客户端订阅数据),这个需要牢记。
若客户端发送PINGREQ之后的一个心跳周期内接收不到PINGRESP消息,可考虑关闭TCP/IP套接字连接。
DISCONNECT客户端主动发送到服务器端,表明即将关闭TCP/IP连接。
此时要求服务器要完整、干净的进行断开处理,不能仅仅类似于关闭连接描述符类似草草处理之。
需要两个字节,值固定:1.值为0,服务器必须在客户端断开之后继续存储/保持客户端的订阅状态。
这些状态包括:MQTT消息传输机制(协议解读与调用实例)李阳o存储订阅的消息QoS1和QoS2消息o正在发送消息期间连接丢失导致发送失败的消息o以便当客户端重新连接时以上消息可以被重新传递。
2.值为1,服务器需要立刻清理连接状态数据。
有一点需要牢记,服务器在接收到客户端发送的DISCONNECT消息之后,需要主动关闭TCP/IP连接。
针对上述问题提出的解决方案:1、用户(非)正常断线后的业务回调Will TopicWill Flag值为1,这里便是Will Topic的内容。
QoS级别通过Will QoS字段定义,RETAIN值通过Will RETAIN标识,都定义在可变头里面。
连接异常中断通知机制CONNECT消息一旦设置在可变头部设置了Will flag标记,那就启用了Last-Will-And-Testament特性,此特性很赞。
一旦客户端出现异常中断,便会触发服务器发布Will Message消息到Will Topic主题上去,通知Will Topic订阅者,对方因异常退出。
Clean Session0,表示如果订阅的客户机断线了,要保存为其要推送的消息(QoS为1和QoS为2),若其重新连接时,需将这些消息推送(若客户端长时间不连接,需要设置一个过期值)。
1,断线服务器即清理相关信息,重新连接上来之后,会再次订阅。
Will Flag定义了客户端(没有主动发送DISCONNECT消息)出现网络异常导致连接中断的情况下,服务器需要做的一些措施。
简而言之,就是客户端预先定义好,在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱(Testament)。
这个遗嘱就是一个由客户端预先定义好的主题和对应消息,附加在CONNECT的可变头部中,在客户端连接出现异常的情况下,由服务器主动发布此消息。
只有在Will Flag位为1时,Will Qos和Will Retain才会被读取,此时消息体Playload中要出现Will Topic和Will Message具体内容,否则,Will QoS和Will Retain 值会被忽略掉。
Will Qos两位表示,和PUBLISH消息固定头部的QoS level含义一样。
这里先掠过,到PUBLISH消息再回过头来看看,会更明白些。
若标识了Will Flag值为1,那么Will QoS就会生效,否则会被忽略掉。
MQTT消息传输机制(协议解读与调用实例)李阳协议中明确指出,在连接时,我们只要设置好它的Last Will【在自己异常断开的情况下,所留下的最后遗愿(Last Will),也称之为遗嘱(Testament)】类库中对应的封装大致如下,可能会因语言版本不同而有所差异,但大致都是如此:void Connect();void Connect(bool cleanStart);void Connect(string willTopic, QoS willQoS, MqttPayload willMsg, bool willRetain);void Connect(string willTopic, QoS willQoS, MqttPayload willMsg, bool willRetain, bool cleanStart);测试结果如下:2、消息发布后,接收者未在线,上线能接收到之前发布的消息吗?MQTT消息传输机制(协议解读与调用实例)李阳答案是肯定的,消息发布时,有一重要参数:retained,建立连接函数中(willRetain)属性和PUBLISH固定头部的RETAIN标志含义一样类库中对应的封装大致如下,可能会因语言版本不同而有所差异,但大致都是如此:int Publish(MqttParcel parcel);int Publish(string topic, MqttPayload payload, QoS qos, bool retained);retained:表示消息会保留在服务器上,即接收端每一次连接后都将收到保留在服务器上的主题,保留的主题清除方式:直接将主题内容置空即可注意:发布消息时,retained虽然为true,但接收端不希望每次连接后都收到来自服务器上驻留的消息,怎么办?协议中对此进行了专门的开关设置:属性为Clean Session,因此在与服务器建立连接时,就有一个参数void Connect(string willTopic, QoS willQoS, MqttPayload willMsg, bool willRetain, bool cleanStart);3、如何获取消息的发送状态其实,在发布者向服务器通信后,服务器都很礼貌地进行了消息的回复,具体消息见协议:CONNACK类库中对应的封装大致如下,可能会因语言版本不同而有所差异,但大致都是如此:void qosManager_MessageReceived(object sender, MqttMessageReceivedEventArgs e){if (e.Message == null){//a null message means we have disconnected from the brokerOnConnectionLost(new EventArgs());return;}switch (e.Message.MsgType){case MessageType.CONNACK:var connack = ((MqttConnackMessage)e.Message);if (connack.Response == MqttConnectionResponse.Accepted)OnConnected(new EventArgs());MQTT消息传输机制(协议解读与调用实例)李阳elseOnConnectionLost(new MqttConnackEventArgs(connack.Response));break;case MessageType.DISCONNECT:break;case MessageType.PINGREQ:manager.SendMessage(new MqttPingRespMessage());break;case MessageType.PUBACK:MqttPubackMessage puback = (MqttPubackMessage)e.Message;OnPublished(new CompleteArgs(puback.AckID));break;case MessageType.PUBCOMP:break;case MessageType.PUBLISH:MqttPublishMessage m = (MqttPublishMessage)e.Message;OnPublishArrived(m);break;case MessageType.PUBREC:break;case MessageType.PUBREL:MqttPubrelMessage pubrel = (MqttPubrelMessage)e.Message;OnPublished(new CompleteArgs(pubrel.AckID));break;case MessageType.SUBACK:MqttSubackMessage m1 = (MqttSubackMessage)e.Message;MQTT消息传输机制(协议解读与调用实例)李阳OnSubscribed(new CompleteArgs(m1.AckID));break;case MessageType.UNSUBACK:MqttUnsubackMessage m2 = (MqttUnsubackMessage)e.Message;OnUnsubscribed(new CompleteArgs(m2.AckID));break;case MessageType.PINGRESP:break;case MessageType.UNSUBSCRIBE:case MessageType.CONNECT:case MessageType.SUBSCRIBE:default:throw new Exception("Unsupported Message Type");}}类库对外的通知消息显得格外的简单,只是定义了一些诸如:connected,disconnected,publishArrive等事件进行处理,其实对服务器的任何通信都是有回复的,对上述代码其实已经无需做太多的解释,结果已经很明了。