CN117793172A - 一种基于消息队列的轻量级数据采集方法 - Google Patents
一种基于消息队列的轻量级数据采集方法 Download PDFInfo
- Publication number
- CN117793172A CN117793172A CN202311807389.6A CN202311807389A CN117793172A CN 117793172 A CN117793172 A CN 117793172A CN 202311807389 A CN202311807389 A CN 202311807389A CN 117793172 A CN117793172 A CN 117793172A
- Authority
- CN
- China
- Prior art keywords
- message
- data
- client
- module
- subscription
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 183
- 238000009826 distribution Methods 0.000 claims abstract description 28
- 230000005540 biological transmission Effects 0.000 claims abstract description 20
- 238000007726 management method Methods 0.000 claims description 245
- 238000012790 confirmation Methods 0.000 claims description 104
- 230000008569 process Effects 0.000 claims description 36
- 230000006837 decompression Effects 0.000 claims description 29
- 238000013475 authorization Methods 0.000 claims description 27
- 238000013144 data compression Methods 0.000 claims description 24
- 238000012545 processing Methods 0.000 claims description 21
- 238000013480 data collection Methods 0.000 claims description 19
- 238000007906 compression Methods 0.000 claims description 18
- 230000006835 compression Effects 0.000 claims description 18
- 230000004044 response Effects 0.000 claims description 16
- 239000000284 extract Substances 0.000 claims description 14
- 238000012795 verification Methods 0.000 claims description 9
- 238000012544 monitoring process Methods 0.000 claims description 7
- 238000006073 displacement reaction Methods 0.000 claims description 6
- 238000009825 accumulation Methods 0.000 claims description 3
- 125000004122 cyclic group Chemical group 0.000 claims description 3
- 238000007667 floating Methods 0.000 claims description 3
- 230000000977 initiatory effect Effects 0.000 claims description 3
- 230000007246 mechanism Effects 0.000 claims description 3
- 239000003795 chemical substances by application Substances 0.000 description 60
- 230000006870 function Effects 0.000 description 9
- 238000004088 simulation Methods 0.000 description 9
- 238000011160 research Methods 0.000 description 6
- 238000004891 communication Methods 0.000 description 5
- 238000010586 diagram Methods 0.000 description 5
- 239000000872 buffer Substances 0.000 description 4
- 230000008901 benefit Effects 0.000 description 3
- 230000006978 adaptation Effects 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000002474 experimental method Methods 0.000 description 2
- 238000012423 maintenance Methods 0.000 description 2
- 238000004519 manufacturing process Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000002688 persistence Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 1
- 238000005315 distribution function Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
Landscapes
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种基于消息队列的轻量级数据采集方法,目的是解决现有轻量级数据采集方法不能适应大规模设备部署和数据传输需求的问题。技术方案是建立由多个客户端和1个服务端组成的基于消息队列的轻量级数据采集***:客户端安装有客户端程序,服务端安装有消息代理程序。客户端与服务端的消息代理建立连接并进行身份认证。作为消息订阅者的客户端向消息代理注册对特定主题的关注,接收与这些主题相关的消息,完成主题订阅。作为数据发布者的客户端采集数据,并通过消息代理发布消息到各个订阅者,完成数据发布。本发明更加轻量级且提高了数据分发的效率,平衡了可靠性和效率,特别适用于大型分布式***和复杂的网络结构。
Description
技术领域
本发明属于信息技术***中的计算机通信技术领域,尤其涉及一种高效、可靠的消息队列轻量级(指资源占用低,即尽可能占用少的***资源,包括内存、处理器和网络带宽等,且数据在网络传输时占用的带宽较小)数据采集方法。
背景技术
对于一些应用场景,即时获取各种关键信息十分重要,在工业领域,数据采集通常用于监控和控制工厂设备或生产线上的各种参数,如温度、湿度、压力、流量等。这些数据需要被采集、传输、分析和可视化,从而实现远程监控与运营优化。
目前,常用的数据采集方法有Modbus、CoAP、OPC和AMQP。其中Modbus简单易用、可扩展性高但由于其基于串行通信的特性,大规模数据传输和实时通信方面的带宽利用率相对较低,不适合大规模***。CoAP设计为轻量级协议,适用于资源受限的物联网设备,能够在低功耗、低带宽和不稳定网络环境下工作,但由于CoAP是基于UDP的,因此在不可靠的网络环境下,消息的可靠性不能得到保障,由于CoAP的设计目标是在受限环境中工作,因此在大规模的网络中可能表现不佳。OPC提供了标准化的接口、高性能的数据传输和更新能力、多种通信协议能够支持满足各种复杂应用场景需求,然而OPC是基于Windows平台设计的,因此对于非Windows平台的***可能存在兼容性问题,而且OPC设计复杂,实施和维护时需要投入更多成本。AMQP设计为支持高可靠性和弹性传输,具有消息持久化、消息确认和事务支持等特性,能够确保消息的可靠性传输,适用于处理大量消息和需要快速响应的场景。但AMQP一些高级功能(如持久化、事务支持等)会给***带来额外的性能开销,而且AMQP设计复杂,实施和维护需要处理一些较为复杂的技术和标准,需要专业知识和经验。
基于这些挑战和不足,对数据采集方法的研究成为迫切之需。在不断发展的工业环境中,需要寻求具有较好可扩展性和支持大规模复杂应用场景同时简单易用、足够轻量级的数据采集方法,以适应现代工厂设备和智能生产线的需求。因此,对数据采集方法的改进和创新具有重要的理论和实际意义,将为工业领域的智能化发展提供有力的支持和推动。
发明内容
本发明要解决的技术问题在于:针对现有轻量级数据采集方法都不能适应大规模设备部署和数据传输需求,而支持大规模设备部署和数据传输需求的数据采集方法实现和部署都相对复杂,且消耗网络带宽和资源较多的问题,提供一种基于消息队列的轻量级数据采集方法,可以在适应大规模设备部署的同时保持轻量级,减少对网络资源的占用。
本发明的技术方案包括以下步骤:
第一步:建立基于消息队列的轻量级数据采集***:
基于消息队列的轻量级数据采集***由多个客户端和1个服务端组成,客户端安装有客户端程序,服务端安装有消息代理程序。消息代理程序由连接管理模块A、会话管理模块A、安全认证与授权模块和消息代理模块组成。客户端程序由消息集、连接管理模块B、会话管理模块B、消息发布模块和消息订阅模块组成。当客户端程序启用消息发布模块时客户端作为消息发布者,当客户端程序启用消息订阅模块时客户端作为消息订阅者,客户端程序可以同时启用消息订阅模块和消息发布模块。
客户端的连接管理模块B与客户端会话管理模块B、消息代理的连接管理模块A相连。客户端的连接管理模块B向消息代理的连接管理模块A发送连接请请求报文(连接请求报文包含客户端的唯一标识符、用户名和密码等连接请求信息)进行身份认证,从连接管理模块A接收响应的连接确认报文,若接收到的是成功响应的报文,则生成会话信息B,将会话信息B发送到客户端的会话管理模块B。
消息代理的连接管理模块A与客户端的连接管理模块B、消息代理的会话管理模块A、消息代理的安全认证与授权模块相连。消息代理的连接管理模块A接收客户端的连接管理模块B发送的连接请求报文,连接管理模块A提取连接请求报文中的连接请求信息,将连接请求信息发送到安全认证与授权模块,并从安全认证与授权模块接收认证结果,根据认证结果生成连接确认报文作为连接请求报文的响应发送给客户端的连接管理模块B,对于认证成功的连接请求,生成会话信息A发送给会话管理模块A,会话信息A的内容包括客户端标识符、认证成功信息和接入时间。
消息代理的安全认证与授权模块与消息代理的连接管理模块A相连,从连接管理模块A接收连接请求信息,根据连接请求信息进行身份认证,将认证结果返回给消息代理的连接管理模块A。
消息代理的会话管理模块A与连接管理模块A、消息代理模块相连,从连接管理模块A接收会话信息A,提取客户端ID,将客户端ID作为接入客户端信息发送到消息代理模块。
客户端的会话管理模块B与客户端的连接管理模块B、客户端的消息发布模块、客户端的消息订阅模块相连。客户端的会话管理模块B从连接管理模块B接收会话信息B,根据客户端承担的是作为消息发布者还是消息订阅者启动消息发布模块或是消息订阅模块。
客户端的消息发布模块由数据采集模块、数据压缩模块和QoS发送模块B组成。
客户端的数据采集模块与客户端的消息集、客户端的数据压缩模块、传感器、设备接口、数据总线等相连。数据采集模块从消息集读取消息定义,根据消息定义从传感器、设备接口、数据总线等取得数据信息,生成数据单元(包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息),将数据单元发送到客户端数据压缩模块。
客户端数据压缩模块与客户端的数据采集模块、客户端的QoS发送模块B相连,数据压缩模块从数据采集模块接收数据单元,对数据单元进行压缩,生成数据发布报文,将数据发布报文发送到QoS发送模块B。
客户端的QoS发送模块B与客户端的数据压缩模块、消息代理的QoS接收模块A相连。QoS发送模块B在接收到数据压缩模块的数据发布报文后通过消息发布流程将数据发布报文发送到消息代理的QoS接收模块A。
消息代理的消息代理模块由消息队列、订阅管理模块A、消息路由模块、QoS发送模块A和QoS接收模块A组成。
消息代理的QoS接收模块A与客户端的QoS发送模块B、消息队列相连。消息代理的QoS接收模块A通过消息发布流程接收到客户端QoS发送模块B发布的消息发布报文后,将消息发布报文添加到消息队列。
消息代理的消息队列与消息代理的QoS接收模块A、消息代理的消息路由模块相连。消息队列从QoS接收模块A接收数据发布报文,将数据发布报文进行存贮,供消息代理的消息路由模块读取。
消息代理的消息路由模块与消息代理的消息队列、消息代理的订阅管理模块A、消息代理的QoS发送模块A相连。消息路由模块从消息队列读取数据发布报文,根据数据发布报文的主题从订阅管理模块A获取该主题的所有订阅者信息,将数据发布报文、订阅者信息发送给QoS发送模块A。
消息代理的订阅管理模块A与客户端的消息订阅模块、消息代理的消息路由模块相连。一方面消息代理的订阅管理模块A从客户端消息订阅模块接收订阅报文,提取订阅信息,根据订阅信息创建订阅,将订阅加到订阅列表中,一个订阅由以下几个部分构成:客户端ID(指唯一标识客户端的ID);主题过滤器(指定客户端感兴趣的消息主题,可以使用通配符进行匹配,以订阅多个相关的主题);服务质量(QoS)级别(指定客户端所要求的消息传递服务质量级别)。订阅管理模块A完成订阅创建后向客户端消息订阅模块发送订阅确认报文。另一方面消息代理的订阅管理模块A在收到消息路由模块发送的请求订阅信息时根据主题在订阅列表中查找匹配主题过滤器对应的所有客户端ID,并将客户端信息返回给消息代理的消息路由模块。
消息代理的QoS发送模块A与消息代理的消息路由模块、客户端的QoS接收模块B相连。QoS发送模块A从消息路由模块接收数据发布报文、订阅者信息,通过数据发布流程将数据发布报文发布到订阅者对应的客户端的QoS接收模块B。
客户端的消息订阅模块由订阅管理模块B、数据解压模块和QoS接收模块B组成。
客户端的订阅管理模块B与消息代理的订阅管理模块A相连。客户端的订阅管理模块B通过向订阅管理模块A发送订阅报文请求订阅,从订阅管理模块A接收响应的订阅确认报文,验证订阅状态。
客户端的QoS接收模块B与消息代理的QoS发送模块A、数据解压模块相连。客户端的QoS接收模块B从QoS发送模块A接收消息发布报文,将数据发布报文发送给数据解压模块。
客户端的数据解压模块与客户端的QoS接收模块B、客户端的消息集相连。从客户端的QoS接收模块B接收数据发布报文,根据数据发布报文的消息ID从消息集中读取对应的消息定义,根据消息定义将数据发布报文解压为数据单元,将数据单元提交给上层应用,进行后续入库、分析等工作。
客户端的消息集与客户端的数据采集模块、客户端的数据解压模块相连。消息集存贮消息定义,消息定义使用名称、ID、字段名称、类型和含义,以及它们的相互关系,来描述基于消息队列的轻量级数据采集***中使用的各种消息。旨在满足各个具体场景下的数据采集需求。每个消息定义包含一个或多个字段,每个字段都有一个特定的数据类型和含义。消息定义通常包括以下内容:
消息ID:消息ID是唯一标识消息定义的数字标识符。消息ID指定了消息的类型和用途;
消息描述:对消息的描述,即注释;
消息字段:消息中的字段,用于消息编码,每条消息必须至少有一个消息字段,消息字段具有以下属性:
字段类型:类似于Cstruct中的数据类型。可以是有符号或无符号的8、16、32、64字节大小的整数类型,也可以是单精度或双精度的浮点类型,也可以是数组类型;
字段名称:字段的描述名称;
字段单位(可选):某些字段可能需要包括其单位,例如距离字段可能需要包含单位(米、英尺等);
枚举类型(可选):对于枚举类型的字段,需要包含枚举类型定义,以便在代码中进行正确的解析和处理;枚举类型用于定义一组常量,用于表示不同采集到的数据特定的状态、模式和参数,比如传感器的正常、故障、校准中等状态。枚举类型列举有限的一组可能取值的情况,并用枚举值代表状态、模式和参数的标识符。
描述(可选):对字段进行描述以解释其含义和用途,
客户端的消息集供数据采集模块、数据解压模块读取。
第二步:客户端与服务端的消息代理建立连接并进行身份认证。方法是:客户端按照2.1所述流程与消息代理建立连接,包括向消息代理发起网络连接,并向消息代理发送携带身份信息的连接请求报文,接收并处理消息代理返回的连接确认报文;同时消息代理按照2.2所述流程等待并处理客户端连接请求,包括接收客户端的连接请求报文,从连接请求报文提取连接请求信息进行认证,向客户端返回连接确认报文。具体方法是:
2.1客户端与消息代理建立连接,方法是:
2.1.1客户端的连接管理模块B向消息代理的连接管理模块A发送连接请求报文,连接请求报文包含连接请求信息,连接请求信息包含客户端的唯一标识符、用户名和密码。
2.1.2客户端连接管理模块B等待接收消息代理连接管理模块A的连接确认报文并通过以下方法对连接确认报文进行验证:
2.1.2.1如果客户端连接管理模块B在第一时间阈值T(一般设置为1s)内没有收到连接确认报文,客户端关闭与服务端的网络连接,转步骤2.1.1。
2.1.2.2如果连接确认报文中的连接返回码不为“0”(表示服务器消息代理拒绝连接请求),则客户端关闭与服务端的网络连接,转步骤2.1.1。
2.1.2.3如果连接确认报文的连接返回码为“0”(表示服务器消息代理接受连接请求),接入成功,客户端与服务端消息代理的连接建立完成,客户端的连接管理模块B生成会话信息B,将会话信息B发送给会话管理模块B,会话信息B的内容包括消息代理网络地址和接入状态,若用户将该客户端用作数据订阅则客户端转第三步启动数据订阅功能;若用户将该客户端用作数据采集发布,则客户端转第四步启动数据发布功能。
2.2服务端等待并处理客户端连接请求,方法是:
2.2.1消息代理的连接管理模块A监听网络,等待客户端的连接管理模块B发送的连接请求报文。若收到客户端发送的连接请求报文,转步骤2.2.2;若未收到客户端发送的连接请求报文,转步骤2.2.1继续监听。
2.2.2消息代理的连接管理模块A接收客户端程序连接管理模块B发送的连接请求报文,验证客户端的连接请求,并进行身份认证,方法是:
2.2.2.1消息代理的连接管理模块A接收到客户端程序的连接管理模块B发送的连接请求报文,如果连接请求报文不合法(即报文格式错误、缺少必要字段、校验和校验失败),消息代理的连接管理模块A直接关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1;如果连接请求报文合法,提取客户端标识符、用户名和密码等客户端连接请求信息,将客户端连接请求信息发送给安全认证与授权模块,转步骤2.2.2.2。
2.2.2.2安全认证与授权模块根据客户端标识符、用户名和密码对客户端进行身份验证和授权检查,将认证结果返回给连接管理模块A,如果认证成功则向连接管理模块A发送认证成功信息,转步骤2.2.2.3;否则,安全认证与授权模块向连接管理模块A发送认证失败信息,转2.2.2.5;
2.2.2.3消息代理的连接管理模块A向客户端的连接管理模块B发送返回码为“0”的连接确认报文,并将会话信息A(包含客户端标识符、认证成功信息、接入时间)发送给会话管理模块A,转步骤2.2.2.4。
2.2.2.4会话管理模块A根据会话信息A中的客户端标识符、认证成功信息和接入时间更新客户端接入状态信息,转步骤2.2.1。
2.2.2.5连接管理模块A向客户端的连接管理模块B发送返回码不为“0”的连接确认报文,并且关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1。
第三步:作为消息订阅者的客户端向消息代理注册对特定主题的关注,以便接收与这些主题相关的消息,完成主题订阅。方法是:作为消息订阅者的客户端按照3.1所述流程向消息代理发起主题订阅并验证订阅确认报文。同时消息代理按照3.2所述流程等待接收并验证订阅报文,进行客户端订阅并响应订阅确认报文。具体为:
3.1作为消息订阅者的客户端发起主题订阅和验证订阅确认报文,方法是:
3.1.1订阅管理模块B向消息代理订阅管理模块A发送订阅报文用于请求创建订阅,订阅报文应至少包含至少一组订阅信息,订阅信息为客户端ID、主题过滤器和QoS等级字段的组合。
3.1.2订阅管理模块B等待并接收消息代理订阅管理模块A响应的订阅确认报文,订阅确认报文包含订阅报文中包含的所有订阅信息以及每组订阅信息对应的返回码,验证订阅状态,方法是:
3.1.2.1如果订阅管理模块B在第二时间阈值T2(一般设置为2s)内没有收到消息代理的订阅确认报文,转步骤3.1.1。
3.1.2.2如果订阅管理模块B收到消息代理的订阅确认报文,从订阅确认报文提取订阅信息和每组订阅信息对应的返回码,订阅管理模块B使用订阅信息和对应的返回码更新当前订阅状态(分订阅成功和订阅失败2种)。若返回码为0、1或2,则订阅成功,转第四步。若返回码不是0、1、2中的任意一个,则订阅失败,转步骤3.1.1重新发起订阅请求。
3.2消息代理等待接收并验证客户端的订阅请求,进行客户端订阅并响应订阅确认报文,方法是:
3.2.1消息代理订阅管理模块A监听网络,等待客户端的订阅管理模块B发送的订阅报文。若收到客户端发送的订阅报文,转步骤3.2.2;若未收到客户端发送的订阅报文,转步骤3.2.1继续监听。
3.2.2此时订阅管理模块A收到了客户端订阅管理模块B发送的订阅报文,验证订阅者的订阅请求,方法是:
3.2.2.1订阅管理模块A验证订阅报文合法性,如果订阅报文不合法,即报文格式错误、缺少必要字段、校验和校验失败等,转步骤3.2.1。如果订阅报文合法,从订阅报文提取订阅信息(包括客户端ID、主题过滤器和QoS等级字段),转步骤3.2.2.2。
3.2.2.2订阅管理模块A使用订阅信息中的客户端ID、主题过滤器和QoS等级字段创建新的订阅(由客户端ID、主题过滤器和QoS等级组成),将新的订阅添加到订阅列表中。转步骤3.2.2.3;
3.2.2.3订阅管理模块A向订阅管理模块B发送订阅确认报文,订阅确认报文包含订阅者订阅管理模块B发送的订阅报文中的所有订阅信息及每组订阅信息对应的一个返回码。返回码为该订阅的QoS等级,表示该订阅在消息代理中被授予的最大QoS等级,返回码为支持的QoS等级(0、1、2)以外的值表示这个订阅失败。转步骤3.2.1。
第四步:作为数据发布者的客户端采集数据,并通过消息代理发布消息到各个订阅者,完成数据发布。方法是:作为数据发布者的客户端按照4.1所述流程进行数据采集、编码压缩并发布到消息代理。同时消息代理开启两个线程,线程1按照4.2所述流程接收作为数据发布者的客户端发布的数据发布报文,将数据发布报文添加到消息队列;线程2按照4.3所述流程从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者。同时作为消息订阅者的客户端按照4.4所述流程接收消息代理分发的数据发布报文。
4.1作为数据发布者的客户端进行数据采集、编码压缩并发布到消息代理,方法是:
4.1.1作为数据发布者的客户端的数据采集模块根据需要发布的信息,从消息集读取对应的消息定义,并根据消息定义从发布者硬件设备上的传感器、设备接口、数据总线等获取具体数据,然后根据需要发布的信息的可靠性要求为其分配QoS级别,QoS级别共有0、1、2三个等级。QoS 0是最低的QoS等级,为可靠性要求低,实时性要求高的信息分配的QoS等级为0,消息即发即弃,不需要等待确认,不需要存储和重传,因此对于接收方来说,永远都不需要担心收到重复的消息;QoS1是居中的QoS等级,为可靠性要求居中,实时性要求居中的信息分配的QoS等级为1,为了保证消息到达,QoS1引入了确认和重传机制,发送方会存储数据发布报文,并等待接收方回复发布确认报文,只有在收到发布确认后,发送方才会删除本地存储的数据发布报文,并且不再需要重传该报文;QoS2是最高的QoS等级,为可靠性要求最高,实时性要求最低的信息分配的QoS等级为2。并设置消息主题,生成一个数据单元。数据单元包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息。数据采集模块将数据单元发送到作为数据发布者的客户端的数据压缩模块。
4.1.2作为数据发布者的客户端的数据压缩模块对数据单元进行编码压缩,构造数据发布报文,方法是:
4.1.2.1构造数据发布报文消息头部:首先创建一个长度为8字节的空字符串,作为数据发布报文的报文头部,然后填充消息头部的各个字段,包括序列号、节点标识符、消息ID和QoS等级,报文长度暂时不做填充。
4.1.2.2在数据发布报文消息头部后添加主题:将消息主题编码为UTF-8格式的字符串。UTF-8是ISO/IEC 10646中定义的一个高效的Unicode字符编码格式,每一个字符串都有一个两字节的长度字段作为前缀,前缀标识这个字符串UTF-8编码的字节数。将编码后的主题字段添加到数据发布报文头部之后。
4.1.2.3在数据发布报文的主题字段后添加消息负载:消息负载包含消息定义中定义的所有字段,按消息定义中消息字段顺序枚举消息字段,并根据消息字段的字段类型将具体数据添加到数据发布报文之后,并对部分字段类型进行压缩编码,具体方法如下:
4.1.2.3.1初始化变量x为1,令消息定义中字段的总数为X;
4.1.2.3.2若x>X,消息负载编码压缩完成,转步骤4.1.2.4。若x≤X,判断字段类型并处理:如果第x个字段类型为整数,令x=x+1,转步骤4.1.2.3.3;如果第x个字段类型为其他类型,令x=x+1,转步骤4.1.2.3.4。
4.1.2.3.3此时第x个字段类型为整数,使用Varint对整数进行编码。Varint最早是作为Google Protocol Buffers(一种由Google开发的数据序列化协议)中的一种数据类型而引入,Varint是一种整数压缩编码方式,用于对整数进行压缩,以节省数据存储空间。Varint编码使用变长的字节数来表示整数,较小的整数会占用较少的字节数,而较大的整数会占用更多的字节数,将编码后字段添加到数据发布报文之后。具体压缩编码方法如下:
4.1.2.3.3.1如果第x个字段对应的具体数据的值是7位的整数,直接将这7位作为编码结果,转步骤4.1.2.3.2。
4.1.2.3.3.2如果第x个字段对应的具体数据的值是大于7位的整数,Varint将整数分成若干个7位的部分,每个部分的最高位用来标识是否还有后续字节,其余的7位用来表示整数的值,转步骤4.1.2.3.2。
4.1.2.3.4此时第x个字段字段类型为其他类型:使用消息定义中第x个字段类型定义的类型添加字段到数据发布报文之后,转步骤4.1.2.3.2。
4.1.2.4为数据发布报文填充报文长度字段:报文长度为当前构造的数据发布报文长度加上2字节的校验和长度,在数据发布报文的报文长度位置更新报文长度字段。
4.1.2.5为数据发布报文添加检验和:使用CRC校验算法计算数据发布报文的校验和,并将校验和添加到数据发布报文最后,以确保消息的完整性。数据发布报文包括报文长度(2字节)、序列号(2字节)、节点标识符(2字节)、消息ID(14位)、QoS等级(2位)、主题、消息负载、校验和(2字节)。将数据发布报文发送到作为数据发布者的客户端的QoS发送模块B,转步骤4.1.3。
4.1.3作为数据发布者的客户端采用数据发布方法按照不同的QoS等级以频率f(通常设置为1Hz,即每秒进行一轮数据发布)将数据发布报文发布到消息代理。此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者。数据发布方法是:
4.1.3.1若数据发布报文的QoS等级为0,则发送者对数据发布报文进行“最多一次”传输:
发送者完成向接收者发送数据发布报文即完成QoS 0消息发布流程,转步骤4.1.1开始下一轮信息采集发布。
4.1.3.2若数据发布报文的QoS等级为1,则发送者对数据发布报文进行“至少一次”传输,即进行QoS1消息发布,
方法是:
4.1.3.2.1发送者存储QoS1的数据发布报文。
4.1.3.2.2发送者向接收者发送QoS1的数据发布报文。
4.1.3.2.3发送者等待接收者回复的发布确认报文,若发送者收到接收者响应的发布确认报文,转4.1.3.2.4,若发送者在时间T2(一般设置为2s)内未接收到发布确认报文,转4.1.3.2.2重新向接收者发送QoS1的数据发布报文。
4.1.3.2.4发送者删除存储的数据发布报文,完成QoS1发布流程,转步骤4.1.1开始下一轮信息采集发布。
4.1.3.3若数据发布报文的QoS等级为2,则发送者对数据发布报文进行“恰好一次”传输,方法是:
4.1.3.3.1发送者存储QoS2的数据发布报文;
4.1.3.3.2发送者向接收者发送QoS2的数据发布报文;
4.1.3.3.3发送者等待接收者回复发布收到报文,若发送者收到接收者响应的发布收到报文,转4.1.3.3.4,若发送者在时间T2(一般设置为2s)内未接收到发布收到报文,转4.1.3.3.2,重新发送数据发布报文;
4.1.3.3.4发送者收到发布收到报文,即可确认接收者已经收到数据发布报文,发送方将不再需要重传这个报文,并且也不能再重传这个报文。发布者删除本地存储的数据发布报文,发送者向接收者发送发布释放报文,转步骤4.1.3.3.5;
4.1.3.3.5发送者等待接收者响应的发布完成报文,若发送者收到接收者响应的发布完成报文,即完成QoS2发布流程,转步骤4.1.1等待开始下一轮信息采集发布,若发送者在时间T2(一般设置为2s)内未接收到发布完成报文,转4.1.3.3.4,重新向接收者发送发布释放报文;
4.2消息代理采用数据接收方法接收数据发布者发布的数据发布报文,并将报文添加到消息队列中。此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者。数据接收方法是:
4.2.1接收者等待接收发送者发送的数据发布报文,并根据QoS等级进行不同的处理和响应,方法是:
4.2.1.1若接收到的数据发布报文QoS等级为0,QoS 0数据发布接收完成,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文。
4.2.1.2若接收到的数据发布报文QoS等级为1,处理并响应发布确认报文,方法是:
4.2.1.2.1向发送者回复发布确认报文,发布确认报文的报文ID与数据发布报文的报文ID相同,以便发送者收到后删除正确的数据发布报文缓存。
4.2.1.2.1QoS1数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文。
4.2.1.3若接收到的数据发布报文QoS等级为2,处理并进行响应,方法是:
4.2.1.3.1记录数据发布报文的消息ID,向发送者回复发布收到报文,发布收到报文的报文ID与数据发布报文的报文ID相同;
4.2.1.3.2接收者等待接收发送者发送的发布释放报文,若发送者收到发送者发送的发布释放报文,转4.2.1.3.3,若发送者在时间T2(一般设置为2s)内未接收到发布释放报文,转4.2.1.3.1,重新发送发布收到报文;
4.2.1.3.3接收者接收到发布释放报文,确认在这一次的传输流程中不会再有重传的消息报文到达,向发送者回复发布完成报文表示接收方也准备好将当前的报文ID用于新的消息了,转步骤4.2.1.3.4。
4.2.1.3.4QoS2数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1.2继续接收数据发布报文。
4.3消息代理从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者,方法是:
4.3.1若消息队列为空,转步骤4.3.1;否则消息代理的消息路由模块从消息队列中取出一条数据发布报文,根据数据发布报文的主题到消息代理的订阅管理模块A查找订阅列表,获取订阅了该主题数据的所有订阅者,并将数据发布报文和订阅者信息传递给消息代理的QoS发送模块A,转到步骤4.3.2。
4.3.2消息代理的QoS发送模块A从消息路由模块接收数据发布报文与订阅者信息,依据数据发布报文的QoS等级采用步骤4.1.3所述的数据发布方法按照不同的QoS等级发布数据发布报文到数据订阅者QoS接收模块B,此时消息代理QoS发送模块A作为发送者,数据订阅者QoS接收模块B作为接收者。转步骤4.3.1继续分发消息队列中的下一条数据发布报文。
4.4作为数据订阅者的客户端接收并处理数据发布报文,方法是:
4.4.1作为数据订阅者的客户端的QoS接收模块B按照步骤4.2所述的数据接收方法接收消息代理的QoS发送模块A发布的数据发布报文,并在接收完成后将数据发布报文发送到数据解压模块,转步骤4.4.2;若未接收到消息代理的QoS发送模块A发布的数据发布报文,转4.4.1;
4.4.2数据解压模块从QoS接收模块B接收数据发布报文,从数据发布报文中提取消息ID、消息负载,根据消息ID从消息集中获取消息定义,根据消息定义中各字段的类型和顺序,依次处理并恢复每个字段的原始数据,同时对经过压缩处理的字段进行解压,方法是:
4.4.2.1初始化变量x为1,设定消息定义中字段的总数为X;
4.4.2.2对变量x进行检查,如果x>X,则表示消息负载解码完成,转步骤4.4.3。如果x≤X,判断字段类型并处理:如果第x个字段类型为整数,令x=x+1,转步骤4.4.2.3。如果第x个字段类型为其他类型,令x=x+1,转步骤4.4.2.4。
4.4.2.3对于整数字段类型,采用Varint解码方法进行解压,方法是:
4.4.2.3.1初始化累加结果result为0,初始化位移量shift为0。shift表示当前处理的字节对应的位在结果整数中的位置。
4.4.2.3.2从消息负载中读取一个字节。
4.4.2.3.3解析字节:将当前字节与0x7F(即二进制的01111111)进行AND操作,得到当前字节的低7位值。将这个值左移shift位,然后与result进行OR操作,累加到result上。
4.4.2.3.4检查继续位:检查当前字节的最高位(即第8位):
如果最高位为0,表示这是最后一个字节,转步骤4.4.2.2,当前的result就是最终的整数值。如果最高位为1,表示后面还有字节,需要继续读取,转步骤4.4.2.2.5。
4.4.2.2.5更新位移量:将shift增加7,因为下一个字节代表更高的位,转步骤4.4.2.3.2。
4.4.2.4对于其他类型的字段,根据消息定义中指定的类型直接从消息负载中提取并恢复字段,完成后转步骤4.4.2.2以继续解压剩余字段。
4.4.3完成数据解压后,使用消息定义、消息定义中字段对应的具体数据组成数据单元。将数据单元发送给上层应用。至此数据采集流程完成,结束。
采用本发明可以达到以下技术效果:
1.相比基于点对点通讯的Modbus、CoAP,本发明第三步、第四步中基于消息队列的发布/订阅模型支持一对多和多对多的数据交换,单个采集节点的数据只需发送至消息代理,而非所有数据接收者,提高了数据分发的效率,并使得本发明特别适用于大型分布式***和复杂的网络结构。
2.相比OPC、AMQP、Modbus和CoAP,本发明第四步采用高效的数据编码和压缩方法进行数据编码压缩,能显著减少数据传输的带宽占用,提升了数据传输效率,使得本发明的数据采集方法更加轻量级,使得本发明可以在带宽有限的环境中得以有效应用。
3.本发明第4.1.3步对数据发布报文采用灵活的QoS进行发布,可以根据不同的网络环境和应用场景选择合适的服务质量级别,从而平衡了可靠性和效率;且本发明单个采集节点的数据只需发送至消息代理,而非所有数据接收者,这一优势也能够显著提高数据分发的效率。
附图说明
图1为本发明第一步构建的基于消息队列轻量级数据采集***逻辑结构图;
图2是本发明总体流程图;
图3为本发明第4.1.2步定义的数据发布报文格式;
图4为本发明第4.1.3步发送者与接收者间不同QoS的发布流程;
图5为使用通用开放式研究仿真平台构建的仿真环境,由虚拟服务器Broker和虚拟节点n1~n3和p1~p3构成;
图6为本发明与OPC、AMQP、Modbus和CoAP在仿真环境下进行数据采集模拟,在单轮数据采集中的资源占用对比图;
图7为本发明与OPC、AMQP、Modbus和CoAP在仿真环境下进行数据采集模拟,在不同采集节点规模下的总带宽资源占用对比图;
图8为本发明的不同QoS等级在不同采集节点规模下完成采集的时延对比图;
图9为本发明的不同QoS等级在不同采集节点规模下进行采集的丢包率对比图;
图10为本发明的不同QoS等级在不同采集节点规模下完成采集的总带宽资源对比图。
具体实施方式
下面结合附图对本发明进行说明。本发明总体流程如图2所示,包括以下步骤:
第一步:建立基于消息队列的轻量级数据采集***:
基于消息队列的轻量级数据采集***由多个客户端和1个服务端组成,客户端安装有客户端程序,服务端安装有消息代理程序。消息代理程序由连接管理模块A、会话管理模块A、安全认证与授权模块和消息代理模块组成。客户端程序由消息集、连接管理模块B、会话管理模块B、消息发布模块和消息订阅模块组成。当客户端程序启用消息发布模块时客户端作为消息发布者,当客户端程序启用消息订阅模块时客户端作为消息订阅者,客户端程序可以同时启用消息订阅模块和消息发布模块。
客户端的连接管理模块B与客户端会话管理模块B、消息代理的连接管理模块A相连。客户端的连接管理模块B向消息代理的连接管理模块A发送连接请请求报文(连接请求报文包含客户端的唯一标识符、用户名和密码等连接请求信息)进行身份认证,从连接管理模块A接收响应的连接确认报文,若接收到的是成功响应的报文,则生成会话信息B,将会话信息B发送到客户端的会话管理模块B。
消息代理的连接管理模块A与客户端的连接管理模块B、消息代理的会话管理模块A、消息代理的安全认证与授权模块相连。消息代理的连接管理模块A接收客户端的连接管理模块B发送的连接请求报文,连接管理模块A提取连接请求报文中的连接请求信息,将连接请求信息发送到安全认证与授权模块,并从安全认证与授权模块接收认证结果,根据认证结果生成连接确认报文作为连接请求报文的响应发送给客户端的连接管理模块B,对于认证成功的连接请求,生成会话信息A发送给会话管理模块A,会话信息A的内容包括客户端标识符、认证成功信息和接入时间。
消息代理的安全认证与授权模块与消息代理的连接管理模块A相连,从连接管理模块A接收连接请求信息,根据连接请求信息进行身份认证,将认证结果返回给消息代理的连接管理模块A。
消息代理的会话管理模块A与连接管理模块A、消息代理模块相连,从连接管理模块A接收会话信息A,提取客户端ID,将客户端ID作为接入客户端信息发送到消息代理模块。
客户端的会话管理模块B与客户端的连接管理模块B、客户端的消息发布模块、客户端的消息订阅模块相连。客户端的会话管理模块B从连接管理模块B接收会话信息B,根据客户端承担的是作为消息发布者还是消息订阅者启动消息发布模块或是消息订阅模块。
客户端的消息发布模块由数据采集模块、数据压缩模块和QoS发送模块B组成。
客户端的数据采集模块与客户端的消息集、客户端的数据压缩模块、传感器、设备接口、数据总线等相连。数据采集模块从消息集读取消息定义,根据消息定义从传感器、设备接口、数据总线等取得数据信息,生成数据单元(包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息),将数据单元发送到客户端数据压缩模块。
客户端数据压缩模块与客户端的数据采集模块、客户端的QoS发送模块B相连,数据压缩模块从数据采集模块接收数据单元,对数据单元进行压缩,生成数据发布报文,将数据发布报文发送到QoS发送模块B。
客户端的QoS发送模块B与客户端的数据压缩模块、消息代理的QoS接收模块A相连。QoS发送模块B在接收到数据压缩模块的数据发布报文后通过消息发布流程将数据发布报文发送到消息代理的QoS接收模块A。
消息代理的消息代理模块由消息队列、订阅管理模块A、消息路由模块、QoS发送模块A和QoS接收模块A组成。
消息代理的QoS接收模块A与客户端的QoS发送模块B、消息队列相连。消息代理的QoS接收模块A通过消息发布流程接收到客户端QoS发送模块B发布的消息发布报文后,将消息发布报文添加到消息队列。
消息代理的消息队列与消息代理的QoS接收模块A、消息代理的消息路由模块相连。消息队列从QoS接收模块A接收数据发布报文,将数据发布报文进行存贮,供消息代理的消息路由模块读取。
消息代理的消息路由模块与消息代理的消息队列、消息代理的订阅管理模块A、消息代理的QoS发送模块A相连。消息路由模块从消息队列读取数据发布报文,根据数据发布报文的主题从订阅管理模块A获取该主题的所有订阅者信息,将数据发布报文、订阅者信息发送给QoS发送模块A。
消息代理的订阅管理模块A与客户端的消息订阅模块、消息代理的消息路由模块相连。一方面消息代理的订阅管理模块A从客户端消息订阅模块接收订阅报文,提取订阅信息,根据订阅信息创建订阅,将订阅加到订阅列表中,一个订阅由以下几个部分构成:客户端ID(指唯一标识客户端的ID);主题过滤器(指定客户端感兴趣的消息主题,可以使用通配符进行匹配,以订阅多个相关的主题);服务质量(QoS)级别(指定客户端所要求的消息传递服务质量级别)。订阅管理模块A完成订阅创建后向客户端消息订阅模块发送订阅确认报文。另一方面消息代理的订阅管理模块A在收到消息路由模块发送的请求订阅信息时根据主题在订阅列表中查找匹配主题过滤器对应的所有客户端ID,并将客户端信息返回给消息代理的消息路由模块。
消息代理的QoS发送模块A与消息代理的消息路由模块、客户端的QoS接收模块B相连。QoS发送模块A从消息路由模块接收数据发布报文、订阅者信息,通过数据发布流程将数据发布报文发布到订阅者对应的客户端的QoS接收模块B。
客户端的消息订阅模块由订阅管理模块B、数据解压模块和QoS接收模块B组成。
客户端的订阅管理模块B与消息代理的订阅管理模块A相连。客户端的订阅管理模块B通过向订阅管理模块A发送订阅报文请求订阅,从订阅管理模块A接收响应的订阅确认报文,验证订阅状态。
客户端的QoS接收模块B与消息代理的QoS发送模块A、数据解压模块相连。客户端的QoS接收模块B从QoS发送模块A接收消息发布报文,将数据发布报文发送给数据解压模块。
客户端的数据解压模块与客户端的QoS接收模块B、客户端的消息集相连。从客户端的QoS接收模块B接收数据发布报文,根据数据发布报文的消息ID从消息集中读取对应的消息定义,根据消息定义将数据发布报文解压为数据单元,将数据单元提交给上层应用,进行后续入库、分析等工作。
客户端的消息集与客户端的数据采集模块、客户端的数据解压模块相连。消息集存贮消息定义,消息定义使用名称、ID、字段名称、类型和含义,以及它们的相互关系,来描述基于消息队列的轻量级数据采集***中使用的各种消息。旨在满足各个具体场景下的数据采集需求。每个消息定义包含一个或多个字段,每个字段都有一个特定的数据类型和含义。消息定义通常包括以下内容:
消息ID:消息ID是唯一标识消息定义的数字标识符。消息ID指定了消息的类型和用途;
消息描述:对消息的描述,即注释;
消息字段:消息中的字段,用于消息编码,每条消息必须至少有一个消息字段,消息字段具有以下属性:
字段类型:类似于Cstruct中的数据类型。可以是有符号或无符号的8、16、32、64字节大小的整数类型,也可以是单精度或双精度的浮点类型,也可以是数组类型;
字段名称:字段的描述名称;
字段单位(可选):某些字段可能需要包括其单位,例如距离字段可能需要包含单位(米、英尺等);
枚举类型(可选):对于枚举类型的字段,需要包含枚举类型定义,以便在代码中进行正确的解析和处理;枚举类型用于定义一组常量,用于表示不同采集到的数据特定的状态、模式和参数,比如传感器的正常、故障、校准中等状态。枚举类型列举有限的一组可能取值的情况,并用枚举值代表状态、模式和参数的标识符。
描述(可选):对字段进行描述以解释其含义和用途,
客户端的消息集供数据采集模块、数据解压模块读取。
第二步:客户端与服务端的消息代理建立连接并进行身份认证。方法是:客户端按照2.1所述流程与消息代理建立连接,包括向消息代理发起网络连接,并向消息代理发送携带身份信息的连接请求报文,接收并处理消息代理返回的连接确认报文;同时消息代理按照2.2所述流程等待并处理客户端连接请求,包括接收客户端的连接请求报文,从连接请求报文提取连接请求信息进行认证,向客户端返回连接确认报文。具体方法是:
2.1客户端与消息代理建立连接,方法是:
2.1.1客户端的连接管理模块B向消息代理的连接管理模块A发送连接请求报文,连接请求报文包含连接请求信息,连接请求信息包含客户端的唯一标识符、用户名和密码。
2.1.2客户端连接管理模块B等待接收消息代理连接管理模块A的连接确认报文并通过以下方法对连接确认报文进行验证:
2.1.2.1如果客户端连接管理模块B在第一时间阈值T(一般设置为1s)内没有收到连接确认报文,客户端关闭与服务端的网络连接,转步骤2.1.1。
2.1.2.2如果连接确认报文中的连接返回码不为“0”(表示服务器消息代理拒绝连接请求),则客户端关闭与服务端的网络连接,转步骤2.1.1。
2.1.2.3如果连接确认报文的连接返回码为“0”(表示服务器消息代理接受连接请求),接入成功,客户端与服务端消息代理的连接建立完成,客户端的连接管理模块B生成会话信息B,将会话信息B发送给会话管理模块B,会话信息B的内容包括消息代理网络地址和接入状态,若用户将该客户端用作数据订阅则客户端转第三步启动数据订阅功能;若用户将该客户端用作数据采集发布,则客户端转第四步启动数据发布功能。
2.2服务端等待并处理客户端连接请求,方法是:
2.2.1消息代理的连接管理模块A监听网络,等待客户端的连接管理模块B发送的连接请求报文。若收到客户端发送的连接请求报文,转步骤2.2.2;若未收到客户端发送的连接请求报文,转步骤2.2.1继续监听。
2.2.2消息代理的连接管理模块A接收客户端程序连接管理模块B发送的连接请求报文,验证客户端的连接请求,并进行身份认证,方法是:
2.2.2.1消息代理的连接管理模块A接收到客户端程序的连接管理模块B发送的连接请求报文,如果连接请求报文不合法(即报文格式错误、缺少必要字段、校验和校验失败),消息代理的连接管理模块A直接关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1;如果连接请求报文合法,提取客户端标识符、用户名和密码等客户端连接请求信息,将客户端连接请求信息发送给安全认证与授权模块,转步骤2.2.2.2。
2.2.2.2安全认证与授权模块根据客户端标识符、用户名和密码对客户端进行身份验证和授权检查,将认证结果返回给连接管理模块A,如果认证成功则向连接管理模块A发送认证成功信息,转步骤2.2.2.3;否则,安全认证与授权模块向连接管理模块A发送认证失败信息,转2.2.2.5;
2.2.2.3消息代理的连接管理模块A向客户端的连接管理模块B发送返回码为“0”的连接确认报文,并将会话信息A(包含客户端标识符、认证成功信息、接入时间)发送给会话管理模块A,转步骤2.2.2.4。
2.2.2.4会话管理模块A根据会话信息A中的客户端标识符、认证成功信息和接入时间更新客户端接入状态信息,转步骤2.2.1。
2.2.2.5连接管理模块A向客户端的连接管理模块B发送返回码不为“0”的连接确认报文,并且关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1。
第三步:作为消息订阅者的客户端向消息代理注册对特定主题的关注,以便接收与这些主题相关的消息,完成主题订阅。方法是:作为消息订阅者的客户端按照3.1所述流程向消息代理发起主题订阅并验证订阅确认报文。同时消息代理按照3.2所述流程等待接收并验证订阅报文,进行客户端订阅并响应订阅确认报文。具体为:
3.1作为消息订阅者的客户端发起主题订阅和验证订阅确认报文,方法是:
3.1.1订阅管理模块B向消息代理订阅管理模块A发送订阅报文用于请求创建订阅,订阅报文应至少包含至少一组订阅信息,订阅信息为客户端ID、主题过滤器和QoS等级字段的组合。
3.1.2订阅管理模块B等待并接收消息代理订阅管理模块A响应的订阅确认报文,订阅确认报文包含订阅报文中包含的所有订阅信息以及每组订阅信息对应的返回码,验证订阅状态,方法是:
3.1.2.1如果订阅管理模块B在第二时间阈值T2(一般设置为2s)内没有收到消息代理的订阅确认报文,转步骤3.1.1。
3.1.2.2如果订阅管理模块B收到消息代理的订阅确认报文,从订阅确认报文提取订阅信息和每组订阅信息对应的返回码,订阅管理模块B使用订阅信息和对应的返回码更新当前订阅状态(分订阅成功和订阅失败2种)。若返回码为0、1或2,则订阅成功,转第四步。若返回码不是0、1、2中的任意一个,则订阅失败,转步骤3.1.1重新发起订阅请求。
3.2消息代理等待接收并验证客户端的订阅请求,进行客户端订阅并响应订阅确认报文,方法是:
3.2.1消息代理订阅管理模块A监听网络,等待客户端的订阅管理模块B发送的订阅报文。若收到客户端发送的订阅报文,转步骤3.2.2;若未收到客户端发送的订阅报文,转步骤3.2.1继续监听。
3.2.2此时订阅管理模块A收到了客户端订阅管理模块B发送的订阅报文,验证订阅者的订阅请求,方法是:
3.2.2.1订阅管理模块A验证订阅报文合法性,如果订阅报文不合法,即报文格式错误、缺少必要字段、校验和校验失败等,转步骤3.2.1。如果订阅报文合法,从订阅报文提取订阅信息(包括客户端ID、主题过滤器和QoS等级字段),转步骤3.2.2.2。
3.2.2.2订阅管理模块A使用订阅信息中的客户端ID、主题过滤器和QoS等级字段创建新的订阅(由客户端ID、主题过滤器和QoS等级组成),将新的订阅添加到订阅列表中。转步骤3.2.2.3;
3.2.2.3订阅管理模块A向订阅管理模块B发送订阅确认报文,订阅确认报文包含订阅者订阅管理模块B发送的订阅报文中的所有订阅信息及每组订阅信息对应的一个返回码。返回码为该订阅的QoS等级,表示该订阅在消息代理中被授予的最大QoS等级,返回码为支持的QoS等级(0、1、2)以外的值表示这个订阅失败。转步骤3.2.1。
第四步:作为数据发布者的客户端采集数据,并通过消息代理发布消息到各个订阅者,完成数据发布。方法是:作为数据发布者的客户端按照4.1所述流程进行数据采集、编码压缩并发布到消息代理。同时消息代理开启两个线程,线程1按照4.2所述流程接收作为数据发布者的客户端发布的数据发布报文,将数据发布报文添加到消息队列;线程2按照4.3所述流程从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者。同时作为消息订阅者的客户端按照4.4所述流程接收消息代理分发的数据发布报文。
4.1作为数据发布者的客户端进行数据采集、编码压缩并发布到消息代理,方法是:
4.1.1作为数据发布者的客户端的数据采集模块根据需要发布的信息,从消息集读取对应的消息定义,并根据消息定义从发布者硬件设备上的传感器、设备接口、数据总线等获取具体数据,然后根据需要发布的信息的可靠性要求为其分配QoS级别,QoS级别共有0、1、2三个等级。QoS 0是最低的QoS等级,为可靠性要求低,实时性要求高的信息分配的QoS等级为0,消息即发即弃,不需要等待确认,不需要存储和重传,因此对于接收方来说,永远都不需要担心收到重复的消息;QoS1是居中的QoS等级,为可靠性要求居中,实时性要求居中的信息分配的QoS等级为1,为了保证消息到达,QoS1引入了确认和重传机制,发送方会存储数据发布报文,并等待接收方回复发布确认报文,只有在收到发布确认后,发送方才会删除本地存储的数据发布报文,并且不再需要重传该报文;QoS2是最高的QoS等级,为可靠性要求最高,实时性要求最低的信息分配的QoS等级为2。并设置消息主题,生成一个数据单元。数据单元包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息。数据采集模块将数据单元发送到作为数据发布者的客户端的数据压缩模块。
4.1.2作为数据发布者的客户端的数据压缩模块对数据单元进行编码压缩,构造数据发布报文,方法是:
4.1.2.1构造数据发布报文消息头部:首先创建一个长度为8字节的空字符串,作为数据发布报文的报文头部,然后填充消息头部的各个字段,包括序列号、节点标识符、消息ID和QoS等级,报文长度暂时不做填充。
4.1.2.2在数据发布报文消息头部后添加主题:将消息主题编码为UTF-8格式的字符串。UTF-8是ISO/IEC 10646中定义的一个高效的Unicode字符编码格式,每一个字符串都有一个两字节的长度字段作为前缀,前缀标识这个字符串UTF-8编码的字节数。将编码后的主题字段添加到数据发布报文头部之后。
4.1.2.3在数据发布报文的主题字段后添加消息负载:消息负载包含消息定义中定义的所有字段,按消息定义中消息字段顺序枚举消息字段,并根据消息字段的字段类型将具体数据添加到数据发布报文之后,并对部分字段类型进行压缩编码,具体方法如下:
4.1.2.3.1初始化变量x为1,令消息定义中字段的总数为X;
4.1.2.3.2若x>X,消息负载编码压缩完成,转步骤4.1.2.4。若x≤X,判断字段类型并处理:如果第x个字段类型为整数,令x=x+1,转步骤4.1.2.3.3;如果第x个字段类型为其他类型,令x=x+1,转步骤4.1.2.3.4。
4.1.2.3.3此时第x个字段类型为整数,使用Varint对整数进行编码。Varint最早是作为Google Protocol Buffers(一种由Google开发的数据序列化协议)中的一种数据类型而引入,Varint是一种整数压缩编码方式,用于对整数进行压缩,以节省数据存储空间。Varint编码使用变长的字节数来表示整数,较小的整数会占用较少的字节数,而较大的整数会占用更多的字节数,将编码后字段添加到数据发布报文之后。具体压缩编码方法如下:
4.1.2.3.3.1如果第x个字段对应的具体数据的值是7位的整数,直接将这7位作为编码结果,转步骤4.1.2.3.2。
4.1.2.3.3.2如果第x个字段对应的具体数据的值是大于7位的整数,Varint将整数分成若干个7位的部分,每个部分的最高位用来标识是否还有后续字节,其余的7位用来表示整数的值,转步骤4.1.2.3.2。
4.1.2.3.4此时第x个字段字段类型为其他类型:使用消息定义中第x个字段类型定义的类型添加字段到数据发布报文之后,转步骤4.1.2.3.2。
4.1.2.4为数据发布报文填充报文长度字段:报文长度为当前构造的数据发布报文长度加上2字节的校验和长度,在数据发布报文的报文长度位置更新报文长度字段。
4.1.2.5为数据发布报文添加检验和:使用CRC校验算法计算数据发布报文的校验和,并将校验和添加到数据发布报文最后,以确保消息的完整性。数据发布报文包括报文长度(2字节)、序列号(2字节)、节点标识符(2字节)、消息ID(14位)、QoS等级(2位)、主题、消息负载、校验和(2字节)。将数据发布报文发送到作为数据发布者的客户端的QoS发送模块B,转步骤4.1.3。
4.1.3作为数据发布者的客户端采用数据发布方法按照不同的QoS等级以频率f(通常设置为1Hz,即每秒进行一轮数据发布)将数据发布报文发布到消息代理。此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者。数据发布方法是:
4.1.3.1若数据发布报文的QoS等级为0,则发送者对数据发布报文进行“最多一次”传输:
发送者完成向接收者发送数据发布报文即完成QoS 0消息发布流程,转步骤4.1.1开始下一轮信息采集发布。
4.1.3.2若数据发布报文的QoS等级为1,则发送者对数据发布报文进行“至少一次”传输,即进行QoS1消息发布,
方法是:
4.1.3.2.1发送者存储QoS1的数据发布报文。
4.1.3.2.2发送者向接收者发送QoS1的数据发布报文。
4.1.3.2.3发送者等待接收者回复的发布确认报文,若发送者收到接收者响应的发布确认报文,转4.1.3.2.4,若发送者在时间T2(一般设置为2s)内未接收到发布确认报文,转4.1.3.2.2重新向接收者发送QoS1的数据发布报文。
4.1.3.2.4发送者删除存储的数据发布报文,完成QoS1发布流程,转步骤4.1.1开始下一轮信息采集发布。
4.1.3.3若数据发布报文的QoS等级为2,则发送者对数据发布报文进行“恰好一次”传输,方法是:
4.1.3.3.1发送者存储QoS2的数据发布报文;
4.1.3.3.2发送者向接收者发送QoS2的数据发布报文;
4.1.3.3.3发送者等待接收者回复发布收到报文,若发送者收到接收者响应的发布收到报文,转4.1.3.3.4,若发送者在时间T2(一般设置为2s)内未接收到发布收到报文,转4.1.3.3.2,重新发送数据发布报文;
4.1.3.3.4发送者收到发布收到报文,即可确认接收者已经收到数据发布报文,发送方将不再需要重传这个报文,并且也不能再重传这个报文。发布者删除本地存储的数据发布报文,发送者向接收者发送发布释放报文,转步骤4.1.3.3.5;
4.1.3.3.5发送者等待接收者响应的发布完成报文,若发送者收到接收者响应的发布完成报文,即完成QoS2发布流程,转步骤4.1.1等待开始下一轮信息采集发布,若发送者在时间T2(一般设置为2s)内未接收到发布完成报文,转4.1.3.3.4,重新向接收者发送发布释放报文;
4.2消息代理采用数据接收方法接收数据发布者发布的数据发布报文,并将报文添加到消息队列中。此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者。数据接收方法是:
4.2.1接收者等待接收发送者发送的数据发布报文,并根据QoS等级进行不同的处理和响应,方法是:
4.2.1.1若接收到的数据发布报文QoS等级为0,QoS 0数据发布接收完成,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文。
4.2.1.2若接收到的数据发布报文QoS等级为1,处理并响应发布确认报文,方法是:
4.2.1.2.1向发送者回复发布确认报文,发布确认报文的报文ID与数据发布报文的报文ID相同,以便发送者收到后删除正确的数据发布报文缓存。
4.2.1.2.1QoS1数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文。
4.2.1.3若接收到的数据发布报文QoS等级为2,处理并进行响应,方法是:
4.2.1.3.1记录数据发布报文的消息ID,向发送者回复发布收到报文,发布收到报文的报文ID与数据发布报文的报文ID相同;
4.2.1.3.2接收者等待接收发送者发送的发布释放报文,若发送者收到发送者发送的发布释放报文,转4.2.1.3.3,若发送者在时间T2(一般设置为2s)内未接收到发布释放报文,转4.2.1.3.1,重新发送发布收到报文;
4.2.1.3.3接收者接收到发布释放报文,确认在这一次的传输流程中不会再有重传的消息报文到达,向发送者回复发布完成报文表示接收方也准备好将当前的报文ID用于新的消息了,转步骤4.2.1.3.4。
4.2.1.3.4QoS2数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1.2继续接收数据发布报文。
4.3消息代理从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者,方法是:
4.3.1若消息队列为空,转步骤4.3.1;否则消息代理的消息路由模块从消息队列中取出一条数据发布报文,根据数据发布报文的主题到消息代理的订阅管理模块A查找订阅列表,获取订阅了该主题数据的所有订阅者,并将数据发布报文和订阅者信息传递给消息代理的QoS发送模块A,转到步骤4.3.2。
4.3.2消息代理的QoS发送模块A从消息路由模块接收数据发布报文与订阅者信息,依据数据发布报文的QoS等级采用步骤4.1.3所述的数据发布方法按照不同的QoS等级发布数据发布报文到数据订阅者QoS接收模块B,此时消息代理QoS发送模块A作为发送者,数据订阅者QoS接收模块B作为接收者。转步骤4.3.1继续分发消息队列中的下一条数据发布报文。
4.4作为数据订阅者的客户端接收并处理数据发布报文,方法是:
4.4.1作为数据订阅者的客户端的QoS接收模块B按照步骤4.2所述的数据接收方法接收消息代理的QoS发送模块A发布的数据发布报文,并在接收完成后将数据发布报文发送到数据解压模块,转步骤4.4.2;若未接收到消息代理的QoS发送模块A发布的数据发布报文,转4.4.1;
4.4.2数据解压模块从QoS接收模块B接收数据发布报文,从数据发布报文中提取消息ID、消息负载,根据消息ID从消息集中获取消息定义,根据消息定义中各字段的类型和顺序,依次处理并恢复每个字段的原始数据,同时对经过压缩处理的字段进行解压,方法是:
4.4.2.1初始化变量x为1,设定消息定义中字段的总数为X;
4.4.2.2对变量x进行检查,如果x>X,则表示消息负载解码完成,转步骤4.4.3。如果x≤X,判断字段类型并处理:如果第x个字段类型为整数,令x=x+1,转步骤4.4.2.3。如果第x个字段类型为其他类型,令x=x+1,转步骤4.4.2.4。
4.4.2.3对于整数字段类型,采用Varint解码方法进行解压,方法是:
4.4.2.3.1初始化累加结果result为0,初始化位移量shift为0。shift表示当前处理的字节对应的位在结果整数中的位置。
4.4.2.3.2从消息负载中读取一个字节。
4.4.2.3.3解析字节:将当前字节与0x7F(即二进制的01111111)进行AND操作,得到当前字节的低7位值。将这个值左移shift位,然后与result进行OR操作,累加到result上。
4.4.2.3.4检查继续位:检查当前字节的最高位(即第8位):
如果最高位为0,表示这是最后一个字节,转步骤4.4.2.2,当前的result就是最终的整数值。如果最高位为1,表示后面还有字节,需要继续读取,转步骤4.4.2.2.5。
4.4.2.2.5更新位移量:将shift增加7,因为下一个字节代表更高的位,转步骤4.4.2.3.2。
4.4.2.4对于其他类型的字段,根据消息定义中指定的类型直接从消息负载中提取并恢复字段,完成后转步骤4.4.2.2以继续解压剩余字段。
4.4.3完成数据解压后,使用消息定义、消息定义中字段对应的具体数据组成数据单元。将数据单元发送给上层应用。至此数据采集流程完成,结束。
为验证本发明的效果,使用通用开放式研究仿真平台(Common Open ResearchEmulator,CORE)的8.2.0版本,来构建一个实验环境。实验运行在一台配备单个CPUXeon3.0GHz、8GB RAM的服务器上,服务器安装Ubuntu 20.04操作***。通过在CORE中构建了虚拟网络节点,以模拟数据采集场景。
如图5所示,构造数据采集场景,具体操作包括在虚拟服务器Broker上部署消息代理,并在虚拟节点n1~n3和p1~p3上部署客户端程序。在该场景中,节点n1~n3启动数据发布功能,而节点p1~p3启动数据订阅功能。实验利用该***采集了虚拟节点n1~n3的CPU使用情况、***时间、内存使用情况以及磁盘空间等***信息,并通过节点p1~p3订阅获取这些信息,消息的发布频率f设定为1Hz即每秒进行一轮数据发布,以验证实验效果。
为了测试本发明在大规模和复杂网络环境中的性能,在n1至n3的每个节点上运行多个客户端程序,并启动数据发布功能,从而模拟大规模网络环境。
图6是采用上述环境,模拟数据采集,使用Wireshark4.0.4(Wireshark是一个免费开源的网络数据包分析软件,能够截取分析网络数据包)对采集节点进行抓包,不同采集方法在单轮数据采集下的报文大小统计,展示了在单次数据采集中,本发明与OPC、AMQP、Modbus和CoAP等方法在完成相同数据采集任务时所需的网络资源对比。从图6可见,采用本发明进行数据采集时单轮占用带宽远小于OPC、AMQP、Modbus和CoAP方法占用带宽。
图7是采用上述环境,模拟数据采集,使用通用开放式研究仿真平台流量统计功能统计在不同节点规模下不同采集方法完成数据采集的总带宽占用统计,显示了在不同规模的采集节点下,本发明与OPC、AMQP、Modbus和CoAP等方法在不同采集节点规模下总带宽资源的使用情况。从图7可见,采用本发明进行数据采集时占用的总带宽远小于OPC、AMQP、Modbus和CoAP方法占用带宽。
从图6、图7可知本发明完成相同数据采集任务时带宽占用显著低于其他方法。因此本发明能显著减少带宽占用。
通过使用发布者客户端记录数据发布报文发布时间,订阅者客户端记录数据发布报文发布完成时间,计算采集时延,图8为本发明在模拟数据采集场景中使用不同QoS等级在不同采集节点规模下完成采集的时延对比图。通过在数据发布报文中添加序列号,根据序列号统计数据发布报文丢包情况。图9为本发明在模拟数据采集场景中不同QoS等级在不同采集节点规模下进行采集的丢包率对比图。图10为本发明在模拟数据采集场景中不同QoS等级在不同采集节点规模下使用通用开放式研究仿真平台流量统计功能统计出的完成采集的总带宽资源占用对比图。图8~图10展示了在不同规模的采集节点和不同服务质量(QoS)等级下,采集的时延、丢包率和总带宽使用情况。结果显示,虽然更高的QoS等级可以保证更高的数据交换可靠性,但同时也会增加网络资源的消耗和数据采集的时延。这表明本发明能够通过调整服务质量等级,有效地平衡数据采集的可靠性和效率。
本发明还显示了一个重要优势:在一个多对多的数据采集场景中,传统非发布/订阅方法需要建立的网络连接数为m*n(其中m为数据采集者数量,n为数据接收者数量),而本发明只需要各个客户端与消息代理建立网络连接,仅需建立m+n的网络连接数(如图5所示)。单个采集节点的数据只需发送至消息代理,而非所有数据接收者。这一优势能够显著提高数据分发的效率。
以上对本发明所提供的一种基于消息队列的轻量级数据采集方法进行了详细介绍。本文对本发明的原理及实施方式进行了阐述,以上说明用于帮助理解本发明的核心思想。应当指出,对于本技术领域的普通研究人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。
Claims (11)
1.一种基于消息队列的轻量级数据采集方法,其特征在于包括以下步骤:
第一步:建立基于消息队列的轻量级数据采集***:
基于消息队列的轻量级数据采集***由多个客户端和1个服务端组成,客户端安装有客户端程序,服务端安装有消息代理程序;消息代理程序由连接管理模块A、会话管理模块A、安全认证与授权模块和消息代理模块组成;客户端程序由消息集、连接管理模块B、会话管理模块B、消息发布模块和消息订阅模块组成;当客户端程序启用消息发布模块时客户端作为消息发布者,当客户端程序启用消息订阅模块时客户端作为消息订阅者,客户端程序可以同时启用消息订阅模块和消息发布模块;
客户端的连接管理模块B与客户端会话管理模块B、消息代理的连接管理模块A相连;客户端的连接管理模块B向消息代理的连接管理模块A发送连接请请求报文进行身份认证,从连接管理模块A接收响应的连接确认报文,若接收到的是成功响应的报文,则生成会话信息B,将会话信息B发送到客户端的会话管理模块B;所述连接请求报文包含连接请求信息,连接请求信息包括客户端的唯一标识符、用户名和密码;
消息代理的连接管理模块A与客户端的连接管理模块B、消息代理的会话管理模块A、消息代理的安全认证与授权模块相连;消息代理的连接管理模块A接收客户端的连接管理模块B发送的连接请求报文,连接管理模块A提取连接请求报文中的连接请求信息,将连接请求信息发送到安全认证与授权模块,并从安全认证与授权模块接收认证结果,根据认证结果生成连接确认报文作为连接请求报文的响应发送给客户端的连接管理模块B,对于认证成功的连接请求,生成会话信息A发送给会话管理模块A,会话信息A的内容包括客户端标识符、认证成功信息和接入时间;
消息代理的安全认证与授权模块与消息代理的连接管理模块A相连,从连接管理模块A接收连接请求信息,根据连接请求信息进行身份认证,将认证结果返回给消息代理的连接管理模块A;
消息代理的会话管理模块A与连接管理模块A、消息代理模块相连,从连接管理模块A接收会话信息A,提取客户端ID,将客户端ID作为接入客户端信息发送到消息代理模块;
客户端的会话管理模块B与客户端的连接管理模块B、客户端的消息发布模块、客户端的消息订阅模块相连;客户端的会话管理模块B从连接管理模块B接收会话信息B,根据客户端承担的是作为消息发布者还是消息订阅者启动消息发布模块或是消息订阅模块;
客户端的消息发布模块由数据采集模块、数据压缩模块和QoS发送模块B组成;
客户端的数据采集模块与客户端的消息集、客户端的数据压缩模块、传感器、设备接口、数据总线等相连;数据采集模块从消息集读取消息定义,根据消息定义从传感器、设备接口、数据总线等取得数据信息,生成数据单元,将数据单元发送到客户端数据压缩模块;所述数据单元包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息;
客户端数据压缩模块与客户端的数据采集模块、客户端的QoS发送模块B相连,数据压缩模块从数据采集模块接收数据单元,对数据单元进行压缩,生成数据发布报文,将数据发布报文发送到QoS发送模块B;
客户端的QoS发送模块B与客户端的数据压缩模块、消息代理的QoS接收模块A相连;QoS发送模块B在接收到数据压缩模块的数据发布报文后通过消息发布流程将数据发布报文发送到消息代理的QoS接收模块A;
消息代理的消息代理模块由消息队列、订阅管理模块A、消息路由模块、QoS发送模块A和QoS接收模块A组成;
消息代理的QoS接收模块A与客户端的QoS发送模块B、消息队列相连;消息代理的QoS接收模块A通过消息发布流程接收到客户端QoS发送模块B发布的消息发布报文后,将消息发布报文添加到消息队列;
消息代理的消息队列与消息代理的QoS接收模块A、消息代理的消息路由模块相连;消息队列从QoS接收模块A接收数据发布报文,将数据发布报文进行存贮,供消息代理的消息路由模块读取;
消息代理的消息路由模块与消息代理的消息队列、消息代理的订阅管理模块A、消息代理的QoS发送模块A相连;消息路由模块从消息队列读取数据发布报文,根据数据发布报文的主题从订阅管理模块A获取该主题的所有订阅者信息,将数据发布报文、订阅者信息发送给QoS发送模块A;
消息代理的订阅管理模块A与客户端的消息订阅模块、消息代理的消息路由模块相连;一方面消息代理的订阅管理模块A从客户端消息订阅模块接收订阅报文,提取订阅信息,根据订阅信息创建订阅,将订阅加到订阅列表中,一个订阅由客户端ID、主题过滤器、服务质量QoS级别组成;订阅管理模块A完成订阅创建后向客户端消息订阅模块发送订阅确认报文;另一方面消息代理的订阅管理模块A在收到消息路由模块发送的请求订阅信息时根据主题在订阅列表中查找匹配主题过滤器对应的所有客户端ID,并将客户端信息返回给消息代理的消息路由模块;
消息代理的QoS发送模块A与消息代理的消息路由模块、客户端的QoS接收模块B相连;QoS发送模块A从消息路由模块接收数据发布报文、订阅者信息,通过数据发布流程将数据发布报文发布到订阅者对应的客户端的QoS接收模块B;
客户端的消息订阅模块由订阅管理模块B、数据解压模块和QoS接收模块B组成;
客户端的订阅管理模块B与消息代理的订阅管理模块A相连;客户端的订阅管理模块B通过向订阅管理模块A发送订阅报文请求订阅,从订阅管理模块A接收响应的订阅确认报文,验证订阅状态;
客户端的QoS接收模块B与消息代理的QoS发送模块A、数据解压模块相连;客户端的QoS接收模块B从QoS发送模块A接收消息发布报文,将数据发布报文发送给数据解压模块;
客户端的数据解压模块与客户端的QoS接收模块B、客户端的消息集相连;从客户端的QoS接收模块B接收数据发布报文,根据数据发布报文的消息ID从消息集中读取对应的消息定义,根据消息定义将数据发布报文解压为数据单元,将数据单元提交给上层应用;
客户端的消息集与客户端的数据采集模块、客户端的数据解压模块相连;消息集存贮消息定义,消息定义使用名称、ID、字段名称、类型和含义,以及它们的相互关系,来描述基于消息队列的轻量级数据采集***中使用的各种消息;旨在满足各个具体场景下的数据采集需求;每个消息定义包含一个或多个字段,每个字段都有一个特定的数据类型和含义;消息定义包括消息ID、消息描述、消息字段、字段类型、字段名称、字段单位、枚举类型、描述;
客户端的消息集供数据采集模块、数据解压模块读取;
第二步:客户端与服务端的消息代理建立连接并进行身份认证;方法是:客户端按照2.1所述流程与消息代理建立连接,包括向消息代理发起网络连接,并向消息代理发送携带身份信息的连接请求报文,接收并处理消息代理返回的连接确认报文;同时消息代理按照2.2所述流程等待并处理客户端连接请求,包括接收客户端的连接请求报文,从连接请求报文提取连接请求信息进行认证,向客户端返回连接确认报文;具体方法是:
2.1客户端与消息代理建立连接,方法是:
2.1.1客户端的连接管理模块B向消息代理的连接管理模块A发送连接请求报文,连接请求报文包含连接请求信息,连接请求信息包含客户端的唯一标识符、用户名和密码;
2.1.2客户端连接管理模块B等待接收消息代理连接管理模块A的连接确认报文并对连接确认报文进行验证,方法是:
2.1.2.1如果客户端连接管理模块B在第一时间阈值T内没有收到连接确认报文,客户端关闭与服务端的网络连接,转步骤2.1.1;
2.1.2.2如果连接确认报文中的连接返回码不为“0”即服务器消息代理拒绝连接请求,则客户端关闭与服务端的网络连接,转步骤2.1.1;
2.1.2.3如果连接确认报文的连接返回码为“0”即服务器消息代理接受连接请求,接入成功,客户端与服务端消息代理的连接建立完成,客户端的连接管理模块B生成会话信息B,将会话信息B发送给会话管理模块B,若用户将该客户端用作数据订阅则客户端转第三步启动数据订阅功能;若用户将该客户端用作数据采集发布,则客户端转第四步启动数据发布功能;
2.2服务端等待并处理客户端连接请求,方法是:
2.2.1消息代理的连接管理模块A监听网络,等待客户端的连接管理模块B发送的连接请求报文;若收到客户端发送的连接请求报文,转步骤2.2.2;若未收到客户端发送的连接请求报文,转步骤2.2.1继续监听;
2.2.2消息代理的连接管理模块A接收客户端程序连接管理模块B发送的连接请求报文,验证客户端的连接请求,并进行身份认证,方法是:
2.2.2.1消息代理的连接管理模块A接收到客户端程序的连接管理模块B发送的连接请求报文,如果连接请求报文不合法,消息代理的连接管理模块A直接关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1;如果连接请求报文合法,提取客户端标识符、用户名和密码等客户端连接请求信息,将客户端连接请求信息发送给安全认证与授权模块,转步骤2.2.2.2;
2.2.2.2安全认证与授权模块根据客户端标识符、用户名和密码对客户端进行身份验证和授权检查,将认证结果返回给连接管理模块A,如果认证成功则向连接管理模块A发送认证成功信息,转步骤2.2.2.3;否则,安全认证与授权模块向连接管理模块A发送认证失败信息,转2.2.2.5;
2.2.2.3消息代理的连接管理模块A向客户端的连接管理模块B发送返回码为“0”的连接确认报文,并将会话信息A发送给会话管理模块A,转步骤2.2.2.4;
2.2.2.4会话管理模块A根据会话信息A中的客户端标识符、认证成功信息和接入时间更新客户端接入状态信息,转步骤2.2.1;
2.2.2.5连接管理模块A向客户端的连接管理模块B发送返回码不为“0”的连接确认报文,并且关闭与发送连接请求报文的客户端的网络连接,转步骤2.2.1;
第三步:作为消息订阅者的客户端向消息代理注册对特定主题的关注,以便接收与这些主题相关的消息,完成主题订阅,方法是:作为消息订阅者的客户端按照3.1所述流程向消息代理发起主题订阅并验证订阅确认报文;同时消息代理按照3.2所述流程等待接收并验证订阅报文,进行客户端订阅并响应订阅确认报文;具体为:
3.1作为消息订阅者的客户端发起主题订阅和验证订阅确认报文,方法是:
3.1.1订阅管理模块B向消息代理订阅管理模块A发送订阅报文用于请求创建订阅,订阅报文应至少包含至少一组订阅信息,订阅信息为客户端ID、主题过滤器和QoS等级字段的组合;
3.1.2订阅管理模块B等待并接收消息代理订阅管理模块A响应的订阅确认报文,订阅确认报文包含订阅报文中包含的所有订阅信息以及每组订阅信息对应的返回码,验证订阅状态,方法是:
3.1.2.1如果订阅管理模块B在第二时间阈值T2内没有收到消息代理的订阅确认报文,转步骤3.1.1;
3.1.2.2如果订阅管理模块B收到消息代理的订阅确认报文,从订阅确认报文提取订阅信息和每组订阅信息对应的返回码,订阅管理模块B使用订阅信息和对应的返回码更新当前订阅状态;若返回码为0、1或2,则订阅成功,转第四步;若返回码不是0、1、2中的任意一个,则订阅失败,转步骤3.1.1重新发起订阅请求;
3.2消息代理等待接收并验证客户端的订阅请求,进行客户端订阅并响应订阅确认报文,方法是:
3.2.1消息代理订阅管理模块A监听网络,等待客户端的订阅管理模块B发送的订阅报文;若收到客户端发送的订阅报文,转步骤3.2.2;若未收到客户端发送的订阅报文,转步骤3.2.1继续监听;
3.2.2此时订阅管理模块A收到了客户端订阅管理模块B发送的订阅报文,验证订阅者的订阅请求,方法是:
3.2.2.1订阅管理模块A验证订阅报文合法性,如果订阅报文不合法,转步骤3.2.1;如果订阅报文合法,从订阅报文提取订阅信息,转步骤3.2.2.2;
3.2.2.2订阅管理模块A使用订阅信息中的客户端ID、主题过滤器和QoS等级字段创建新的订阅,将新的订阅添加到订阅列表中;转步骤3.2.2.3;
3.2.2.3订阅管理模块A向订阅管理模块B发送订阅确认报文,订阅确认报文包含订阅者订阅管理模块B发送的订阅报文中的所有订阅信息及每组订阅信息对应的一个返回码;返回码为该订阅的QoS等级,表示该订阅在消息代理中被授予的最大QoS等级,返回码为支持的QoS等级以外的值表示这个订阅失败;转步骤3.2.1;
第四步:作为数据发布者的客户端采集数据,并通过消息代理发布消息到各个订阅者,完成数据发布;方法是:作为数据发布者的客户端按照4.1所述流程进行数据采集、编码压缩并发布到消息代理;同时消息代理开启两个线程,线程1按照4.2所述流程接收作为数据发布者的客户端发布的数据发布报文,将数据发布报文添加到消息队列;线程2按照4.3所述流程从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者;同时作为消息订阅者的客户端按照4.4所述流程接收消息代理分发的数据发布报文;具体为:
4.1作为数据发布者的客户端进行数据采集、编码压缩并发布到消息代理,方法是:
4.1.1作为数据发布者的客户端的数据采集模块根据需要发布的信息,从消息集读取对应的消息定义,并根据消息定义从发布者硬件设备上的传感器、设备接口、数据总线获取具体数据,然后根据需要发布的信息的可靠性要求为其分配QoS级别,QoS级别共有0、1、2三个等级;并设置消息主题,生成一个数据单元;数据单元包含消息ID、QoS级别、消息定义以及消息定义中的所有字段的具体数据信息;数据采集模块将数据单元发送到作为数据发布者的客户端的数据压缩模块;
4.1.2作为数据发布者的客户端的数据压缩模块对数据单元进行编码压缩,构造数据发布报文,方法是:
4.1.2.1构造数据发布报文消息头部:首先创建一个长度为8字节的空字符串,作为数据发布报文的报文头部,然后填充消息头部的各个字段,包括序列号、节点标识符、消息ID和QoS等级,报文长度暂时不做填充;
4.1.2.2在数据发布报文消息头部后添加主题:将消息主题编码为UTF-8格式的字符串;将编码后的主题字段添加到数据发布报文头部之后;
4.1.2.3在数据发布报文的主题字段后添加消息负载:消息负载包含消息定义中定义的所有字段,按消息定义中消息字段顺序枚举消息字段,并根据消息字段的字段类型将具体数据添加到数据发布报文之后,并对部分字段类型进行压缩编码,具体方法如下:
4.1.2.3.1初始化变量x为1,令消息定义中字段的总数为X;
4.1.2.3.3.2如果第x个字段对应的具体数据的值是大于7位的整数,Varint将整数分成若干个7位的部分,每个部分的最高位用来标识是否还有后续字节,其余的7位用来表示整数的值,转步骤4.1.2.3.2。
4.1.2.3.3使用Varint对整数进行编码,方法如下:
4.1.2.3.3.1如果第x个字段对应的具体数据的值是7位的整数,直接将这7位作为编码结果,转步骤4.1.2.3.2;
4.1.2.3.3.2如果第x个字段对应的具体数据的值是大于7位的整数,Varint将整数分成若干个7位的部分,每个部分的最高位用来标识是否还有后续字节,其余的7位用来表示整数的值,转步骤4.1.2.3.2;
4.1.2.3.4使用消息定义中第x个字段类型定义的类型添加字段到数据发布报文之后,转步骤4.1.2.3.2;
4.1.2.4为数据发布报文填充报文长度字段:报文长度为当前构造的数据发布报文长度加上2字节的校验和长度,在数据发布报文的报文长度位置更新报文长度字段;
4.1.2.5为数据发布报文添加检验和:使用CRC校验算法计算数据发布报文的校验和,并将校验和添加到数据发布报文最后。数据发布报文包括报文长度(2字节)、序列号(2字节)、节点标识符(2字节)、消息ID(14位)、QoS等级(2位)、主题、消息负载、校验和(2字节),将数据发布报文发送到作为数据发布者的客户端的QoS发送模块B,转步骤4.1.3;
4.1.3作为数据发布者的客户端采用数据发布方法按照不同的QoS等级以频率f将数据发布报文发布到消息代理;此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者;数据发布方法是:
4.1.3.1若数据发布报文的QoS等级为0,则发送者对数据发布报文进行“最多一次”传输:发送者完成向接收者发送数据发布报文即完成QoS 0消息发布流程,转步骤4.1.1;
4.1.3.2若数据发布报文的QoS等级为1,则发送者对数据发布报文进行“至少一次”传输,即进行QoS1消息发布,转步骤4.1.1开始下一轮信息采集发布;
4.1.3.3若数据发布报文的QoS等级为2,则发送者对数据发布报文进行“恰好一次”传输,即完成QoS2发布流程,转步骤4.1.1等待开始下一轮信息采集发布;
4.2消息代理采用数据接收方法接收数据发布者发布的数据发布报文,并将报文添加到消息队列中;此时作为数据发布者的客户端QoS发送模块B为发送者,消息代理QoS接收模块A作为接收者;数据接收方法是:
4.2.1接收者等待接收发送者发送的数据发布报文,并根据QoS等级进行不同的处理和响应,方法是:
4.2.1.1若接收到的数据发布报文QoS等级为0,QoS 0数据发布接收完成,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文;
4.2.1.2若接收到的数据发布报文QoS等级为1,处理并响应发布确认报文,方法是:
4.2.1.2.1向发送者回复发布确认报文,发布确认报文的报文ID与数据发布报文的报文ID相同;
4.2.1.2.1QoS1数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1继续接收数据发布报文;
4.2.1.3若接收到的数据发布报文QoS等级为2,处理并进行响应,方法是:
4.2.1.3.1记录数据发布报文的消息ID,向发送者回复发布收到报文,发布收到报文的报文ID与数据发布报文的报文ID相同;
4.2.1.3.2接收者等待接收发送者发送的发布释放报文,若发送者收到发送者发送的发布释放报文,转4.2.1.3.3,若发送者在T2内未接收到发布释放报文,转4.2.1.3.1,重新发送发布收到报文;
4.2.1.3.3接收者接收到发布释放报文,确认在这一次的传输流程中不会再有重传的消息报文到达,向发送者回复发布完成报文表示接收方也准备好将当前的报文ID用于新的消息了,转步骤4.2.1.3.4;
4.2.1.3.4QoS2数据接收完成后,添加数据发布报文到消息队列,转步骤4.2.1.2继续接收数据发布报文;
4.3消息代理从消息队列取出数据发布报文,根据主题信息将数据发布报文分发给订阅了相应主题的订阅者,方法是:
4.3.1若消息队列为空,转步骤4.3.1;否则消息代理的消息路由模块从消息队列中取出一条数据发布报文,根据数据发布报文的主题到消息代理的订阅管理模块A查找订阅列表,获取订阅了该主题数据的所有订阅者,并将数据发布报文和订阅者信息传递给消息代理的QoS发送模块A,转到步骤4.3.2;
4.3.2消息代理的QoS发送模块A从消息路由模块接收数据发布报文与订阅者信息,依据数据发布报文的QoS等级采用步骤4.1.3所述的数据发布方法按照不同的QoS等级发布数据发布报文到数据订阅者QoS接收模块B,此时消息代理QoS发送模块A作为发送者,数据订阅者QoS接收模块B作为接收者;转步骤4.3.1继续分发消息队列中的下一条数据发布报文;
4.4作为数据订阅者的客户端接收并处理数据发布报文,方法是:
4.4.1作为数据订阅者的客户端的QoS接收模块B按照步骤4.2所述的数据接收方法接收消息代理的QoS发送模块A发布的数据发布报文,并在接收完成后将数据发布报文发送到数据解压模块,转步骤4.4.2;若未接收到消息代理的QoS发送模块A发布的数据发布报文,转4.4.1;
4.4.2数据解压模块从QoS接收模块B接收数据发布报文,从数据发布报文中提取消息ID、消息负载,根据消息ID从消息集中获取消息定义,根据消息定义中各字段的类型和顺序,依次处理并恢复每个字段的原始数据;同时对经过压缩处理的字段进行解压;,方法是:
4.4.2.1初始化变量x为1,设定消息定义中字段的总数为X;
4.4.2.2对变量x进行检查,如果x>X,则表示消息负载解码完成,转步骤4.4.3。如果x≤X,判断字段类型并处理:如果第x个字段类型为整数,令x=x+1,转步骤4.4.2.3。如果第x个字段类型为其他类型,令x=x+1,转步骤4.4.2.4。
4.4.2.3对于整数字段类型,采用Varint解码方法进行解压,解压完毕转步骤4.4.2.2继续解压剩余字段;
4.4.2.4对于其他类型的字段,根据消息定义中指定的类型直接从消息负载中提取并恢复字段,完成后转步骤4.4.2.2继续解压剩余字段;
4.4.3完成数据解压后,使用消息定义、消息定义中字段对应的具体数据组成数据单元;将数据单元发送给上层应用,至此数据采集流程完成,结束。
2.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于所述订阅中的客户端ID指唯一标识客户端的ID;所述主题过滤器指定客户端感兴趣的消息主题,使用通配符进行匹配;所述服务质量QoS级别指定客户端所要求的消息传递服务质量级别。
3.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于所述消息定义包括以下内容:
消息ID:消息ID是唯一标识消息定义的数字标识符;消息ID指定了消息的类型和用途;
消息描述:对消息的描述,即注释;
消息字段:消息中的字段,用于消息编码,每条消息必须至少有一个消息字段,消息字段具有以下属性:
字段类型:类似于Cstruct中的数据类型;是有符号或无符号的8、16、32、64字节大小的整数类型,或是单精度或双精度的浮点类型,或是数组类型;
字段名称:字段的描述名称;
字段单位:某些字段包括单位;字段单位字段是可选的;
枚举类型:对于枚举类型的字段,需要包含枚举类型定义,以便在代码中进行正确的解析和处理;枚举类型用于定义一组常量,用于表示不同采集到的数据特定的状态、模式和参数,枚举类型列举有限的一组可能取值的情况,并用枚举值代表状态、模式和参数的标识符;枚举类型字段是可选的;
描述:对字段进行描述以解释其含义和用途,描述字段是可选的。
4.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于2.1.2步所述T设置为1s;所述会话信息B的内容包括消息代理网络地址和接入状态。
5.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于2.2.2步所述连接请求报文不合法指报文格式错误或缺少必要字段或校验和校验失败;所述会话信息A包含客户端标识符、认证成功信息、接入时间。
6.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于3.1.2步所述T2设置为2s;所述订阅状态分订阅成功和订阅失败2种。
7.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于4.1.1步所述QoS级别共有0、1、2三个等级;QoS 0是最低的QoS等级,为可靠性要求低,实时性要求高的信息分配的QoS等级为0,消息即发即弃,不需要等待确认,不需要存储和重传;QoS1是居中的QoS等级,为可靠性要求居中,实时性要求居中的信息分配的QoS等级为1,为QoS1引入了确认和重传机制,发送方会存储数据发布报文,并等待接收方回复发布确认报文,只有在收到发布确认后,发送方才会删除本地存储的数据发布报文,并且不再需要重传该报文;QoS2是最高的QoS等级,为可靠性要求最高,实时性要求最低的信息分配的QoS等级为2。
8.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于4.1.3步所述频率f设置为1Hz,即每秒进行一轮数据发布。
9.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于4.1.3.2步所述发送者对数据发布报文进行进行QoS1消息发布的方法是:
4.1.3.2.1发送者存储QoS1的数据发布报文;
4.1.3.2.2发送者向接收者发送QoS1的数据发布报文;
4.1.3.2.3发送者等待接收者回复的发布确认报文,若发送者收到接收者响应的发布确认报文,转4.1.3.2.4,若发送者在T2内未接收到发布确认报文,转4.1.3.2.2重新向接收者发送QoS1的数据发布报文;
4.1.3.2.4发送者删除存储的数据发布报文,完成QoS1发布流程。
10.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于4.1.3.3步所述发送者对数据发布报文进行“恰好一次”传输的方法是:
4.1.3.3.1发送者存储QoS2的数据发布报文;
4.1.3.3.2发送者向接收者发送QoS2的数据发布报文;
4.1.3.3.3发送者等待接收者回复发布收到报文,若发送者收到接收者响应的发布收到报文,转4.1.3.3.4,若发送者在T2内未接收到发布收到报文,转4.1.3.3.2,重新发送数据发布报文;
4.1.3.3.4发送者收到发布收到报文,即可确认接收者已经收到数据发布报文,发送方将不再需要重传这个报文,并且也不能再重传这个报文;发布者删除本地存储的数据发布报文,发送者向接收者发送发布释放报文,转步骤4.1.3.3.5;
4.1.3.3.5发送者等待接收者响应的发布完成报文,若发送者收到接收者响应的发布完成报文,即完成QoS2发布流程,结束;若发送者在T2内未接收到发布完成报文,转4.1.3.3.4重新向接收者发送发布释放报文。
11.如权利要求1所述的一种基于消息队列的轻量级数据采集方法,其特征在于4.4.2.3步所述对于整数字段类型采用Varint解码方法进行解压的方法是:
4.4.2.3.1初始化累加结果result为0,初始化位移量shift为0;shift表示当前处理的字节对应的位在结果整数中的位置;
4.4.2.3.2从消息负载中读取一个字节;
4.4.2.3.3解析字节:将当前字节与0x7F进行AND操作,得到当前字节的低7位值;将这个值左移shift位,然后与result进行OR操作,累加到result上;
4.4.2.3.4检查继续位:检查当前字节的最高位e即第8位:
如果最高位为0,表示这是最后一个字节,停止读取过程,解压完毕,当前的result就是最终的整数值;如果最高位为1,表示后面还有字节,需要继续读取,转步骤4.4.2.2.5;
4.4.2.2.5更新位移量:将shift增加7,转步骤4.4.2.3.2。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311807389.6A CN117793172B (en) | 2023-12-26 | Lightweight data acquisition method based on message queue |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311807389.6A CN117793172B (en) | 2023-12-26 | Lightweight data acquisition method based on message queue |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117793172A true CN117793172A (zh) | 2024-03-29 |
CN117793172B CN117793172B (en) | 2024-08-16 |
Family
ID=
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104092767A (zh) * | 2014-07-21 | 2014-10-08 | 北京邮电大学 | 一种增加消息队列模型的发布/订阅***及其工作方法 |
CN113905089A (zh) * | 2021-09-06 | 2022-01-07 | 浪潮软件股份有限公司 | 基于发布订阅模式的多用户消息推送方法及推送*** |
CN116137631A (zh) * | 2021-11-17 | 2023-05-19 | 南京行者易智能交通科技有限公司 | 一种基于发布订阅的轻量级物联网通讯协议 |
US11811884B1 (en) * | 2020-12-11 | 2023-11-07 | Amazon Technologies, Inc. | Topic subscription provisioning for communication protocol |
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104092767A (zh) * | 2014-07-21 | 2014-10-08 | 北京邮电大学 | 一种增加消息队列模型的发布/订阅***及其工作方法 |
US11811884B1 (en) * | 2020-12-11 | 2023-11-07 | Amazon Technologies, Inc. | Topic subscription provisioning for communication protocol |
CN113905089A (zh) * | 2021-09-06 | 2022-01-07 | 浪潮软件股份有限公司 | 基于发布订阅模式的多用户消息推送方法及推送*** |
CN116137631A (zh) * | 2021-11-17 | 2023-05-19 | 南京行者易智能交通科技有限公司 | 一种基于发布订阅的轻量级物联网通讯协议 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6648211B2 (ja) | マルチキャスト通信またはブロードキャスト通信において拡張したファイル配信を行う方法および装置 | |
Yang et al. | {DispersedLedger}:{High-Throughput} byzantine consensus on variable bandwidth networks | |
CN111083161A (zh) | 数据传输的处理方法及装置、物联网设备 | |
US5627829A (en) | Method for reducing unnecessary traffic over a computer network | |
Houimli et al. | Formal specification, verification and evaluation of the MQTT protocol in the Internet of Things | |
CN112685248B (zh) | 智能网卡监控日志获取方法、装置、电子设备及存储介质 | |
CN112822276B (zh) | 一种变电站站控层通信方法、***、电子设备及存储介质 | |
CN109451032B (zh) | 一种消息传递*** | |
CN101447856A (zh) | 一种大容量文件传输方法 | |
EP1949642B1 (en) | Arrangement and method relating to messageing | |
CN101814971A (zh) | 一种手机文件传输方法 | |
US11023412B2 (en) | RDMA data sending and receiving methods, electronic device, and readable storage medium | |
CN111111214B (zh) | 一种游戏存档的处理方法、装置及*** | |
CN105791399B (zh) | 多中继互联网大数据推送方法和*** | |
CN109217983B (zh) | 一种工业物联网的作业终端通信协议设计方法 | |
CN108306852A (zh) | 一种基于简单二进制编码的消息中间件***和方法 | |
CN117615043B (zh) | 一种边缘网关上服务间通信方法及*** | |
CN117793172A (zh) | 一种基于消息队列的轻量级数据采集方法 | |
CN104994074B (zh) | 一种健康体检机通信服务器的实现方法 | |
CN107943541B (zh) | 一种Windows本地组件的通讯方法 | |
CN109298866A (zh) | 基于c语言的tlv格式协议快速解析方法 | |
CN1980131A (zh) | 邮件拦截的方法及实现该方法的模块 | |
CN100375464C (zh) | 网络互连时各终端的数据通信方法 | |
CN114978427B (zh) | 数据处理方法、装置、程序产品、计算机设备和介质 | |
CN114338797B (zh) | 适于多版本时序数据传输和重放的***及方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |