论文翻译节选:Design and Implementation of a Reliable Message Transmission System Based on MQTT Protocol in IoT

IoT中基于MQTT协议的可靠消息传输系统的设计与实现

摘要:物联网是IT最重要的趋势之一,并且越来越流行于家居自动化领域。消息传输系统是物联网设备中用于收集数据或发送命令的重要组件。推送协议轻巧且比轮询协议具有更高的效率,在物联网设备中得到了广泛使用。然而,像MQTT协议这样的推送消息仅仅保证每个消息传递,并且不易维护消息之间的顺序。有序消息和重新发送在传输过程中丢失的消息是物联网环境中可靠消息通信系统(例如家庭安全自动化)的关键问题。在本文中,我们设计并实现了使用MQTT协议的可靠消息传输系统,它可以保证工作环境中消息传递的顺序。该(系统)由MQTT协议,可靠消息传输服务器和客户端模块组成。可靠消息传输服务器模块在组合了顺序标志和SEQ之后将原消息主题扩展为新的消息主题。顺序标志是确定消息之间是否保持顺序的值。SEQ是每个消息的序列号,由可靠消息传输系统服务器模块管理,并存储在服务器的数据库中。可靠的消息传输系统客户端模块在处理消息之前检查消息的顺序,如果丢失了消息,则请求前一条消息以保留消息的顺序。为了进行仿真,我们使用mosquitto MQTT消息代理实现了可靠的消息传输系统,并且模拟显示该提议的系统可以增强IoT环境下的消息传输。

关键词:物联网推送,MQTT,可靠系统,消息排序

  • 1. 引言

随着无线通信技术以及小型低功耗设备的发展,汽车之间的通信或向家用设备发送命令已不再是梦想。人与机器之间或机器与机器之间的数据通信称为物联网(IoT),并且在大多数工业市场中变得越来越流行。物联网是2016年十大战略技术趋势之一,根据Gartner [1].到2020年,连接互联网的设备数量预计约为500亿,而到2020年,回报率预计约为9500美元。[2].

物联网设备中的消息传输非常重要,因为物联网设备必须将命令发送到另一个设备以控制系统。推送协议是物联网设备最流​​行的消息传输协议,因为推送协议通常是在低带宽网络中设计的。推送消息服务以各种协议形式实现,例如XMPP,CoAP和MQTT。这些各种协​​议用于每种不同的情况。此外,MQTT协议旨在作为轻量级协议很好地在低功耗设备上运行,并已在许多IoT设备和即时消息系统中使用。MQTT协议旨在确保每种短消息的QoS的机制。然而当从发件人发送大量消息时,可能很难保证消息的传递和这些消息的确切顺序。在本文中,我们讨论了如何保证系统中消息的顺序,从而确保消息的顺序可靠性。最后,我们提出了一个可靠的消息传递系统的实验,并审查了结果。

  • 2. 相关工作

2.1物联网

物联网是嵌入式电器,软件,传感器和网络连接的物理对象或“事物”的网络[3].这些对象收集或交换数据。例如,LG的家庭自动化可以使人们关闭灯或远程锁闭煤气阀[4].物联网设备由低功耗硬件设备,轻量级操作系统和轻量级软件组成,它们可以在恶劣的环境下运行[5].许多硬件制造商正在开发低功率设备[6].例如,Raspberry pi是最受欢迎的IoT硬件设备之一,它可以通过micro-USB供电。最小的Raspberry-pi尺寸仅为65 mm * 30 mm * 5 mm,可以嵌入很小的空间中[7]。

此外,还有许多针对物联网的操作系统正在开发中。使用Linux实现对IoT的支持,例如Raspberry pi使用Debian Linux。RTOS还用于物联网,因为某些物联网设备应具备实时工作的能力。消息传输是物联网软件的主要关键因素之一。消息传输系统将从硬件设备收集的数据发送到服务器或用户。它还应从服务器或用户接收数据或命令。物联网设备设计用于无需人工决策即可单独工作,所以准确的消息传递非常重要。如果缺少一条消息或错误的消息传递,可能会发生事故。人们希望在家庭自动化中使用诸如烟雾探测器,气体和水泄漏探测器之类的传感器设备[8],并且准确地传递传感器数据。因此,可靠的消息传递和开发的研究正在不断进行中。

2.2消息传输协议

推送协议在物联网中的消息传输比轮询协议更有用,因为轮询协议需要不必要的网络流量来检查服务器中是否有新消息。推送协议比轮询协议轻巧,我们可以将许多推送协议用于IoT,例如HTTP,可扩展消息和状态协议(XMPP),CoAP和MQTT。XMPP是基于XML的开源标准推送协议。从服务器更新信息时,XMPP消耗的资源比HTTP协议少[9].

但是,XMPP的资源基于XML,并且比基于字节结构的MQTT的数据更大。受限应用协议(CoAP)适用于内存较小的传感器设备[10].CoAP通过将RESTful结构与URI进行通信。CoAP不支持组广播,但支持一对一通信。此外,CoAP不支持发布/订阅结构的消息队列。

2.3 MQTT协议

MQTT协议是由IBM公司发布的消息推送协议[11]。它旨在在低带宽网络条件下和较长的网络延迟下可靠地传输消息。当前,物联网软件公EVERYTHING,Amazon IoT使用MQTT协议,Facebook针对移动设备的即时通讯应用程序也使用MQTT协议。  

MQTT协议包括订阅者,发布者和消息代理。想要获得属于某个主题的消息的客户端,则通过消息代理服务器订阅该主题的消息。如果另一个客户端发布特定主题的消息,则消息代理服务器会将消息重新发布给已经订阅特定主题的订阅者。主题是一个消息字符串,用于过滤每个客户端的消息,它由一个或多个主题级别组成。每个级别都以斜杠(/)区分,该结构看起来像树结构。

MQTT推送协议定义了传输服务质量(QoS)级别,该级别是单个消息的发送者和接收者之间关于消息传递质量的保证。MQTT中有三个级别的QoS[11,12]。

QoS 0:最多一次。最多只能发送一次消息,并且不保证会传递消息。

QoS 1:至少一次。至少发送一次消息,并且可以多次发送一条消息。

QoS 2:恰好一次通过4种方式握手,只发送一次消息。

图表 1:消息发送流中的反向消息排序

即使存在时间延迟,需要可靠消息传递的系统使用QoS 2也能够单次精确地传递消息。然而,MQTT推送协议的QoS在发送多种消息时不能保证消息传达的顺序,只能保证单个消息传递中每条消息都传递给接收者。如果由于网络条件等原因,产生时间延迟,就会出现乱序。

  • 3. 可靠消息传输系统设计

3.1可靠的消息传输要求

我们定义可靠的消息传输的要求,如下所示。

  • 每个消息客户端必须检查其他客户端的状态。
  • 一条消息必须准确地从发送方发送到接收方。
  • 来自发件人的消息必须按顺序传递。
  • 每个消息客户端可以请求丢失的消息,消息服务器应重新发送丢失的消息。

有一个消息发送方,它可能是用户设备,它向IoT设备发送命令并接收响应。此外,消息接收器是一种IoT设备,它收集数据或控制设备。发送者和接收者应该知道每个客户端的状态以进行精确控制。错误的消息传递可能是异常或错误操作的原因。因此,每个客户端必须保持可靠的消息传输。

3.2用于识别每个客户端状态的主题配置

发送方应在发送命令之前识别作为IoT设备的接收方的状态。接收者还可以在执行操作之前识别发送者的状态。MQTT协议没有确切的功能来从客户端识别其他客户端的状态。可靠的消息传输系统必须传递发送者和接收者的状态。每个客户都注册如图1所示的订阅频道。

在每个客户端注册时,主题由可靠消息系统(RMS)和系统ID组成,RMS是系统的专有主题消息。通过订阅该主题,每个客户端都可以知道其他客户端的状态。例如,如果发送者是client1,接收者是client2,则发送者使用/ RMS / Client2 /#请求client2的状态。接收方还使用/ RMS / Client1 /#请求client1的状态。

详细地,系统主题消息如表1中所示。如果客户端2处于活动状态,则客户端1的发送方通过/ RMS / Client2 / Q / Client1 / Status请求状态,而客户端2的接收方通过/ RMS / Client1 / A / Client / Status / Live响应状态。

图表 2:了解客户端状态的主题消息
表格 1:系统主题消息配置

3.3可靠的消息传递技术

对于诸如家用物联网设备或车载物联网设备之类的东西,在可靠消息传输系统中保证消息事务的传递非常重要。为了维持交互,消息必须具有原子性,一致性和性能[13]。此外,可靠的消息传输系统必须能够查看先前的消息,以进行可靠的消息传输或通信历史记录。

图表 3:可靠消息传输系统中的消息数据流

然而,基于MQTT协议的消息传输系统不能保证消息顺序并存储消息。它仅用于传输目的。因此,可靠消息传输系统必须保留消息以进行可靠的传输,并且在消息丢失或再次从客户端请求消息时必须重新传输。

必须为所有消息分配一个序列号,以便可靠地传递消息。每个客户端在发送消息之前都向服务器请求序列号。每个序列号基于到达消息传输服务器的时间。消息经历了被传输到每个想要订阅与消息相关的主题的可靠消息传输客户端的过程。每个Messenger客户端通过检查接收到的消息的序列号来确认消息是否丢失。图3显示了可靠的消息传输系统中的消息数据流。如果接收方客户端发现缺少消息,则接收方客户端发送一条消息,即“请求上一条消息”,如图2所示。

如果客户端A订阅了诸如/ Home / CCTV之类的主题,并且客户端A发现缺少3号消息,则客户端A发送诸如/ RMS / Server / Q / ClientA / Home_CCTV / 3之类的消息以获取丢失的消息。此时,主题中的斜杠(/)将替换为下划线(_)。

3.4可靠消息传输的MQTT设计

MQTT协议由MQTT固定头,变量头和有效负载部分组成。标头部分由2个固定大小的字节和一个用于订阅和连接的附加字节组成[11].有效负载区域是将发送到消息的区域。在本文中,我们扩展了有效负载区域,以便在可靠的消息传输系统中验证数据。它旨在扩展有效负载,如下表所示。

在表2中,顺序标志确定消息的传输模式。该顺序标志是确定客户端是否检查邮件顺序的标志。SEQ是到达主题服务器的时间给出的序列号,表示主题中发生的消息序列。SEQ由SEQ计数,SEQ 1,SEQ 2组成。SEQ Count指示SEQ区域是否扩展。如果SEQ Count的值为0,则SEQ 1表示序列号,并且可以表示214序列号。另一方面,如果SEQ Count的值为1,则SEQ 1是SEQ 2的大小,而SEQ 2表示序列号。例如,如果SEQ Count的值为1,而SEQ 1为00000000000011(二进制数),则SEQ 2的大小为3 * 8 = 24位,它可以表示224序列号。SEQ 2的最大大小为214* 8 = 217位,它可以表示几乎接近无限数的数字。可靠的消息传输系统使用最少的包含序列号的字节。表5显示了如何将顺序标志和SEQ添加到原始消息。小于2的序列号14使用2字节的额外有效负载,以实现可靠的消息传输系统。

图表 4:获取上一条消息的主题消息
表格 2:可靠消息传输系统的有效负载配置
图表 5:2字节RMS有效负载信息

3.5可靠消息传输系统结构

将接收消息的客户端订阅该主题,而另一个发出消息的客户端将主题发布到服务器。服务器通过使用服务器中设置的顺序标志和接收到的消息的SEQ来重构消息格式以在客户端中进行验证。客户端检查SEQ和到达消息的顺序标志,并与先前的消息SEQ比较。如果在比较SEQ之后存在丢失的消息,则客户端请求丢失的消息,并且服务器将丢失的消息重新发送给客户端。图6显示了基于MQTT协议的可靠消息传输系统中的数据流。

图表 6:MQTT可靠消息传输系统的数据流
图表 7:可靠消息传输系统服务包
表格 4:RMS_Server_Class主类成员方法
图表 8:可靠消息传输系统服务程序数据库DDL
图表 9:可靠消息传输系统客户端程序包
表格 5:RMS_Server_Class主类成员方法